一. TCP状态转换

我们知道TCP通过三次握手建立连接,通过四次挥手断开连接。在这个过程中,每一步
都有可能因为网络的波动而失败。所以TCP里面加入了对应的机制来处理异常状况

TCP连接可能出现11种状态

二. TIME_WAIT

假定TCP连接的两端分别为h1,h2。当h1主动关闭时:

  1. 进行四次挥手,h1发出FIN,h2响应发出ACK后进入CLOSE_WAIT,h2应用关闭连接发出FIN,h1响应发出ACK进入TIME_WAIT状态。
  2. 处于TIME_WAIT状态时h1保持该TCP连接在一段时间内 {大概两倍MSL(maximum segment lifetime 最大分节生命:任何IP数据报在Internet中存在的最长时间)}不可用。等待完成后关闭连接。

设想如果出现下面两种情况

第一种: h1发出的ACK在网络中丢失

h2收不到h1发出的ACK,将重发FIN

  1. 若不存在TIME_WAIT状态,h1发出ACK后立马关闭连接,h2重发的FIN到达h1主机后应为对应连接已经不存在了,发出RST,导致h2端异常响应。

所以TIME_WAIT可以保证全双工的TCP连接正常终止

第二种: 通信过程中出现的漫游重复分组

在通信过程中,h1向h2发送了一个数据包。如果这个数据包在网路中遇到了如路由器故障或链路故障,则会进入长时间重新选路,也有可能发生路由循环(A路由器发到B,B又发回给A),h1会向h2进行相应数据包的重传。不久后,路由修复完成,最初迷失的分组也可能会到达h2。

  1. 若不存在TIME_WAIT状态,h1发送ACK后立马关闭连接。过一段时间后h1和h2通过相同的ip和port建立新的连接。 此时久连接的迷失分组到达h2,h2会以为该分组是h1刚发过来的。 导致错误
  2. 若存在TIME_WAIT状态,h1在发送ACK后处于该状态2MSL。可以保证在迷失分组超时(最长存活MSL)丢弃之前h1和h2不会用相同的ip和port重新建立tcp连接。

所以 TIME_WAIT 的存在保证了网络中迷失的数据包正常过期。

posted on 2021-03-17 10:55  一只特立独行的羊  阅读(261)  评论(0)    收藏  举报