TCP协议握手与挥手详解

180 阅读6分钟

小知识,大挑战!本文正在参与“  程序员必备小知识  ”创作活动

本文同时参与 「掘力星计划」  ,赢取创作大礼包,挑战创作激励金

为什么要知道TCP的三次握手与四次挥手

又是我,我又去充了三毛钱电费! 在这里插入图片描述

追根溯源

tcp的三次握手四次挥手可以说只要学编程的,多多少少都听说过,要是拿这个当论文题目都能写个十几页,既然这么常见我就不多叨叨了。 在这里插入图片描述

TCP用什么发送数据来完成握手和挥手

我们都知道TCP的握手与挥手都是发送数据来建立连接的,那到底是用什么来承载数据的呢,数据上又是什么来确定双发状态的呢? tcp用报文来承载数据,也叫数据报,如果对tcp/ip五层比较熟悉,就会很了解这部本,也可以去看我之前写的tcp/ip五层的博客去复习一下。

在这里插入图片描述 看了报文的格式我们基本上就能明白TCP在建立连接时是用确认号来确定双方的状态的,这里就解释一下几个在建立连接时重要的标识位 ACK:确认序号的标志,ACK=1表示确认号有效,ACK=0表示报文不含确认序号信息 SYN:连接请求序号标志,用于建立连接,SYN=1表示请求连接 FIN:结束标志,用于释放连接,为1表示关闭本方数据流 这里还要补充一下序列号seq,ack=seq+1,这个ack不是上面标识位,而是确认号本身; (1)序列号:Seq序列号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。 (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。

TCP的三次握手

看了上面的的其实大家可以推测出来握手的过程是什么啦; 客户端想要和服务端建立连接,必然就要发送一个请求连接的报文,所以就可得出 第一次握手客户端发送了一个SYN=1的报文给服务端,请求连接 这时我们可以命名客户端的Seq=x; 服务端收到客户端发送来的SYN=1的报文,了解客户端想要建立连接,那它就要回复给客户端一个我已经接收到消息,并同意建立连接的报文,所以可得出 第二次握手服务端回复一个SYN=1+ACK=1的报文给客户端 服务端认为客户端的确认序号有效,所以服务端的确认序号为Ack=x+1; 这时可设定服务端Seq=y; 客户端接收到服务端回复消息,这时候客户端要回复服务端确认收到了这个回复,所以可以得出 第三次握手客户端发送一个ACK=1给服务端 随后便将自己的确认序号Ack设置成y+1,因为它确定服务端的回复有效。 在这里插入图片描述 你也可以像图上一样分几个状态

TCP的四次挥手

有了上面握手的经验,对于断开连接的四次挥手也没什么难度了,有人会问为什么断开比连接多了一次,是因为客户端和服务端都需要单独关闭。 因为是双方关闭,所以第一个关闭请求服务端和客户端谁发送都可以,这里我们还是以客户端先发送为例。 第一次挥手:客户端发送FIN=1给客户端,Seq=u,请求断开连接 第二次挥手:服务端回复客户端,发送ACK=1,确认序号Ack=u+1,Seq=v; 这时服务端并没有发送完,因为服务端也要关闭,所以再次向客户端发送 第三次挥手:服务端发送FIN=1给客户端,Seq=w,确认序号Ack=u+1(没变),发送ACK=1给客户端 第四次挥手:客户端回复服务端,发送ACK=1,确认序号Ack=w+1;

在这里插入图片描述 有人注意到图上最后客户端回复完进入了TIME-WAIT阶段,等待了2MSL才关闭嘛?这个阶段有什么作用呢? TIME-WAIT阶段的作用: 1.防止旧连接的数据包,旧连接是当一个请求经过路由器时,可能由于路由器的异常,导致它停在了路由哪里,发送方确认它超时后会发送一个相同的新的请求,传递给接收方,当接受方接受请求后,旧的请求由于路由器的修复再次传送了过来,这个时候TIME-WAIT就起作用了,TCP不允许处于TIME_WAIT状态的连接一个新的请求,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个TCP连接的时候,旧连接的数据包已经在网络中消逝。 2.可靠地实现TCP全双工连接的终止,进行关闭连接四路握手协议时,最后的ACK是由主动关闭端发出的,如果这个最终的ACK丢失,服务器将重发最终的FIN,因此客户端必须维护状态信息允 许它重发最终的ACK。如果不维持这个状态信息,那么客户端将响应RST分节,服务器将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。因而,要实现TCP全双工连接的正常终止,必须处理终止序列四个分节中任何一个分节的丢失情况,主动关闭 的客户端必须维持状态信息进入TIME_WAIT状态。

MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间将在网络中消失。所以2MSL就可以保证旧连接消逝了。

理论结合实践

有人会说这太学术性了,其实在生活中这种连接映射有很多 举个例子,我和我对象因为疫情异地,每天打游戏的时候,就会产生三次握手 我:来呀,来一场紧张刺激的王者(发送连接请求) 我对象:来(确认接收到请求),我要玩诸葛亮(返回连接请求) 我:就你那诸葛亮0-17还玩(确认请求收到) 如果成功双方进入游戏(数据交互) 由于我的嫌弃,产生了四次握手 我对象:你嫌弃我,我不玩了,哼(服务端请求断开连接) 我:没嫌弃你,但我说的是实话啊(确认接收到请求) ------------------因为错误的回答,你的对象不想搭理你----------------------------- 我:你不玩我自己玩了,我要玩韩信(客户端请求断开连接) 我对象:你玩吧,你和游戏过吧,哼(服务端接收到请求)

在这里插入图片描述

最后给你们推荐一本书吧

在这里插入图片描述

如果有错误或者需要补充请写在下面,跟我打一架! 在这里插入图片描述 古德拜~