(学习笔记-TCP连接建立)TCP 为什么是三次握手?不是两次、四次?

这篇具有很好参考价值的文章主要介绍了(学习笔记-TCP连接建立)TCP 为什么是三次握手?不是两次、四次?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

常规回答:“因为三次握手才能保证双方具有接收和发送的能力”


原因一:避免历史连接

三次握手的首要原因是为了防止旧的重复连接初始化造成混乱

假设:客户端先发送了SYN(seq=90)报文,然后客户端宕机了,而且这个SYN报文还被网络阻塞了,服务端并没有收到,接着客户端重启后,又重新向服务端建立连接,发送了SYN(seq=100)报文。(这里不是重传,而是重新发送请求)

 客户端连续发送多次SYN(都是同一个四元组)建立连接的报文,在网络拥堵的情况下:

  • 一个[旧的SYN报文]比[最新的SYN]报文早到达了服务端,那么此时服务端就回一个SYN+ACK报文给客户端,此报文中的确认号是91(90+1)
  • 客户端收到后,发现自己期望收到的确认号应该是100+1,而不是90+1,于是就会回RST报文
  • 服务端收到RST报文后,就会释放连接。
  • 后续最新的SYN抵达了服务端,客户端与服务端就可以正常的完成三次握手了。

上述中的「旧 SYN 报文」称为历史连接,TCP 使用三次握手建立连接的最主要原因就是防止「历史连接」初始化了连接

 TIP

如果服务端在收到 RST 报文之前,先收到了「新 SYN 报文」,也就是服务端收到客户端报文的顺序是:「旧 SYN 报文」->「新 SYN 报文」,此时会发生什么?

当服务端第一次收到 SYN 报文,也就是收到 「旧 SYN 报文」时,就会回复 SYN + ACK 报文给客户端,此报文中的确认号是 91(90+1)。

然后这时再收到「新 SYN 报文」时,就会回 Challenge Ack (opens new window)报文给客户端,这个 ack 报文并不是确认收到「新 SYN 报文」的,而是上一次的 ack 确认号,也就是91(90+1)。所以客户端收到此 ACK 报文时,发现自己期望收到的确认号应该是 101,而不是 91,于是就会回 RST 报文。

如果是两次握手连接,就无法阻止历史连接,那为什么TCP两次握手就无法阻止历史连接呢?

因为在两次握手的情况下,服务端没有中间状态给客户端来阻止历史连接,导致服务端可能建立一个历史连接,造成资源浪费。

在两次握手的情况下,服务端在收到 SYN 报文后,就进入 ESTABLISHED 状态,意味着这时可以给对方发送数据,但是客户端此时还没有进入 ESTABLISHED 状态,假设这次是历史连接,客户端判断到此次连接为历史连接,那么就会回 RST 报文来断开连接,而两次握手而服务端在第一次握手的时候就进入 ESTABLISHED 状态,所以它可以发送数据的,但是它并不知道这个是历史连接,它只有在收到 RST 报文后,才会断开连接。

(学习笔记-TCP连接建立)TCP 为什么是三次握手?不是两次、四次?,计算机网络,tcp/ip,网络,服务器

 可以看到,如果采用两次握手建立 TCP 连接的场景下,服务端在向客户端发送数据前,并没有阻止掉历史连接,导致服务端建立了一个历史连接,又白白发送了数据,妥妥地浪费了服务端的资源。

因此,要解决这种现象,最好就是在服务端发送数据前,也就是在建立连接前,要阻止掉历史连接,这样就不会造成资源浪费,所以需要三次握手。

所以TCP使用三次握手建立连接的最主要原因是防止[历史连接]初始化了连接


原因二:同步双方初始序列号

TCP协议的通信双方,都必须维护一个[序列号],序列号是可靠传输的一个关键因素,它的作用:

  • 接收方可以去除重复数据
  • 接收方可以根据数据包的序列号按序接收
  • 可以标识发送出去的数据包中,哪些是已经被对方收到的(通过ACK报文中的序列号知道)

可见,序列号在TCP连接中占据着非常重要的作用,所以当客户端发送携带[初始序列号]的SYN报文的时候,需要服务端回一个ACK应答报文,表示客户端的SYN报文已被服务端成功接收,那么当服务端发送[初始序列号]给客户端的时候,依然也要得到客户端的应答,这样一来一回,才能确保双方的初始序列号能被可靠的同步。

(学习笔记-TCP连接建立)TCP 为什么是三次握手?不是两次、四次?,计算机网络,tcp/ip,网络,服务器

四次握手其实也能够可靠的同步双方的初始化序号,但由于第二步和第三步可以优化成一步,所以就成了[三次握手]。

 两次握手只保证了一方的初始序列号能被对方成功接收,没办法保证双方的初始序列号都能被确认接收。


原因三:避免资源浪费

如果只有[两次握手],当客户端发生的SYN报文在网络中阻塞,客户端没有收到ACK报文,就会重新发送SYN由于没有第三次握手,服务端不清楚客户端是否收到了自己回复的ACK报文,所以服务端每收到一个SYN就只能先主动建立一个连接,这会造成什么情况呢?

如果客户端发送的SYN报文在网络中阻塞了,重复发送多次SNY报文,那么服务端在收到请求后就会建立多个冗余的无效链接,造成资源浪费。(因为两次握手的情况下,服务端在接收到SYN报文后就会建立连接)

(学习笔记-TCP连接建立)TCP 为什么是三次握手?不是两次、四次?,计算机网络,tcp/ip,网络,服务器

这里两次握手是假设「由于没有第三次握手,服务端不清楚客户端是否收到了自己发送的建立连接的 ACK 确认报文,所以每收到一个 SYN 就只能先主动建立一个连接」这个场景。


结论

TCP建立连接时,通过三次握手能够防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。

不使用两次握手和四次握手的原因:文章来源地址https://www.toymoban.com/news/detail-582559.html

  • 两次握手:无法防止历史连接的建立,会造成双方资源的浪费,无法可靠的同步双方序列号
  • 四次握手:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。

到了这里,关于(学习笔记-TCP连接建立)TCP 为什么是三次握手?不是两次、四次?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 笔记:TCP握手为什么是3次而不是2次?

    这个问题比较常见,这里简单总结一下。 一、两次握手建立连接:流程说明: 1)客户端发送SYN。 2)服务端收到SYN请求后,服务端回复SYN+ACK,然后进入已连接状态。 3)客户端收到SYN+ACK回复后,进入已连接状态。 二、两次握手建立连接:存在的问题 若客户端发送SYN后,没

    2023年04月13日
    浏览(44)
  • TCP为什么需要三次握手进行连接,二次或四次不可以吗?

    为了确认双方具有接收和发送的能力。 1. 可以阻止重复历史连接的初始化(主要原因)。 2. 可以同步双方的初始序列号。 3. 可以避免资源的浪费。 1. 为了防止旧的重复连接初始化造成混乱。 当客户端发送了一个 SYN 报文后,突然宕机了,并且这个 SYN 报文还被网络阻塞了

    2024年02月16日
    浏览(43)
  • TCP 和 UDP 区别? 2、TCP/IP 协议涉及哪几层架构? 3、描述下 TCP 连接 4 次挥手的过程?为什么要 4 次挥手?

    TCP 基于连接,UDP 基于无连接。 TCP 要求系统资源较多,UDP 较少。 UDP 程序结构较简单。 TCP 保证数据正确性,UDP 可能丢包。 TCP 保证数据顺序,UDP 不保证。 应用层 传输层 互连网络层 网络接口层。 因为 TCP 是全双工,每个方向都必须进行单独关闭。关闭连接时,当 Server 端收

    2024年02月03日
    浏览(28)
  • 学习笔记18——个人理解为什么快速重传是3次ACK

    为什么快速重传是选择3次ACK? 个人理解:首先网络中的丢包,乱序以及网路故障都会让服务器端发回duplicated ACK,表示有一个包一直未收到。快速重传是通过3次ACK来区分乱序,丢包和网路拥塞的情况,是基于实践经验得到的,所以说这种判断方式不一定准确,只是“大概率

    2024年02月02日
    浏览(26)
  • (学习笔记-TCP连接断开)建立了连接,但是客户端或服务端出现问题,会怎么样?

    客户端出现故障指的是客户端的主机发生了宕机或者断电的场景。发生这种情况的时候,如果服务端一直不会发送数据给客户端,那么服务端是永远无法感知到客户端宕机这件事的,也就是服务端的TCP连接将一直处于 ESTABLISH 状态,占用着资源。 为了避免这种情况,TCP有一个

    2024年02月16日
    浏览(33)
  • AIMD 为什么收敛(tcp reno/cubic 为什么好)

    TCP 拥塞控制目标是缓解并解除网络拥塞,让所有流量公平共享带宽,合在一起就是公平收敛。 AIMD(几乎所有与拥塞控制相关的协议或算法都有 AIMD 的影子,包括 RoCE,BBRv2) 为什么收敛?我一般会给出下面的老图: 虽然只展示了两条流的收敛,但 n 条流收敛的展示无非就是将

    2024年02月06日
    浏览(61)
  • MSQL系列(十二) Mysql实战-为什么索引要建立在被驱动表上

    Mysql实战-为什么索引要建立在被驱动表上 前面我们讲解了B+Tree的索引结构,也详细讲解下 left Join的底层驱动表 选择原理,那么今天我们来看看到底如何用以及如何建立索引和索引优化 开始之前我们先提一个问题, 为什么索引要建立在被驱动表上 ? 1.建表及测试数据 我们先

    2024年02月08日
    浏览(32)
  • tcp 为什么要三次握手,两次不行吗?为什么?

    TCP使用三次握手(Three-Way Handshake)的过程是为了确保双方建立起可靠的通信连接,并在连接的建立过程中协商必要的参数。两次握手是不够的,原因主要有以下几点: 防止已失效的连接请求被接受: 假设有A和B两台主机,A向B发送了一个连接请求,但由于某些原因导致连接建

    2024年02月20日
    浏览(48)
  • TCP为什么需要3次握手?

    一、3次握手过程 客户端向服务端发送一个表示建立连接的SYN报文段,服务端从IP数据报中提取出TCP SYN报文段,为该TCP连接分配需要的缓存和变量,并向客户端发送表示允许连接的报文段ACK。客户端在收到ACK报文段之后,也要给该连接分配缓存和变量,客户端向服务器再发送

    2024年04月26日
    浏览(30)
  • TCP为什么三次握手?

    参考:公众号 小林coding 常见回答:三次握手保证双方都具有接受和发送数据的能力。 主要原因: 1. 防止重复历史连接的初始化 2.同步双方初始序列号 3.避免资源的浪费 序列号seq标记已发送数据的位置,确认号ack表示数据已接受,期望下一次数据序列号seq = ack 当因为网络拥

    2023年04月27日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包