TCP连接十一种状态

TCP连接的状态转换过程

TCP连接十一种状态

包括了三次握手建立连接和四次挥手断开连接的过程

closed:起始点,tcp连接 超时或关闭时进入此状态
listen:服务端等待连接时的状态,调用Socket、bind、listen函数就能进入此状 态,称为被动打开
SYN-sent:客户端发起连接,发送SYN给服务端,若不能连接进入closed
SYN-rcvd:服务端接受客户端的SYN,由listen进入SYN-rcvd。同时返回一个ACK,并发送一个SYN给服务端。
特殊情况:客户端发起SYN的同时接收到服务端的SYN,客户端会由SYN-sent转为SYN-rcvd状态
established:可以传输数据的状态

FIN-wait1:主动关闭连接,发送FIN,由established转为此状态
FIN-wait2:主动关闭连接,接收到对方的FIN+ACK,由FIN-wait1转为此状态
close-wait:收到FIN,发送ACK,被动关闭的一方关闭连接进入此状态
last-ACK:发送FIN,同时在接受ACK时,由close-wait进入此状态。被关闭的一方发起关闭请求
closing:两边同时发送关闭请求,由FIN-wait1进入此状态,收到FIN请求,同时响应一个ACK
time-wait:

FIN-wait2到此状态:双方不同时发送FIN的情况下,主动关闭的一方在完成自己的请求后,收到对方的FIN后的状态

closeing到此状态:双方同时发起关闭,都发送了FIN,同时接受FIN并发送ACK后的状态

FIN-wait1到此状态:对方发来的FIN的ACK同时到达后的状态,与上一条的区别是本身发送的FIN回应的ACK先于对方的FIN到达,而上一条是FIN先到达

客户端独有的:SYN_SENT 、FIN_WAIT1 、FIN_WAIT2 、CLOSING 、TIME_WAIT 。
服务器独有的:LISTEN、SYN_RCVD 、CLOSE_WAIT、LAST_ACK 。
共有的:CLOSED、ESTABLISHED 。

TCP报头

TCP连接十一种状态
一位=1bit,8bit=1Byte(字节)
源端口和目的端口:各占16位,2的16次方等于65536
32 位序号:也称为顺序号(Sequence Number),简写为SEQ,
32 位确认序号:也称为应答号(Acknowledgment Number),简写为ACK。在握手阶段,确认序号将发送方的序号加1作为回答。
4 位数据偏移/首部长度:由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值
保留:为将来定义新的用途保留,现在一般置0。
6 位标志字段

  • URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。
  • ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。
  • PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
  • RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
  • SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。
  • FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。

窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口数据长度为16bit,因而窗口大小最大为65535。理论上最优大小为:网络带宽(b/s)*RTT(s)
校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。
紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
选项和填充:通常为空,最常见的可选字段是最长报文大小,用于发送方与接收方协商最大报文段长度(MSS),或在高速网络环境下作窗口调节因子时使用。首部字段还定义了一个时间戳选项。最常见的可选字段是最长报文大小,又称为MSS (Maximum Segment Size)。每个连接方通常都在握手的第一步中指明这个选项。它指明本端所能接收的最大长度的报文段,选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。1460是以太网默认的大小。
数据部分: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。