详解TCP状态转移图

这里写图片描述

TCP连接是面向连接,可靠的数据流服务。根据TCP状态转移过程图,可进行一步一步分析。
一般而言,TCP连接是由客户端发起,并通过三次握手建立连接(特殊情况是所谓同时打开)的。
TCP关闭过程相对复杂一些,可能是客户端执行主动关闭;也可能是服务器执行主动关闭,比如服务器程序被中断而强制关闭连接;还可能是同时关闭(比较少见)。

首先我们来看一下TCP连接的连接和关闭。

这里写图片描述

三次握手:

(1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。

(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。

(3) 客户必须再次回应服务段一个ACK报文,这是报文段3。

客户端通过connect系统调用主动与服务器建立连接。connect系统调用首先给服务器发送一个同步报文段,使连接转移到SYN_SENT状态。此后,connect系统调用可能因为如下两个原因失败返回:

  • 如果connect连接的目标端口不存在,或者该端口仍被处于TIME_WAIT状态的连接占用,则服务器将给客户端发送一个复位报文段,connect调用失败。
  • 如果目标端口存在,但connect在超时时间内未收到服务器的确认报文段,则connect调用失败。

四次挥手:

TCP连接是全双工通信,因此每个方向需要单独关闭。

  1. FIN_WAIT_1:第一次挥手。主动关闭的一方(执行主动关闭的一方既可以是客户端,也可以是服务器端,这里以客户端执行主动关闭为例),终止连接时,发送FIN 给对方,然后等待对方返回 ACK 。调用 close() 第一次挥手就进入此状态。
  2. CLOSE_WAIT:接收到FIN之后,被动关闭的一方进入此状态。具体动作是接收到 FIN,同时发送 ACK。之所以叫 CLOSE_WAIT可以理解为被动关闭的一方此时正在等待上层应用程序发出关闭连接指令。
  3. FIN_WAIT_2:主动端(这里是客户端)先执行主动关闭发送FIN,然后接收到被动方返回的 ACK 后进入此状态。
  4. LAST_ACK:被动方(服务器端)发起关闭请求,由状态2 进入此状态,具体动作是发送 FIN给对方,同时在接收到ACK时进入CLOSED状态。
  5. CLOSING:两边同时发起关闭请求时(即主动方发送FIN,等待被动方返回ACK,同时被动方也发送了FIN,主动方接收到了FIN之后,发送ACK给被动方),主动方会由FIN_WAIT_1
    进入此状态,等待被动方返回ACK。
  6. TIME_WAIT:从状态变迁图会看到,四次挥手操作最后都会经过这样一个状态然后进入CLOSED状态。共有三个状态会进入该状态

  • 由CLOSING进入:同时发起关闭情况下,当主动端接收到ACK后,进入此状态,实际上这里的同时是这样的情况:客户端发起关闭请求,发送FIN之后等待服务器端回应ACK,但此时服务器端同时也发起关闭请求,也发送了FIN,并且被客户端先于ACK接收到。
  • 由FIN_WAIT_1进入:发起关闭后,发送了FIN,等待ACK的时候,正好被动方(服务器端)也发起关闭请求,发送了FIN,这时客户端接收到了先前ACK,也收到了对方的FIN,然后发送ACK(对对方FIN的回应),与CLOSING进入的状态不同的是接收到FIN和ACK的先后顺序。
  • 由FIN_WAIT_2进入:这是不同时的情况,主动方在完成自身发起的主动关闭请求后,接收到了对方发送过来的FIN,然后回应 ACK。

半关闭状态:

(TCP通信是半双工的)通信的一端可以发送结束报文段给对方,告诉它本端已经完成数据的发送,但允许继续接收来自对方的数据,知道对方发送结束报文段以关闭连接。
这里写图片描述

服务器和客户端判断对方是否关闭连接的方法是:read系统调用返回0(收到结束报文段)

TIME_WAIT状态

存在意义:

  • 可靠地终止TCP连接。
  • 保证让迟来的TCP报文段有足够的时间被识别并丢弃。

TIME_WAIT状态要持续2MSL时间的原因:

因为TCP报文段的最大生存时间是MSL,所以坚持2MSL时间能过确保网络上两个传输方向上尚未被接收
到的,迟到的TCP报文段被中专路由器丢弃。

TIME_WAIT和CLOSE_WAIT区别:

  • CLOSE_WAIT是被动关闭的一端在接收到对端关闭请求(FIN报文段)并且将ACK发送出去后所处的状态,这种状态表示:收到了对端关闭的请求,但是本端还没有完成工作,还未关闭。

  • TIME_WAIT状态是主动关闭的一端在本端已经关闭的前期下,收到对端的关闭请求(FIN报文段)并且将ACK发送出去后所处的状态,这种状态表示:双方都已经完成工作,只是为了确保迟来的数据报能被是被并丢弃,可靠的终止TCP连接。

  • -

同时打开——”四次握手“

客户端和服务器同时互发请求SYN,回复ACK确认报文段。
这里写图片描述

同时关闭——“三次挥手”

服务器回复ACK和确认FIN同时发送,客户端刚好没其他事务处理。
这里写图片描述

参考资料:《Linux高性能服务器编程》
博客:http://blog.csdn.net/wenqian1991/article/details/40110703

猜你喜欢

转载自blog.csdn.net/hhhanpan/article/details/79388945
今日推荐