先说结论

  • 为了实现可靠数据传输, 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 需要三次握手, 而不是两次之前, 首先需要回答的问题是:

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

如果读者对比一下 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 数据包标志位, 以及数据域的命名来源。

题外话

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

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

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

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

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

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

原文链接:TCP 为什么三次握手而不是两次握手(正解版)

pythonsocket中tcp通信接收不到数据_TCP 为什么三次握手而不是两次握手(正解版)...相关推荐

  1. TCP 为什么三次握手而不是两次握手(正解版)

    参考文章 Why do we need a 3-way handshake? Why not just 2-way 大部分网络博客的错误解读 首先需要声明的是, 百度搜索到的大部分网络博客关于这个问题 ...

  2. TCP通信接收数据不完整的解决方法

    一.TCP协议.Socket编程流程 TCP/IP协议及socket封装 套接字的编程流程: 二.Send 和 Recv的基本介绍 2.1 Send函数 int send( SOCKET s, con ...

  3. qint64转为qstring qt_Qt项目中TCP通信的实现方式经验总结(服务端部分)

    总第20篇 本文接第19篇,继续梳理TCP通信过程中的重要知识.本文主要系统地讲解通信服务端部分,以供在以后的项目开发过程中参考.如果觉得不错可以关注专栏 面向加薪编程C/C++ ,第一时间接收文章更 ...

  4. c++语言 tcp例子,C++中TCP通信实现文件传输

    作为Computer networks课程的一个project,我们需要实现用TCP在mininet中client和server的相互通信,需要能够传输文本文件,binary file 和image ...

  5. 为什么TCP握手是三次握手而不是两次

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 简介 1. 三次握手 2. 两次握手 3. 两次握手的问题 总结 简介 TCP连接需要三次握手,旨在通过同步两方之间交换的消 ...

  6. java的tcp实时接收json格式报文_tcp - 如何使用带有rsocket Java的TcpClientTransport将自定义数据格式转换为JSON - 堆栈内存溢出...

    我有一个Tcp数据提供程序,它使用管道定界符发出数据,该定界符需要转换为JSON,然后存储在NoSQL数据存储区中. 我已使用RSocket中的TcpClientTransport协议连接到提供程序, ...

  7. TCP协议为什么是三次握手而不是两次呢?

    原因1:主要是为了防止已经失效的连接请求报文突然又传送到了服务器,从而导致不必要的错误和资源的浪费. 如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送的第一个请求连接并且没有丢失,只是因为 ...

  8. TCP握手过程(正解版)

    参考文章 Why do we need a 3-way handshake? Why not just 2-way https://blog.csdn.net/qq_36903042/article/ ...

  9. 口语化/面试讲解TCP为什么要握手,为什么是三次握手而不是两次或四次

         概念:三次握手即 three-way handshake,将他理解为三步握手,是一次握手分三个步骤进行,而不是一共握三次手. 首先为什么要握手?tcp是可靠的全双工的一个双向通信传输协议,体 ...

最新文章

  1. LSGO软件技术团队招新 线下组队学习
  2. 短信升级为5G消息?三大运营商联合发布的《5G消息白皮书》说了啥?
  3. python语言自学-零基础小白学习Python编程语言的正确姿势(纯干货)
  4. 【OpenCV学习笔记之一】图像加载,修改及保存
  5. SVR4/4.3BSD与Linux对待伪终端的不同方式
  6. visjs使用小记-1.创建一个简单的网络拓扑图
  7. SpringSecurity分布式整合之common工具模块创建
  8. [控件] LabelView
  9. Shiro并发登录人数控制遇到的问题和解决
  10. java 复选框怎么用_Java Swing公开课|Java Swing的复选框组件怎么用,看完这篇文章你一定就会了...
  11. Java中String, StringBuilder和StringBuffer
  12. 2021 年百度之星·程序设计大赛 - 初赛二
  13. LOJ10068 秘密的牛奶运输
  14. oracle多次发运,EBS 发运管理操作实例11——延迟交货(Backorder)
  15. 计算简史:什么是计算机?《禅与计算机程序设计艺术》 / 陈光剑
  16. logo怎么设计才好看?好看的logo设计方法大公开。
  17. 微信小程序本地图片处理--按屏幕尺寸插入图片
  18. qt使用assimp加载模型_iOS使用assimpKit加载FBX模型步骤详解
  19. 于明:APU能否接力取代迟暮的X86?
  20. C语言知识-零零散散(三)

热门文章

  1. 技术选型:Sentinel vs Hystrix
  2. Alluxio:2022年大数据五大趋势,多云下数据湖兴起,AI成为主流
  3. 5G精华问答 | 大数据和5G有什么关系?
  4. 要闻君说:特斯拉重磅推出影响力报告;三星官宣完成5纳米EUV工艺研发还承诺提供样品;国内首条5G智能制造生产线正式“上马”...
  5. 5G精华问答:5G的速度到底有多快?| 技术头条
  6. 云重磅 | 没有硬件,苹果发布多款“云服务”;阿里云发布基于公共云的虚拟GPU服务;中国移动首发5G套餐...
  7. Cloud一分钟 | 谷歌投资的AR云平台开发商Blue Vision Labs,将由美版滴滴Lyft收购
  8. 云计算平台2017年盘点——真正成为新技术新应用的基础架构
  9. 晋中计算机专业对口大学,山西晋中计算机专业好就业吗?,计算机专业
  10. 读研期间一定得看论文吗_读研期间各阶段的目标和任务,你明确吗?