tcp状态转移

来源:互联网 发布:如何成为黑客 知乎 编辑:程序博客网 时间:2024/06/08 07:45

TCP状态转移图

一个正常连接和断开过程客户端和服务器端的状态转移如下:

其中TIME_WAIT 状态是在服务端发送FIN,客户回复ACK后,客户端需要等待2MSL时间(报文最大生存时间):
1. 此时若是客户端回复的ACK因为网络的原因,服务端没有收到,服务端要重发FIN,客户端此时处于TIME_WAIT状态,可以继续发送ACK。 总体来说TIME_WAIT状态时为了保证最后一个ACK因丢失,而等待重发的时间。
2. 保证残留网络报不会被新连接接收而产生数据错乱。由于自己上一次发送的数据包可能还残留在网络中,等待2MSL时间可以保证所有残留的网络报在自己关闭前都已经超时。

服务器也是可以主动关闭的,状态会与上图刚好相反。

各中间报文发送失败

  1. 第一次握手失败,等待一定时间重新发送。
  2. TCP第三次握手失败(包含第二次)
    第二个syn报文发送失败或第三个ack失败,服务器过段时间没收到ack,会重传syn+ack,客户端收到后再发ack。另一种方式为:当失败时服务器并不会重传ack报文,而是直接发送RST报文段,进入CLOSED状态。这样做的目的是为了防止SYN洪泛攻击。
  3. 前3次挥手失败
    主动关闭方发送的FIN,被动发送端发送的FIN和ACK,只要其中有一个发送失败,主动方都会在一定时间内(60s)直接进入CLOSED状态。如果是第二个或第三个失败,被动方是处于LAST_ACK状态的,一定时间内再次发送FIN,如果顺利会正常关闭,否则被动方也会在一定时间内关闭。
  4. 第四次挥手失败
    假如这个时候,主动方还是处于TIME_WAIT状态(也就是TIME_WAIT持续的时间在2MSL内),主动方收到这个FIN包后向被动方发送了一个ACK包,被动方收到这个ACK包之后进入CLOSD状态。
    假如这个时候,主动方已经从TIME_WAIT状态变成了CLOSED状态 ,收到这个FIN包后,认为这是一个错误的连接,向被动方发送一个RST包,当被动方收到这个RST包,进入CLOSED状态。

tcp关闭状态详解
TCP连接的状态详解以及故障排查

原创粉丝点击