HTTP协议通信原理( 二 )


假设 Client 端发起中断连接请求,也就是发送 FIN 报文 。Server 端接到 FIN 报文后,意思是说"我 Client 端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据 。所以你先发送 ACK,"告诉 Client 端,你的请求我收到了,但是我还没准备好,请继续你等我的消息" 。这个时候 Client 端就进入 FIN_WAIT 状态,继续等待Server 端的 FIN 报文 。当 Server 端确定数据已发送完成,则向 Client 端发送 FIN 报文,"告诉 Client 端,好了,我这边数据发完了,准备好关闭连接了" 。Client 端收到 FIN 报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕 Server 端不知道要关闭,所以发送 ACK 后进入 TIME_WAIT 状态,如果 Server 端没有收到 ACK 则可以重传 。“,Server 端收到 ACK 后,"就知道可以断开连接了" 。Client 端等待了 2MSL 后依然没有收到回复,则证明 Server 端已正常关闭,那好,我 Client 端也可以关闭连接了 。Ok,TCP 连接就这样关闭了!
【问题 1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:三次握手是因为因为当 Server 端收到 Client 端的 SYN 连接请求报文后,可以直接发送SYN+ACK 报文 。其中 ACK 报文是用来应答的,SYN 报文是用来同步的 。但是关闭连接时,当 Server 端收到 FIN 报文时,很可能并不会立即关闭 SOCKET(因为可能还有消息没处理完),所以只能先回复一个 ACK 报文,告诉 Client 端,"你发的 FIN 报文我收到了" 。只有等到我 Server 端所有的报文都发送完了,我才能发送 FIN 报文,因此不能一起发送 。故需要四步握手 。

【HTTP协议通信原理】


推荐阅读