我所理解的三次握手与四次挥手


这篇文章不讲三次握手、四次挥手的细节,因为满大街都有相关的文章了。

为什么是三次握手?

握手的目的是相互建立连接,确保对方有通信能力(严谨点,还有其他功能的,比如发送各自的接收窗口大小)。

如何确保对方有通信能力? 确定对方不要"答非所问"。

  • 客户端要确认服务端是个“正常端”:客户端说"X",服务端就得回复"X+1".
  • 服务端要确认客户端是个“正常端”:服务端说"Y",客户端就得回复"Y+1"。

这样就够了!再多一次就是累赘,白白增加无用的额外开销。

为什么是四次挥手?

挥手的目的是相互断开连接,各自表达各自不再发送数据了。
那什么时候该挥手了呢?首先得有一个主动端提出"我不发送数据给你了"。因此,有了以下对话。

  • 主动端:我不发送数据给你了。
  • 被动端:OK。
  • (被动端:等我把还未说完的话说完。巴拉巴拉。。。。)
  • 被动端:我也不发送数据给你了。
  • 主动端:OK。

这儿有个疑问是:为什么挥手的时候,对方需要回复确认呢?目前的理解是:由于释放连接过程中,各端都有一个状态(主动端有FIN-WAIT-1/FIN-WAIT-2/TIME-WAIT状态,被动端有CLOSE-WAIT/LAST-ACK状态),需要对方回复"OK"是为了更新自己的状态(此时序列号不再是为了确保对方的通信能力了),从而最终达到CLOSE的状态。

其实,我觉得挥手过程的这2个"OK"可以省略,并不会影响关闭连接。

  • 在发送"自己不再发送数据"后,关闭自己的发送端。
  • 在收到"对方不再发送数据"后,关闭自己的接收端。
  • 当自己发送端和接收端都关闭的时候,自然进入CLOSE状态。
  • 当然为了确保网络中不再有滞留的报文段,也可以主动进行2个时间周期的延迟再进入CLOSE状态。

这一段希望各位大佬发表自己的看法,仅仅是我个人的观点。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章