网上关于这个问题吵得很凶,但是仔细看过之后我更偏向认为两种说的是一样的。

首先我们来看看 TCP 协议的三次握手过程

如上图所示:

解释一下里面的英文:

  • 里面起到作用的一些标志位就是TCP报文首部里的内容,ACK确认标志位,SYN同步标志位,ack确认号;
  • 两端的状态CLOSED 就是连接关闭状态,LISTEN状态就是监听状态,SYN-SENT就是同步已发送状态,SYN-RCVD就是同步已接受状态,ESTABLISHED就是连接已建立状态。

三报文挥手的过程如下:

  1. 客户端发送连接请求:头部SYN=1,表明这是一个TCP连接请求报文段,序号seq有一个初始值,作为TCP客户进程选择的初始序号。(SYN=1的报文是不能携带数据的)
  2. 服务器发送针对收到的连接请求的确认:头部SYN=1,确认位ACK=1,表明是一个TCP请求确认报文段,seq设定初值y,作为服务器进程选择的初始序号,确认号字段ack=x+1,是对刚才客户端的x的确认(不能携带数据)
  3. 客户端发送针对请求确认的确认:发送一个普通的TCP确认报文段,进入连接已建立状态。这个报文的ACK设为1,表明是一个TCP确认报文段,seq=x+1是继续发送的序号,确认号字段ack=y+1是对上一个发出去的y的后续。

随后,服务器收到了客户端的3,那么就开始进入已建立状态,通信开始了。

简单来说,三个报文分别是,请求-请求确认-请求确认确认(禁止套娃)

一、教材版

原因一:主要是防止客户端发出的已经失效的连接请求报文段,又发送到了服务器,从而导致错误,白白浪费资源。

具体情况是,如果只有两报文握手:

  1. C发请求,某些原因没到S;
  2. C又发,到了S,这个时候因为没有三握手,两报文后,建立了正常通信,完了结束通信,两边连接都关闭了。
  3. C的第一条请求到了S,S又给了回应,因为是两握手,S觉得只用等C发请求就可以了,S是established状态,结果C是closed,白白浪费服务器资源。

这种说法也来自于《计算机网络的课本》:

“已失效的连接请求报文段” 的产生在这样一种情况下:client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。

二、知乎及各论坛讨论的另一种

原因二:这种说法来自于对 RFC 的官方文档说法的解读。

因为TCP 设计中一个基本设定就是,通过TCP 连接发送的每一个包,都有一个sequence number。而因为每个包都是有序列号的,所以都能被确认收到这些包。确认机制是累计的,所以一个对sequence number X 的确认,意味着 X 序列号之前(不包括 X) 包都是被确认接收到的。

  • 结合上面的报文握手的示意图,也就是说客户端发出的 seq=X,则 服务器对 X 的确认是 ack=X+1,就是这个意思。

TCP 协议不限制一个特定的连接(两端 socket 一样)被重复使用。所以如果一条连接突然断开重连后,TCP 怎么样识别之前旧链接重发的包?——这就需要独一无二的 ISN(初始序列号)机制。那么这个机制具体实现利用了时钟blabla生成这个可以认为是独一无二的 ISN,那么例子就是:

  1. A --> B SYN my sequence number is X
  2. A <-- B ACK your sequence number is X
  3. A <-- B SYN my sequence number is Y
  4. A --> B ACK your sequence number is Y

其实对应到上面的三次握手示意图,也是一样的东西。最后得出结论:

A three way handshake is necessary because sequence numbers are not tied to a global clock in the network, and TCPs may have different mechanisms for picking the ISN's. The receiver of the first SYN has no way of knowing whether the segment was an old delayed one or not, unless it remembers the last sequence number used on the connection (which is not always possible), and so it must ask the sender to verify this SYN. The three way handshake and the advantages of a clock-driven scheme are discussed in [3].

第一句话翻译就是,因为 seq 这个东西,并不是和网络中的全局时钟绑定的,并且 TCP 协议实现这个初始序列号 ISN 的机制有很多种,所以三次握手是必须的。(?)

第二句话翻译就是,第一个接收方,假如我们说是服务器,没办法知道这个报文段是不是 old delayed ,除非记住上一次的seq,然而并不总是可能的,所以必须服务器发给发送端一个报文去判别这次的报文段。那我们结合上面的这个例子

  1. A --> B SYN my sequence number is X
  2. A <-- B ACK your sequence number is X
  3. A <-- B SYN my sequence number is Y
  4. A --> B ACK your sequence number is Y

这句话意思就是,服务器接收了,还要把发送确认过去,再让对方确认,如果没有第三次握手,也就是说上面的四个步骤就只用省略为 1) 2)3),连接直接建立成功。

发现点什么了吗……到这里的问题和谢希仁老师课本里所讲的那种情况是一样的……

所以,吵什么吵,今天我们之所以团聚在这里。。。。

计算机网络:TCP协议建立连接的过程为什么是三次握手而不是两次?【对于网上的两种说法我的思考】的更多相关文章

  1. TCP三次握手和四次握手全过程 为什么要三次握手而不是二次握手?

    三次握手 第一次握手: 客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握手: 服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送 ...

  2. HTTPS建立连接的过程

    HTTP建立连接的过程点击:HTTP三次握手.一次HTTP请求都发生了什么 一.HTTPS   HTTP是超文本传输协议.HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私 ...

  3. 【转】HTTPS建立连接的过程

    原文链接:https://www.cnblogs.com/shiqi17/p/9756880.html https://www.jianshu.com/p/bd75ab32ae57 HTTP建立连接的 ...

  4. SQL Server 2008 报错:已成功与服务器建立连接,但是在登录前的握手期间发生错误

    今天SqlServer 2008连接数据库时报错:已成功与服务器建立连接,但是在登录前的握手期间发生错误.在连接到 SQL Server 2008 时,在默认的设置下 SQL Server 不允许远程 ...

  5. 已成功与服务器建立连接,但是在登录前的握手期间发生错误。 (provider: SSL Provider, error: 0 - 等待的操作过时)

    今天忽然间发现远程连接别人数据库会出现  已成功与服务器建立连接,但是在登录前的握手期间发生错误. (provider: SSL Provider, error: 0 - 等待的操作过时)  这种情况 ...

  6. SQLServer 2012 已成功与服务器建立连接,但是在登录前的握手期间发生错误。 (provider: SSL Provider, error: 0 - 等待的操作过时。

    楼主用SQL Server 2012 在连接其他电脑的实例时,一直提示“已成功与服务器建立连接,但是在登录前的握手期间发生错误. (provider: SSL Provider, error: 0 - ...

  7. SQLServer 2008 已成功与服务器建立连接,但是在登录前的握手期间发生错误。 (provider: SSL Provider, error: 0 - 等待的操作过时。

    在用SQL Server 2008 在连接其他电脑的实例时,一直提示“已成功与服务器建立连接,但是在登录前的握手期间发生错误. (provider: SSL Provider, error: 0 - ...

  8. SQL Server System.Data.SqlClient.SqlException:已成功于服务器建立连接,但是在 登录前的握手期间发生错误

    一.错误描述 错误名称如上.整体错误如下: System.Data.EntityException 基础提供程序在Open上失败--> System.Data.SqlClient.SqlExce ...

  9. HTTP协议建立连接、通讯与关闭连接全过程

    为解决服务器TimeWait多的问题,了解了一下TCP/IP协议的连接过程.以访问一静态页面为例,从建立连接到访问拿到数据,然后关闭的整个过程.使用EtherPeek截图如下:   图首为一次交互过程 ...

随机推荐

  1. Centos-修改文件访问和修改时间-touch

    touch 如果文件存在,则改变文件的访问时间和修改时间,如果不存在则创建一个空文件 相关选项 -a   更改文件访问时间为当前系统时间 -m     更改文件修改时间为当前系统时间 -c   如果文 ...

  2. 016 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 10 布尔类型和字符串的字面值

    016 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 10 布尔类型和字符串的字面值 本文知识点:字面值 关于字面值的概念,需要注意:很多地方,我们可能就把字面值 ...

  3. Vue自定义Popup弹窗组件|vue仿ios、微信弹窗|vue右键弹层

    基于vue.js构建的轻量级Vue移动端弹出框组件Vpopup vpopup 汇聚了有赞Vant.京东NutUI等Vue组件库的Msg消息框.Popup弹层.Dialog对话框.Toast弱提示.Ac ...

  4. 题解:POI2012 Salaries

    题解:POI2012 Salaries Description The Byteotian Software Corporation (BSC) has \(n\) employees. In BSC ...

  5. python算法常用技巧与内置库

    python算法常用技巧与内置库 近些年随着python的越来越火,python也渐渐成为了很多程序员的喜爱.许多程序员已经开始使用python作为第一语言来刷题. 最近我在用python刷题的时候想 ...

  6. 不是计算机专业的,可以转专业甚至转行学IT吗?答案揭晓~

    相信有这样疑惑的同学不在少数,随着互联网的快速发展,越来越多的人想要转行到IT行业,可又担心自己的专业不对口,影响将来的发展,那么究竟不是计算机专业的可以转行IT吗? 当然是可以的,其实很多的IT大佬 ...

  7. C++里面类和对象是什么意思?

    本文章向大家介绍C++类和对象到底是什么意思?,主要包括C++类和对象到底是什么意思?使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下.   C++ 是一门 ...

  8. [leetcode] 周赛 211

    比赛题目:https://leetcode-cn.com/circle/discuss/luvHfG/ 两个相同字符之间的最长子字符串 题目:5543. 两个相同字符之间的最长子字符串. 开始理解错题 ...

  9. Logstash 国内加速下载 转

    Logstash. 国内直接从官网(https://www.elastic.co)下载比较困难,需要一些技术手段.这里提供一个国内的镜像下载地址列表,方便网友下载. 找不到想要的版本?您可以访问 索引 ...

  10. Spring Boot 整合多点套路,少走点弯路~

    持续原创输出,点击上方蓝字关注我 个人原创博客+1,点击前往,查看更多 目录 前言 Spring Boot 版本 找到自动配置类 注意@Conditionalxxx注解 注意EnableConfigu ...