【随记】从三个不同角度理解TCP的“握手”与“挥手”——连接的建立与释放

不管是自己看书,还是学校老师教学,都会告诉你,TCP的三次握手和四次挥手很重要。事实也是如此,公司面试、各种考试,多多少少都会问些这个。哪,重要的东西就很难吗?当然不是!鹦鹉先生将用三个角度,带你理解TCP的握手和挥手。

“握手”指的是TCP建立连接,“挥手”指的是TCP释放连接。下面,先看看握手。

从上至下,每一个箭头表示一个过程。

三次握手——建立连接

日常生活篇

客户端:Hi,你好!

服务端:你好呀,需要一点什么?

客户端:我需要从X+1开始的数据。

故事篇

客户端:我是客户端,我要建立连接了,SYN=1(一次“往”),给你一个seq=X,收到请回复;

服务端:我已收到你的SYN,现在回复你,SYN=1(一次“返”),ACK=1,你给我的X在ack中,ack=X+1,再给你捎带一个seq=Y,收到请回复;

客户端:OK收到了,我们之间是有路可达的,回复你ACK=1,你给我的Y在ack中,ack=Y+1.因为前面的包大小为1,所以我们就从seq=X+1开始发送数据吧!

理论篇

从TCP的报文结构分析,我们知道,里头有六个指针。只有它们数值为1,才表示对应报文段首部的指定内容是有意义的。这其中,就有我们熟知的ACK、RST、SYN、FIN等。所以首先明确一点:要想表达某种意思前,先要将对应内容的对应指针置为1,只有这样才可以带相应内容给对方。其次,不管是建立连接的SYN,还是拆连接的FIN,这两个家伙都要在C/S双方往返一次。

于是,我们从理论层面讲解一下“握手”。

过程1:客户端主动发出“建立连接”请求,SYN=1(一次“往”),带一个seq=X过去,如果对方收到后,要求回复一个X+1;

过程2:服务端被动收到了请求,SYN=1(一次“返”)。为了回复,ACK=1,ack=X+1,顺便给对方一个seq=Y,通知对方“我们之间可达”;

过程3:客户端收到了,回复ACK=1,ack=Y+1。此时客户端需要编号为“X+1”的数据,于是告知服务端seq=X+1。

其次,是“挥手”。

四次挥手——释放连接

日常生活篇

客户端:行,就先聊到这,我回家了。

服务端:稍等一下,我还有一点东西给你……

服务端:亲,拿好哦,那我不送了。

客户端:好的,再见!

故事篇

客户端:老子要下线了,FIN=1(一次“往”),给你一个seq=u,收到请回复;

服务端:收到了!ACK=1,ack=u+1,但我还有一点数据,等我传完先,给你一个seq=v(无实义);

传……传……传……传……传……

服务端:好了传完了,我们开拆吧!FIN=1(一次“返”),ACK=1,ack=u+1,我这先下线了,给你一个seq=w,你拆了吗?

客户端:好,我也拆了,ACK=1,ack=w+1,我们在seq=u+1结束了。

理论篇

在“建立连接”中,我们知道了:

  • 要想表达某种意思前,先要将对应内容的对应指针置为1,只有这样才可以带相应内容给对方。
  • 不管是建立连接的SYN,还是拆连接的FIN,这两个家伙都要在C/S双方往返一次。

同样地,在拆连接中,也是如此,只不过服务端还有一些数据要发送。

过程1:客户端发送“断开连接”报文,FIN=1(一次“往”),seq=u;

过程2:服务端收到客户端报文段,回复ACK=1,ack=u+1,seq=v(无实义);

过程3:传完数据后,服务端确定可以拆连接了,FIN=1(一次“返”),回复ACK=1,ack=u+1,捎带seq=w。

(图片来源于互联网)

猜你喜欢

转载自blog.csdn.net/m0_60483056/article/details/122747537