交换机、路由器、服务器组网

1. 通信过程(pc+switch+router+server)

较为复杂的通信过程如:访问 www.baidu.com

注意:一定要配置

  • PC:IP、NETMASK、DFGATEWAY、DNS
  • ROUTER:IP、NETMASK、路由表

总结

  • DNS服务器用来解析出IP(类似电话簿)
  • DFGATEWAY(默认网关)用来对顶,当发送的数据包的目的ip不是当前网络时,此数据包包转发的目的ip
  • 在路由器中路由表指定数据包的”下一跳”的地址

tcp三次握手

tcp四次挥手

tcp十种状态

注意:

  • 当一端收到一个FIN,内核让read返回0来通知应用层另一端已经终止了向本端的数据传送
  • 发送FIN通常是应用层对socket进行关闭的结果

tcp的2MSL问题

说明

2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,

当TCP的一端发起主动关闭,在发出最后一个ACK包后,

即第3次握 手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,

必须在此状态上停留两倍的MSL时间,

等待2MSL时间主要目的是怕最后一个 ACK包对方没收到,

那么对方在超时后将重发第三次握手的FIN包,

主动关闭端接到重发的FIN包后可以再发一个ACK应答包。

在TIME_WAIT状态 时两端的端口不能使用,要等到2MSL时间结束才可继续使用。

当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。

不过在实际应用中可以通过设置 SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。

tcp长连接和短连接

TCP在真正的读写操作之前,server与client之间必须建立一个连接,

当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,

连接的建立通过三次握手,释放则需要四次握手,

所以说每个连接的建立都是需要资源消耗和时间消耗的。

TCP通信的整个过程,如下图:

1. TCP短连接

模拟一种TCP短连接的情况:

  1. client 向 server 发起连接请求
  2. server 接到请求,双方建立连接
  3. client 向 server 发送消息
  4. server 回应 client
  5. 一次读写完成,此时双方任何一个都可以发起 close 操作

在第 步骤5中,一般都是 client 先发起 close 操作。当然也不排除有特殊的情况。

从上面的描述看,短连接一般只会在 client/server 间传递一次读写操作!

2. TCP长连接

再模拟一种长连接的情况:

  1. client 向 server 发起连接
  2. server 接到请求,双方建立连接
  3. client 向 server 发送消息
  4. server 回应 client
  5. 一次读写完成,连接不关闭
  6. 后续读写操作...
  7. 长时间操作之后client发起关闭请求

3. TCP长/短连接操作过程

3.1 短连接的操作步骤是:

建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接

3.2 长连接的操作步骤是:

建立连接——数据传输...(保持连接)...数据传输——关闭连接

4. TCP长/短连接的优点和缺点

  • 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。

    对于频繁请求资源的客户来说,较适用长连接。

  • client与server之间的连接如果一直不关闭的话,会存在一个问题,

    随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,

    如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致server端服务受损;

    如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,

    这样可以完全避免某个蛋疼的客户端连累后端服务。

  • 短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。
  • 但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

5. TCP长/短连接的应用场景

  • 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。

    每个TCP连接都需要三次握手,这需要时间,如果每个操作都是先连接,

    再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,

    再次处理时直接发送数据包就OK了,不用建立TCP连接。

    例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,

    而且频繁的socket 创建也是对资源的浪费。

  • 而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,

    而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,

    如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,

    那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

listen的队列长度

服务器端运行

#coding=utf-8
from socket import *
from time import sleep # 创建socket
tcpSerSocket = socket(AF_INET, SOCK_STREAM) # 绑定本地信息
address = ('', 7788)
tcpSerSocket.bind(address) connNum = int(raw_input("请输入要最大的链接数:")) # 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
tcpSerSocket.listen(connNum) while True: # 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务器
newSocket, clientAddr = tcpSerSocket.accept()
print clientAddr
sleep(1)

客户端运行

#coding=utf-8
from socket import * connNum = raw_input("请输入要链接服务器的次数:")
for i in range(int(connNum)):
s = socket(AF_INET, SOCK_STREAM)
s.connect(("192.168.1.102", 7788))
print(i)

总结

  • listen中的black表示已经建立链接和半链接的总数
  • 如果当前已建立链接数和半链接数以达到设定值,那么新客户端就不会connect成功,而是等待服务器

手动配置ip

1. 设置IP和掩码

ifconfig eth0 192.168.5.40 netmask 255.255.255.0

2. 设置网关

route add default gw 192.168.5.1

网络通信和TCP详解的更多相关文章

  1. 转载:tcp详解

    TCP详解 转自:http://www.cnblogs.com/kzloser/articles/2582957.html 首部格式 图释: 各个段位说明: 源端口和目的端口: 各占 2 字节.端口是 ...

  2. java网络编程(TCP详解)

    网络编程详解-TCP 一,TCP协议的特点              面向连接的协议(有发送端就一定要有接收端)    通过三次连接握手建立连接 通过四次握手断开连接 基于IO流传输数据 传输数据大小 ...

  3. 【TCP/IP】TCP详解笔记

    目录 前言 17. TCP 传输控制协议 17.1 引言 17.2 TCP 服务 17.3 TCP的首部 18. TCP连接的建立与终止 18.1 引言 18.2 连接的建立与终止 18.2.1 建立 ...

  4. Linux系统编程(31)—— socket编程之TCP详解

    TCP有源端口号和目的端口号,通讯的双方由IP地址和端口号标识.32位序号.32位确认序号.窗口大小稍后详细解释.4位首部长度和IP协议头类似,表示TCP协议头的长度,以4字节为单位,因此TCP协议头 ...

  5. TCP详解

    1. 数据进入协议栈的封装过程 2. TCP连接的三次握手 3. TCP连接的三次握手和关闭时的四次握手 各个状态的意义如下: LISTEN - 侦听来自远方TCP端口的连接请求: SYN-SENT ...

  6. TCP/IP笔记(七)TCP详解

    TCP的特点及其目的 为了通过数据包实现可靠性传输,需要考虑很多事情,例如数据的破坏.丢包.重复记忆分片顺序混乱等问题.如不能解决这些问题,也就无从谈起可靠传输. TCP通过检验和.序列号.确认应答. ...

  7. TCP 详解

    计算机网络中比较中要的无非就是 TCP/IP 协议栈,以及应用层的 HTTP 和 HTTPS . 前几天一直炒的的比较火的就是 HTTP/2.0 了,但是其实 HTTP/2.0 早在2015年的时候就 ...

  8. TCP详解——连接建立与断开

    一.报文结构介绍 在开始讲TCP连接过程时,还是先看看TCP报文的格式如图1所示.IP数据报此时由IP头部+TCP头部+TCP数据组成.不带选项的TCP头部是20字节长,而带选项的,TCP头部最长可达 ...

  9. TCP详解——传输控制协议(总述)

    初次熟读TCP,随着TCP的发展路线对他深入了解,真心觉得TCP协议的美妙之处.他比UDP这家伙更加可靠,深得我们信任.通过一个个英文简写,例如CRC.ARQ.RTT.ACK.SACK.DACK等,组 ...

随机推荐

  1. git关于 LF 与 CRLF

    问题描述: 今天在idea上配置好了git操作到push,目测都没遇到什么问题. 但是再次点击提交按钮的时候,仍然提示我所有的文件都是需要提交的(我的主题中蓝色显示) 然而本地并无改动,在提交窗口得到 ...

  2. python批量给云主机配置安全组

    python批量给云主机配置安全组 用公有云的思路去思考去实现一个安全稳定.可伸缩和经济的业务构架,云运维是有别与传统运维的,比如说了解公有云的都知道安全组的概念,安全组跟防火墙功能很相似,那我的机器 ...

  3. Java 调用 PHP 实例(五)

    java代码: package test; import java.io.BufferedReader; import java.io.File; import java.io.IOException ...

  4. Spring MVC中使用Swagger生成API文档和完整项目示例Demo,swagger-server-api(二十)

    一:Swagger介绍 Swagger是当前最好用的Restful API文档生成的开源项目,通过swagger-spring项目 实现了与SpingMVC框架的无缝集成功能,方便生成spring r ...

  5. android adapter的性能小结

    一般adapter的做法会重写getView方法 比如 @Override public View getView(int position, View convertView, ViewGroup ...

  6. 【LeetCode 225_数据结构_栈_实现】Implement Stack using Queues

    class Stack { public: // Push element x onto stack. void push(int x) { int len = nums.size(); nums.p ...

  7. MySql查询生日的两种方式

    需要是要查询日期段内过生日的会员,分为两种情况: 1. 不跨年 例如: 查询2017-01-01到2017-01-20之间过生日的会员  (假定今天是2017-01-01则这种也可以描述为20天内过生 ...

  8. vue.js 源代码学习笔记 ----- html-parse.js

    /** * Not type-checking this file because it's mostly vendor code. */ /*! * HTML Parser By John Resi ...

  9. Unable to connect to any of the specified MySQL hosts.

    c#连接Mysql数据建立连接时提示:Unable to connect to any of the specified MySQL hosts. 出现此错误的原因是Server(数据库服务器IP地址 ...

  10. 《DSP using MATLAB》Problem 3.1

    先写DTFT子函数: function [X] = dtft(x, n, w) %% --------------------------------------------------------- ...