SOCKET 端口状态变迁分析

端口的主要状态有如下几种:

CLOSED, LISTENING,

SYN_SENT, SYN_RCVD,

ESTABLISHED,

FIN_WAIT1, FIN_WAIT2, TIME_WAIT,

CLOSE_WAIT, LAST_ACK

状态变迁关系如下图:

图1

SOCKET 端口状态变迁分析_第1张图片

关于TIME_WAIT的说明:

在TCP连接断开时,主动断开的一方在发送最后一个ACK后,就进入了TIME_WAIT状态,这个状态一般持续2MSL的时间。(MSL是max segment lifetime的缩写,2MSL一般为2分钟)

 

疑问:Server主动断开连接后,Server端并不会进入TIME_WAIT状态,为何?

 

关于这个TIME_WAIT存在的理由如下:
1. 因为在第四步的时候,HOST1发送的ACK可能丢失并导致HOST2重新发送FIN消息,TIME_WAIT维护连接状态.如果执行主动关闭的一方HOST1 不进入到TIME_WAIT状态就关闭连接那会发生什么呢?当重传的FIN消息到达 时,因为TCP已经不再有连接的信息了,所以就用RST(重新启动)消息应答,导致HOST2进入错误的状态而不是有序终止状态,如果发送最后ACK消息的一方处于TIME_WAIT状态并仍然记录着连接的信息,它就可以正确的响应对等方HOST2的FIN消息了.
2. TIME_WAIT为连接中”离群的段”提供从网络中消失的时间.
考虑一下,如果延迟或者重传段在连接关闭后到达时会发生什么呢?通常情况下,因为TCP仅仅丢弃该数据并响应RST消息,所以这不会造成任何问题。当RST消息到达发出延时段的主机时,因为该主机也没有记录连接的任何信息,所以它也丢弃该段。然而,如果两个相同主机之间又建立了一个具有相同端口号的新连接,那么离群的段就可能被看成是新连接的,如果离群的段中数据的任何序列号恰恰在新连接的当前接收窗口中,数据就会被重新接收,其结果就是破坏新连接。

你可能感兴趣的:(tcp,网络,socket,server)