
三次握手:
第一次握手: 客户端给服务器发送一个 SYN 报文。
第二次握手: 服务器收到 SYN 报文之后,会应答一个 SYN+ACK 报文。
第三次握手: 客户端收到 SYN+ACK 报文之后,会回应一个 ACK 报文。
四次挥手:
第一次挥手: 主机1(可以使客户端,也可以是服务器端),向主机2发送一个FIN报文段;
(主机1进入FIN_WAIT_1状态)
第二次挥手: 主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段;
(主机1进入FIN_WAIT_2状态,主机2进入CLOSE_WAIT状态)
第三次挥手: 主机2向主机1发送FIN报文段,请求关闭连接;
(主机2进入LAST_ACK状态)
第四次挥手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段;
(主机1进入TIME_WAIT状态)
主机2收到主机1的ACK报文段以后,就关闭连接;
此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,这时主机1也可以关闭连接了。
为什么建立连接只用三次握手,而断开连接却要四次挥手?
首先,当客户端数据已发送完毕,且知道服务端也全部接收到了时,就会去断开连接即
向服务端发送FIN
服务端接收到客户端的FIN,为了表示接收到了,就会向客户端发送ACK
但此时,服务端可能还在发送数据,并没有关闭TCP窗口的意思,所以服务端的FIN和ACK并不是同步发的,只有当数据发送完了,才会发送FIN
- 答:服务端的FIN和ACK需要分开发,并不是像三次握手中那样,SYN可以和ACK同步发,所以就需要四次挥手
在四次挥手中,客户端为什么在TIME_WAIT后必须等待2MSL时间呢?
这个ACK报文段有可能丢失,因而使处在LAST_ACK端的服务端收不到对已发送的FIN报文段的ACK报文段,从而服务端会去不断重传FIN报文段。
而客户端就能在2MSL时间内收到重传的FIN报文段。接着客户端重传一次确认,重新启动2MSL计时器。直至服务端收到后,客户端和服务端就都会进入CLOSED状态,关闭TCP连接。
而如果客户端不等待2MSL时间,而是在发送完ACK确认后立即释放资源,关闭连接,那么就无法收到服务端重传的FIN报文段,因而也不会再发送一次ACK确认报文段,这样,服务端就无法正常进入CLOSED状态,资源就一直无法释放了。
- 答:为了保证客户端发送的最后一个ACK报文段能够到达服务端。
本文详细解析了TCP连接的三次握手过程和断开连接的四次挥手过程,解释了为什么建立连接只需三次握手,而断开连接却需四次挥手的原因,以及在四次挥手中客户端为何在TIME_WAIT后必须等待2MSL时间。


被折叠的 条评论
为什么被折叠?



