TCP三次握手与四次挥手

最后一次更新时间:Saturday, August 22nd 2020, AM

 

三次握手

先看一下我的笔记吧。

方框内表示的是Client/Server端的状态;中间连线表示数据包内的内容。

三次握手中,“三次”的含义是建立TCP连接的过程中,一共有三个数据包。通过对三个数据包的合理使用,即可在C/S之间建立起可靠的数据传输通道。

如果要确认在C/S间建立起可靠连接,需要确认以下四点:

  1. Client端 发送功能正常
  2. Client端 接收功能正常
  3. Server端 发送功能正常
  4. Server端 接收功能正常

经过历史的淘汰,技术人员的精简,最后呈现在我们面前的就是这三个短小精悍的数据包。也就是说,三次握手的三个数据包,通过精妙的安排,分别证明了上述的四个功能,这三个数据包缺一不可。

那么,这三个数据包的作用分别是:
第一个数据包(Server端成功接收):证明了Client发送功能正常。
第二个数据包(Client端成功接收):证明了Server接收功能正常、Server发送功能正常。
第三个数据包(Server端成功接收):证明了Client接收功能正常。

其它补充:
SYN与ACK对应,ACK的作用是确认收到(Acknowledgement)。
第三次握手在技术上就可以携带数据了(但实际上并没有)。

 

 

 

四次挥手

还是先看一下我的笔记吧。

方框内表示的是Client/Server端的状态;中间连线表示数据包内的内容。

四次挥手的大概过程与原理,大家仔细分析一下上图就可以看明白,没什么特别之处值得详说。但是有一处值得注意:图中红色字体的部分

让我们仔细来分析一下,为什么Client端的TIME WAIT状态需要等待2MSL(2个最大包存活时间)?

首先,我们看一下在这个时间点,TCP四次挥手此时正在发生的事情。

  1. 若Server收到了第四个包,即可正常关闭连接。
  2. 若Server没有收到第四个包,则会重发一个ACK(第三个包)。

在Server端发送完第三个包之后,需要收到Client端发送的第四个包,才会进入CLOSED状态。假如第四个包由于网络波动等原因loss掉(丢包),Server就会在等待了一段时间之后重新发送第三个包。这个Server端等待的一段时间,实际上就是一个包在网络中存活的最大时间(1MSL)。那么Server端重发的第三个包传递到Client端,又需要1MSL。这样加起来,总共需要2MSL。

所以,如果发生了坏情况(第四个包loss),需要经过2MSL(等待第四个包1MSL + 重发第三个包1MSL),Client端才会接收到Server端重发的第三个包。

补充!
如果你在百度上检索这个2MSL,会发现很多回答都是“放空网络中的旧请求报文”。很多答案都闪烁其辞且相互抄袭,经过我个人查证,这种说法来源于《Unix网络编程卷1》中的一段解读:

“假设该Socket在关闭连接之后又打开,如果在关闭(四次挥手)的时候发生了波动(拥塞,延迟等),导致三次握手之后才收到上次连接的挥手数据包,就会产生不可预料的影响。为了避免出现这种情况,此处设置了2MSL用来放空所有四次挥手时的数据包。”

但是,在原文中(下图红色批注)的原意是:2MSL足以放空!所以实际上,1MSL就足够进行数据包的放空。换句话说,2MSL并不是用来放空数据包,只是顺手做到了而已!

——节选自《UNIX网络编程卷1》