TCP三步握手three way (or three message) handshake 是TCP核心知识点,很长一段时间内我无法理解为什么TCP建立连接需要三次通信,而不是两次或者四次或者更多次。我翻了很多问答和博客,他们说的都很有道理,但是借来的火,点不亮自己的灯。随着时间的推移终于对这个问题我有了自己的理解。

TCP握手为什么需要三次通信?

互联网这个信道并不可靠,TCP用于在不可靠的信道中进行可靠的信息传递。首先要明确的是,无论通过多少次握手都无法改变信道不可靠的事实,而如何在不可靠的信道中进行可靠的信息传递才是要解决的问题。

A无法确认B是否收到信息的情况下要确认B收到可以通过观察B的反馈做到。

也就是说B在规定时间内没有反馈那么A就认定B没有收到,A会重新发送,直到收到B的反馈。

所以在不可靠信道中交换一次信息至少需要两次通信。

在TCP握手过程中客户端要询问服务端的是你可以通信吗?服务端会回答我可以或者不可以。所以有两次信息交换,正常需要四次通信。

A → B B → A 客户端询问服务端是否可以通信的信息确保传达完成。

B → A A → B 服务端答复客户端我可以/不可以的答复信息确保传达完成。

中间的两次B → A通信可以合并为一次,所以总共就变成了三次通信。

通信过程中传递的信息具体有什么?

A → B:能听到吗?能通信吗?

B → A:能听到,能通信(回答能通信隐含的意思就是能听到)

B → A:我的回复收到了吗?

A → B:收到了

中间两次通信合并后:

A → B:能听到吗?能通信吗?

B → A:能听到,能通信(回答能通信隐含的意思就是能听到),我的回复收到了吗?

A → B:收到了

这样三次通信后完成握手。

信道可靠,握手则只需要两次通信即可完成:

A → B:能通信吗?

B → A:能

不需要确认是否可以通信:

握手是为了交换对方是否可以通信的信息,如果无需确认对方是否可以通信则无需握手,因为没有信息需要同步。

除了我的理解以下是收集的相关素材,都是原文摘抄,侵删:

  1. TCP是一种可靠的传输控制协议,它必须做到两点,一是保证数据的可靠传输,二是尽可能提高传输效率,三次握手正是为了做到这两点才出现的。

  2. 这个问题在谢希仁版《计算机网络》里说了。三次是保证双方互相明确对方能收能发的最低值。理论上讲不论握手多少次都不能确认一条信道是“可靠”的,但通过3次握手可以至少确认它是“可用”的,再往上加握手次数不过是提高“它是可用的”这个结论的可信程度。

  3. 简单说,让双方都证实对方能发收。知道对方能收是因为收到对方的因为收到而发的回应。

    具体:

    1:A发,B收, B知道A能发

    2:B发,A收, A知道B能发收

    3:A发,B收, B知道A能收

  4. 三次握手这个说法不好,其实是双方各一次握手,各一次确认,其中一次握手和确认合并在一起

  5. 这个问题的本质是, 通过一个不完全可靠的信道, 最少需要几次消息传输, 信道两边的人能够对一个问题达成一致. 对于TCP来说, 无论有没有初始

    序号的要求, 想要两边都同意开始传出数据, 就至少需要3次消息的交换:

    0次: 显然不行

    1次: A->B, A不知道B是否同意

    2次: A->B, B->A. B不知道A是否收到自己的消息, 因为信道不完全可靠

    3次: A->B, B->A, A->B. 两边都收到了对方的ACK, 意味着各自都了解了对方的意图, 从而可以对是否开始通信这个最简单的问题

    达成一致.

  6. 两军问题根本不能解释为什么要三次握手。两军问题的一个结论就是,在不可信的信道上,不可能实现完全可信的通信。

  7. No…

    三次握手的要求不是源于两边同时传输数据, 你看过Two Generals’ Problem就能明白, 三次握手作为一个协议, 并不特定于

    TCP, 跟两边同时传输数据也没有关系. 请不要纠缠于什么全双工, 半连接, syn/ack这些东西上. 至于你说的把握手协议并在第一个数据包

    里发送之类的, 那只是实现时的优化, 跟"三次"问题的核心没有关系. 实现是实现, 协议是协议, 这是两个东西. 你单独有个握手协议也好, 握

    手包含在真正的数据包里也行, 但无论如何, 没有至少三次握手, 任何的数据交换都是不可靠的.

    所以, 这个问题的本质是, 信道不可靠, 但是通信双发需要就某个问题达成一致. 而要解决这个问题, 无论你在消息中包含什么信息, 三次通信是理论上的最小值. 所以三次握手不是TCP本身的要求, 而是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的. 请注意这里的本质需求,信道不可靠, 数据传输要可靠. 三次达到了, 那后面你想接着握手也好, 发数据也好, 跟进行可靠信息传输的需求就没关系了. 因此,如果信道是可靠的, 即无论什么时候发出消息, 对方一定能收到, 或者你不关心是否要保证对方收到你的消息, 那就能像UDP那样直接发送消息就可以了.

参考

  1. TCP 为什么是三次握手,而不是两次或四次?
  2. TCP建立连接为什么是三次握手?

TCP握手为什么需要三次通信相关推荐

  1. 通俗理解TCP握手次数是三次?

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/richardzrc/article/details/37567793 理解之后.应该说是至少三次就能 ...

  2. get技能 TCP(ip socket 关系)通信的三次握手和四次撒手的详细流程(顿悟)

    TCP(Transmission Control Protocol) 传输控制协议 三次握手 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位 ...

  3. startupinfo为什么需要初始化_为什么 TCP 建立连接要三次握手

    为什么这么设计(Why's THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点.对具体实现造成的影响 ...

  4. 为什么TCP建立连接需要三次握手

    为什么TCP建立连接需要三次握手 很简单,因为TCP的目的是相对高效地建立可靠的连接. 虽然说2次握手,请求方就已经能够确认双方路径已经没有问题了.但是接受方这边接收到的信息却仅仅是,你发起了建立连接 ...

  5. Python常见面试题:TCP 协议中的三次握手与四次挥手相关概念详解

    今天来聊聊Python常见面试题中面试频率特别高的一个题目:TCP 协议中的三次握手与四次挥手. 涉及到的知识点有: 1.TCP.UDP 协议的区别 2.TCP 头部结构 3.三次握手与四次挥手过程详 ...

  6. mobaxterm为什么无法连接_为什么 TCP 建立连接需要三次握手

    为什么这么设计(Why's THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点.对具体实现造成的影响 ...

  7. 网络:七层,HTTP应用层、TCP传输层、IP网络层,拔网线TCP还在,三次握手保证双向与减少因延时传输错误

    网络七层 应,表,会,传,网,数,物 HTTP应用层 TCP传输层 IP网络层 应用层 与其它计算机进行通讯的一个应用,它是对应应用程序的通信服务的.例如,一个没有通信功能的字处理程序就不能执行通信的 ...

  8. 十人面试就我通过,只因我答对了这题TCP协议为什么需要三次握手

    一位5年工作经验的小伙伴面试被问到这样一道面试题,说,TCP协议为什么要设计三次握手.当时这位小伙伴被问得哑口无言.后来,他找到我,说希望做一期视频分享一下.今天,我给大家分享一下我的理解. 1 TC ...

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

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

最新文章

  1. pycharm 使用小结
  2. php的socket通信
  3. Android控件默认风格解析之SeekBar
  4. 施一公:优秀博士如何养成
  5. MySQL重安装,安装到最后出现Er1045的解决方法
  6. 如何使用vue使同一个弹窗同时能实现添加和编辑
  7. 华为程序员:加了六天班,加班费一万四,网友:还缺人不?我能加到它破产...
  8. 关于进行安装程序出现注册DLL/OCX失败,返回码:0x5问题
  9. 亚马逊云科技 2022 年 3 月新服务新功能强势来袭
  10. APTHunter——Windows安全日志排查好帮手
  11. android ca,Android CA证书安装流程
  12. 播音主持必练的绕口令
  13. 世界上前11名最贵跑车
  14. PDF转化器免费版有哪些?这几款办公达人们都在用
  15. 深入分析 Uniswap V3 流动性供应的数学原理
  16. 电脑开机出现奇怪字符_电脑开机黑屏怎么办出现英文字符
  17. 预处理命令不是c语言本身的组成部分,C中的预处理命令
  18. 知识丨软件定义汽车的价值
  19. 云原生时代的流水线框架 Argo
  20. 【bzoj3165】[Heoi2013]Segment

热门文章

  1. 软件测试度量计算方法有哪些,软件测试度量(三)
  2. mvc html 生成图片,asp.net mvc5 cs代码中获取视图生成后的HTML
  3. Java编程字符逆序输出_用JAVA编写一程序:从键盘输入多个字符串到程序中,并将它们按逆序输出在屏幕上。...
  4. 微信开发修改button里的字体大小_微信小程序全栈开发课程【视频版】2.2 index页面完善...
  5. Mono for Android 篇二 使用Spinner 实现下拉列表读取Browser.BookmarksUri
  6. 【记】jQuery中的选择器:visible对visibility:hidden的处理
  7. LeapFTP 注册码
  8. 关于控件postback 后viewstate加载失败的问题
  9. 天空之城 matlab,[转载]matlab演奏《天空之城》代码
  10. 计算机社团竞选优势6,社团社长竞选稿六篇