除了上图中连接的状态外还可能出现如下状态:
CLOSING:TCP连接断开过程中,主动关闭端发送FIN包后,没有收到对应的ACK包,缺收到了对方的FIN包,此时进入CLOSING状态。
★ 为什么建立TCP连接时三次数据包,而断开连接时四次?
client发送FIN包给server,server只要收到,就会响应一个ACK包表示自己已经收到了FIN,但是此时server给client的数据可能还没有传完,client就会保持在FIN_WAIT_2状态,继续接收response。
等到server数据全部传完,才会发FIN给client。client收到server发来的FIN,知道server的数据发完了,回复ACK,此时client会设置一个计时器,保持TIME_WAIT状态等到2MSL,如果没有收到server传来的任何消息,就会关闭连接。(为什么要等到2MSL?因为client最会发的ACK也可能会丢失,server如果没收到ACK,将会不断重复发送FIN片段。所以连接不能立刻关闭,以保证server端也能正常关闭)
★MSL是指一个片段(数据包)在网络中的最大存活时间。