TCP三次握手与四次挥手
三次握手(建立连接):
1、client: SYN
2、server: SYN+ACK
3、client: ACK
四次挥手(断开连接):
中断连接端可以是Client端,也可以是Server端。
假设中断连接的是client端:
1、client: FIN;
2、server:ACK;(确认收到关闭的要求;考虑如果server还有数据没发完,会让client等着,client端就进入FIN_WAIT状态);
3、server:FIN;(发完数据后,告知client可以关闭了);
4、client: ACK;(确认关闭,client进入TIME_WAIT状态,Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!)
【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
(主动关闭的一方在发送完对对方FIN报文的确认(ACK)报文后,会进入TIME_WAIT状态。TIME_WAIT状态也称为2MSL状态。什么是2MSL?MSL即Maximum Segment Lifetime,也就是报文最大生存时间,引用