一些操作系统,如 windows,会将从建立TCP连接,发送,接收数据,到关闭TCP连接这个过程分为几个状态表示,例如,我们在 cmd 命令提示符下键入 netstat -a ,屏幕输出的右边就包含了每个TCP连接的当前状态。这里对每个状态的含义进行说明。网管人员熟悉掌握了每个状态代表的意义后,对于 windows 的 netstat -a* 系列命令的输出,又会有更深一层的认识。

可以从下面的简易TCP状态机转换图看出,从 close 到 estiblshed 的过程,实际上就是著名的TCP三次握手。


close:本地和远程均关闭。

open_wait1:本地已请求并等待远程在打开前发送打开确认(ACK)。(本地关闭,请求远程打开)【SYN】

↓  

open_wait2:本地已收到远程发送的打开确认,并等待远程请求本地打开。(远程打开,请求本地打开)【SYN+ACK】

estiblshed:本地已收到远程的打开请求,在本地打开的同时,连接建立(本地打开,远程打开,建立连接成功)【ACK】

close_wait1:本地已请求并等待远程在关闭前发送关闭确认。

close_wait2:本地已收到远程发送的关闭确认,并等待远程请求本地关闭。

closed:本地已收到远程的关闭请求,在本地关闭的同时,连接拆除。(回到本地和远程均关闭状态)



标准的TCP有限状态机(非 windows 实现)连接关闭部分 详解(这里仅涉及客户端的TCP有限状态机)


【正常的TCP三次握手终止连接】


   当客户端传输层(TCP)从应用层进程收到关闭命令时,向服务器传输层发送 FIN 请求,同时客户端传输层进入 FIN-WAIT-1 状态,表示已(发送)请求对方关闭连接(从服务器到客户端的),并等待确认。

   ↓

   客户端传输层收到来自服务器的 FIN+ACK 确认,客户端就知道服务器同意关闭连接(从服务器到客户端的),并且服务器请求关闭连接(从客户端到服务器的)

   ↓

   客户端传输层发送 ACK 确认,表示客户端同意关闭连接(从客户端到服务器的),同时客户端传输层从 FIN-WAIT-1 状态转变为 TIME-WAIT 状态。注意,该状态意味着:TCP连接的双方都同意关闭连接,但还没有实际关闭;以客户端而言,进入 TIME-WAIT 状态后,将启动一个 2MSL 计时器,表示客户端会在一个 TCP 分段的2倍最大生存时间后,关闭连接(状态机转变为 CLOSED 状态)。



【TCP半关闭】


   客户端传输层在 FIN-WAIT-1 状态下,如果收到来自服务器的 ACK 确认(注意,不是 FIN+ACK),则客户端不发送任何带有标志位的确认,并且客户端进入 FIN-WAIT-2 状态,该状态意味着连接已半关闭

FIN-WAIT-2 状态亦即半关闭状态。在此状态下,仅能从服务器向客户端传输数据。也就是说,关闭的是从客户端到服务器的逻辑连接通道;从服务器到客户端的通道仍旧维持打开,所以称为半关闭。

   ↓

   客户端再次收到来自服务器的 FIN 请求,客户端传输层回送 ACK 确认,同时进入 TIME-WAIT 状态,此后的处理流程与状态转换,就与正常的三次握手终止连接一样了。(等待 2MSL 超时后,关闭连接)



可以看出,是否执行半关闭由服务器端决定:当它希望完全关闭时,它发送带有 FIN+ACK 标志位的TCP 分段给客户端;当它还有数据要传输给客户端时,它发送带有 ACK 标志位的 TCP 分段给客户端,指示客户端暂时还不要关闭自己的连接。






坐拥IT高薪职位必备底层知识系列——TCP有限状态机的实现_第1张图片


坐拥IT高薪职位必备底层知识系列——TCP有限状态机的实现_第2张图片


坐拥IT高薪职位必备底层知识系列——TCP有限状态机的实现_第3张图片


坐拥IT高薪职位必备底层知识系列——TCP有限状态机的实现_第4张图片


坐拥IT高薪职位必备底层知识系列——TCP有限状态机的实现_第5张图片


坐拥IT高薪职位必备底层知识系列——TCP有限状态机的实现_第6张图片