当前位置:   article > 正文

TCP的 “三次握手” 和 “四次挥手”(TCP为什么要三次握手,四次挥手)_什么是三次握手四次挥手?tcp为什么要三次握手?

什么是三次握手四次挥手?tcp为什么要三次握手?

返回上级:计算机网络 第5章 运输层

1.seq,ack,ACK,SYN,FIN

TCP中的RST标志(Reset)详解
(1)序号(sequence number):Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

(2)确认号(acknowledgement number):Ack序号,占32位, 只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。

(3)标志位(Flags):共6个,即URG、ACK、PSH、RST、SYN、FIN等。具体含义如下:

  • ACK: 确认序号有效
  • SYN:发起一个新连接。
  • FIN:释放一个连接
  • SYN:同步序列编号(Synchronize Sequence Numbers)
  • ACK(Acknowledge character):确认字符。
  • RST:连接终止

2.三次握手

在这里插入图片描述
在这里插入图片描述
请添加图片描述
请添加图片描述
请添加图片描述

1.2 TCP为什么要三次握手:

  • 如果只有两次握手,当客户端的SYN请求连接在网络中阻塞,客户端没有接收到ACK报文,就会重新发送SYN,由于没有第三次握手,服务器不清楚客户端是否收到了自己发送的建立连接的ACK确认信号,所以每收到一个SYN就只能先主动建立一个连接
  • 如果客户端的SYN阻塞了,重复发送多次SYN报文,那么服务器在收到请求后就会建立多个冗余的无效链接,造成资源的浪费

避免历史连接(服务端重复无效连接,首要原因):

  • 如果是历史连接(序列号过期或超时),则第三次握手发送的报文是RST(reset),以此终止历史连接
  • 如果不是历史连接,则第三次发送的报文是ACK报文,通信双方就会成功建立连接

同步双方初始序列号:

  • 当服务端发送“初始序列号”给客户端的时候,依然也要得到客户端的应答回应,这样一来一回,才能确保双方的初始序列号能被可靠的同步

序列号的作用:不重复,不丢弃,按序传输

  • 接收方可以去除重复的数据
  • 接收方可以根据数据包的序列号按序接收
  • 可以标识发送出去的数据包中,哪些是已经被对方收到的

主要是为了防止失效的连接请求报文段突然又传送到了B,因而产生错误
在这里插入图片描述
在这里插入图片描述
tcp建立连接为什么需要三次握手

3.四次挥手

在这里插入图片描述

3.1 为什么“握手”是三次,“挥手”却要四次?

TCP建立连接时之所以只需要"三次握手",是因为在第二次"握手"过程中,服务器端发送给客户端的TCP报文是以SYN与ACK作为标志位的。SYN是请求连接标志,表示服务器端同意建立连接;ACK是确认报文,表示告诉客户端,服务器端收到了它的请求报文。

即SYN建立连接报文与ACK确认接收报文是在同一次"握手"当中传输的,所以"三次握手"不多也不少,正好让双方明确彼此信息互通。

TCP释放连接时之所以需要“四次挥手”,是因为FIN释放连接报文与ACK确认接收报文是分别由第二次和第三次"握手"传输的。为何建立连接时一起传输,释放连接时却要分开传输?

  • 建立连接时,被动方服务器端结束CLOSED阶段进入“握手”阶段并不需要任何准备,可以直接返回SYN和ACK报文,开始建立连接。
  • 释放连接时,被动方服务器,突然收到主动方客户端释放连接的请求时并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文。

所以是“三次握手”,“四次挥手”。

3.2 为什么客户端在TIME-WAIT阶段要等2MSL?

1.防止旧连接的数据包:上一次连接的数据包,由于延迟,在下一次连接中才到达

2.保证连接正确关闭,客户端最后的ack丢失会导致服务端无法关闭

为的是确认服务器端是否收到客户端发出的ACK确认报文

当客户端发出最后的ACK确认报文时,并不能确定服务器端能够收到该段报文。所以客户端在发送完ACK确认报文之后,会设置一个时长为2MSL的计时器。MSL指的是Maximum Segment Lifetime(最长报文寿命):一段TCP报文在传输过程中的最大生命周期。2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长。

服务器端在1MSL内没有收到客户端发出的ACK确认报文,就会再次向客户端发出FIN报文;

  • 如果客户端在2MSL内,再次收到了来自服务器端的FIN报文,说明服务器端由于各种原因没有接收到客户端发出的ACK确认报文。客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时;
  • 否则客户端在2MSL内没有再次收到来自服务器端的FIN报文,说明服务器端正常接收了ACK确认报文,客户端可以进入CLOSED阶段,完成“四次挥手”。

所以,客户端要经历时长为2SML的TIME-WAIT阶段;这也是为什么客户端比服务器端晚进入CLOSED阶段的原因

参考博客:

详解 TCP 连接的“ 三次握手 ”与“ 四次挥手 ”
http三次握手四次挥手详解

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/702512
推荐阅读
相关标签
  

闽ICP备14008679号