tcp握手为什么是三次不是两次_tcp的三次握手

tcp握手为什么是三次不是两次_tcp的三次握手TCP采用三次握手的原因其实非常简单,远没有大部分博客所描述的那样云山雾绕。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

参考文章

Why do we need a 3-way handshake? Why not just 2-way

大部分网络博客的错误解读

首先需要声明的是, 百度搜索到的大部分网络博客关于这个问题的解答都是不清晰或者不准确的。 讨论这个问题的大部分博客都会引用《计算机网络》的内容:

  1. 防止已失效的连接请求又传送到服务器端,因而产生错误

不幸的是, 这种解释是不准确的, TCP 采用三次握手的原因其实非常简单, 远没有大部分博客所描述的那样云山雾绕。

这里先给出结论:

  • 为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤
  • 如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认

先修知识

TCP 通信流程

TCP 的通信流程
在这里插入图片描述

上图中的每一个箭头都代表着一次 TCP数据包的发送

  • 需要注意的是, 上图中出现的 ACK = x +1 的写法很容易让人误以为数据包中的 ACK 域的数据值被填成了 y+1 。 ACK = x+1 的实际含义是:
    • TCP 包的 ACK 标志位(1 bit) 被置成了 1
    • TCP 包的确认号(acknowledgement number ) 的值为 x+1
  • 类似的, TCP 数据包中的 SYN 标志位, 也容易与序号(sequence number) 混淆, 这点需要读者注意

TCP 数据包结构图
TCP包结构图

为什么 TCP 需要握手这个操作

在解答为什么 TCP 需要三次握手, 而不是两次之前, 首先需要回答的问题是:

  • 为什么需要握手这个操作, 能不能不握手?

如果读者对比一下 UDP 的通信流程和 TCP 的通信流程, 可以发现, 在 UDP 协议中, 是没有握手这个操作的。
在这里插入图片描述

这里就引出了 TCP 与 UDP 的一个基本区别, TCP 是可靠通信协议, 而 UDP 是不可靠通信协议。

  • TCP 的可靠性含义: 接收方收到的数据是完整, 有序, 无差错的。
  • UDP 不可靠性含义: 接收方接收到的数据可能存在部分丢失, 顺序也不一定能保证。

UDP 和 TCP 协议都是基于同样的互联网基础设施, 且都基于 IP 协议实现, 互联网基础设施中对于数据包的发送过程是会发生丢包现象的, 为什么 TCP 就可以实现可靠传输, 而 UDP 不行?

TCP 协议为了实现可靠传输, 通信双方需要判断自己已经发送的数据包是否都被接收方收到, 如果没收到, 就需要重发。 为了实现这个需求, 很自然地就会引出序号(sequence number)确认号(acknowledgement number) 的使用。

发送方在发送数据包(假设大小为 10 byte)时, 同时送上一个序号( 假设为 500),那么接收方收到这个数据包以后, 就可以回复一个确认号(510 = 500 + 10) 告诉发送方 “我已经收到了你的数据包, 你可以发送下一个数据包, 序号从 510 开始” 。

这样发送方就可以知道哪些数据被接收到,哪些数据没被接收到, 需要重发。

为什么需要三次握手,而非两次

正如上文所描述的,为了实现可靠传输,发送方和接收方始终需要同步( SYNchronize )序号。 需要注意的是, 序号并不是从 0 开始的, 而是由发送方随机选择的初始序列号 ( Initial Sequence Number, ISN )开始 。 由于 TCP 是一个双向通信协议, 通信双方都有能力发送信息, 并接收响应。 因此, 通信双方都需要随机产生一个初始的序列号, 并且把这个起始值告诉对方。

于是, 这个过程就变成了下面这样。
在这里插入图片描述

下面这个流程图描述的和上面一样, 但是更加清楚的展示了 TCP 数据包标志位, 以及数据域的命名来源。

Alice Bob SYN =1 , seq = x SYNchronize with my Initial Sequence Number of x SYN =1, ACK = 1, seq = y , ack = x+1 I received your ISN, I ACKnowledge that I am ready for [x+1] SYNchronize with my Initial Sequence Number of y ACK =1 , seq = x+1, ack = y+1 I received your syn, I ACKnowledge that I am ready for [y+1] Alice Bob

题外话

有一位读者关注到了三次握手中, 序列号变化的问题, 让笔者临时想起了曾经困扰自己的一个问题

  • 为什么三次握手最后一次握手中, 在上面的示意图中回复的 seq = x+1 。

答案: (此处感谢 “楚天千里清秋” 的提醒, 进行了修正)

acknowledgement number 的作用是向对方表示,我期待收到的下一个序号。 如果你向对方回复了 ack = 31, 代表着你已经收到了序号截止到30的数据,期待的下一个数据起点是 31 。

TCP 协议规定SYN报文虽然不携带数据, 但是也要消耗1个序列号, 所以前两次握手客户端和服务端都需要向对方回复 x+1 或 y+1 。

在这里插入图片描述
在这里插入图片描述
值得注意的是, 如上图所说, 最后一次握手在默认不携带数据的情况下, 由于SYN 不是 1 , 是不消耗序列号的。 所以三次握手结束后, 客户端下一个发送的报文中 seq 依旧是 x+1, 示意图如下

在这里插入图片描述
注意到, 上图第四步发送的 seq 和第三次握手的 seq 是一样的, 体现了最后一次握手, 默认不消耗序列号的特点。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/188074.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 王者qq抽奖皮肤_王者荣耀皮肤生成器

    王者qq抽奖皮肤_王者荣耀皮肤生成器说一下过程吧,第一步,就是先准备好皮肤的图片,皮肤的图片在王者荣耀的官网是可以下载的,但是过百的下载量确实有点大了,动了个小心思,网上找了一个用py写的爬虫,用来爬了官网的图片。

    2022年10月20日
  • 逆变电源的计算机控制系统,一种专用三相逆变电源控制系统研究

    逆变电源的计算机控制系统,一种专用三相逆变电源控制系统研究摘要:三相逆变器作为交流电源的主要部分,已经广泛应用于工业、能源、交通、运输等领域。本课题研究的三相逆变电源主要应用于船舶的供电系统,为汽轮发电机组交流电动辅油泵和柴油发电机组电动泵提供可靠不间断的三相交流电,能够适应负载直接启动、恒压频比启动等操作。当船电正常时,船电经过整流滤波后通过Boost升压电路为逆变电路提供直流电,当船电故障时,由蓄电池经过升压电路为逆变电路提供直流电。在两种输入电压切…

  • matlab中wavedec2,Matlab中wavedec使用學習及詳解 | 学步园

    matlab中wavedec2,Matlab中wavedec使用學習及詳解 | 学步园最近在使用對ECG訊號進行小波係數的提取,所以用到了wavedec這個matlab中内置函數。然後盡心學習,發現還挺高深,不是我學到的衹是一點皮毛,因爲要對一段波形進行特徵提取,所以我要看哪個小波係數最能代表波形特徵,然後進行保留。我使用的是:[C,L]=WAVEDEC(X,N,’wname’)這個會返回信號X在levelN(小波分解級數)的小波分解係數。輸出爲兩部分,第一部分C爲小波分解係…

  • Windows10 系统下cuda安装教程,小白教程 !很详细!!「建议收藏」

    Windows10 系统下cuda安装教程,小白教程 !很详细!!「建议收藏」Windows10系统下cuda安装教程1.查看适合自己电脑的cuda版本1.点击Windows+R输入nvidia-smi看一下自己电脑支持的conda版本是:根据下图白框标出的地方可以看出我的conda版本是10.02.下载cuda地址:https://developer.nvidia.com/zh-cn/cuda-toolkit下载好了以后,根据下列图示依次进行安装2.1点击下载好的文件。2.2点击运行2.3选择文件存储位置,然后点击ok2.4等待安装完成

  • 知识图谱入门 【七】- 知识推理

    知识图谱入门 【七】- 知识推理知识推理任务分类所谓推理就是通过各种方法获取新的知识或者结论,这些知识和结论满足语义。其具体任务可分为可满足性(satisfiability)、分类(classification)、实例化(materialization)。可满足性可体现在本体上或概念上,在本体上即本体可满足性是检查一个本体是否可满足,即检查该本体是否有模型。如果本体不满足,说明存在不一致。概念可满足性即检查某一概念的可满足性,即检查是否具有模型,使得针对该概念的解释不是空集。上图是两个不可满足的例子,第一个本体那个是…

  • 常用meta整理

    常用meta整理

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号