首页 > 其他分享 >TCP为什么要三次握手,而不是两次或四次?

TCP为什么要三次握手,而不是两次或四次?

时间:2023-04-16 10:07:18浏览次数:29  
标签:握手 报文 TCP 四次 三次 序列号 连接 服务端


文章目录

  • TCP为什么要三次握手,而不是两次或四次?
  • 三次握手才可以阻止重复历史连接的初始化(主要原因)
  • 同步双方初始序列号
  • 避免资源浪费
  • 小结

TCP为什么要三次握手,而不是两次或四次?

TCP连接时用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket,序列号和窗口大小称为连接。
以上三个方面分析三次握手原因:

三次握手才可以阻止重复历史连接的初始化(主要原因)

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

TCP为什么要三次握手,而不是两次或四次?_网络


网络堵塞情况下,如果一个旧的SYN报文比新的SYN报文早到达了服务端,那么此时服务端就会回一个SYN+ACK报文给客户端,此时报文中的确认号是91(90+1).

客户端收到后发现自己期望收到的确认号应该是100+1而不是91,于是就会回RST报文。

服务端收到RST报文后就会释放连接。

后续最新的SYN抵达服务端后就完成正常的三次握手。

旧的SYN报文成为历史连接,TCP三次握手最主要的原因就是防止历史连接初始化了连接。

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

TCP为什么要三次握手,而不是两次或四次?_三次握手_02


上图可见,服务端在向客户端发送数据前并没有阻止历史连接,导致服务端建立了一个历史连接,又白白发送数据,浪费了服务端资源

因此解决这种现象最好的就是在服务端发送数据前也就是建立连接前组织掉历史连接,要是实现这个功能就要三次握手

同步双方初始序列号

序列号作用:接收方可以去除重复数据,接收方可以根据数据包的序列号按序接受,可以标识发送出去的数据包那些已经被对方收到了(ACK)

TCP为什么要三次握手,而不是两次或四次?_tcp/ip_03


四次握手也能够可靠的同步双方的初始化序号,但第二步和第三步可以优化成异步,所以成了三次握手。

而两次握手只保证了一方的初始序列号能被对方成功接收。

避免资源浪费

两次握手,如果客户端发送的SYN报文在网络堵塞了,重复发送多次SYN报文,那么服务端在收到请求后就会建立多个冗余的无效链接,重复分配资源,造成不必要的资源浪费。

TCP为什么要三次握手,而不是两次或四次?_三次握手_04

小结

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

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


标签:握手,报文,TCP,四次,三次,序列号,连接,服务端
From: https://blog.51cto.com/u_15911055/6193302

相关文章

  • IP层会分片,为什么TCP层还需要MSS?
    MTU:一个网络包的最大长度,以太网一般为1500字节MSS:除去IP和TCP头部之后,一个网络包所能容纳的TCP数据的最大长度如果一个IP分片丢失,整个IP报文的所有分片都得重传。IP层进行分片传输没有效率:IP层没有超时重传机制,由传输层的TCP来负责超时和重传,当某个IP分片丢失后,接收方的IP层无法......
  • 为什么每次建立TCP连接时初始化的序列号都要求不一样
    为了防止历史报文被下一个相同的四元组的连接接受假设每次建立连接。客户端和服务端的初始化序列号都是从0开始的客户端和服务端建立了一个TCP连接,在客户端发送数据包被网络阻塞了然后超时重传了这个数据包,而此时服务端断电重启,之前与客户端建立的连接也消失了,于是收到客户端的数......
  • LYT-C#-Socket——简单的TCP服务端-客户端连接通信
    https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.tcplistener?view=netframework-4.8.1TCP编程的服务器端一般步骤是:1、创建一个socket,用函数socket()。2、设置socket属性。3、绑定本机的IP地址、端口等信息到socket上,用函数bind()。......
  • Centos 服务器放行TCP、UDP端口教程
     在运行CentOS操作系统时,经常需要放行某个端口,以便应用程序能够正常运行。今天飞飞将和你分享centos服务器放行tcp、udp端口教程,希望可以帮助到您~ 首先用SSH连接工具连接服务器,如果你不知道如何连接Linux服务器,可以参考下这篇教程 比如我们在安装宝塔后面板无法访问,提......
  • socket与TCP的关系
    Socket是一种抽象封装,等价于应用程序和网络中间的一层,以便在应用程序和操作系统内核之间传输数据。TCP是一个可靠的、面向连接的协议,用于在计算机之间传输数据。Socket可以用于创建TCP连接,在应用程序间传输数据,它们是紧密相关的,其中Socket提供了创建、绑定、监听、接受、连接、发......
  • tcp性能优化方法
    一、TCPfastopen原理简介:三次握手带来的延迟使得每创建一个新TCP连接都要付出很大代价。而这也决定了提高TCP应用性能的关键,在于想办法重用连接。TFO(TCPfastopen)允许服务器和客户端在连接建立握手阶段交换数据,从而使应用节省了一个RTT的时延。但是TFO会引起一些问题,因此......
  • 计算机网络 传输层协议TCP和UDP
    目录一、传输层协议二、tcp协议介绍三、tcp报文格式四、tcp三次握手五、tcp四次挥手六、udp协议介绍七、常见协议和端口八、有限状态机  一、传输层协议传输层协议主要是TCP和UDP协议主要作用1.分段和重组2.会话多路复用 二、tcp协议......
  • Python 实现tcp/ip协议&&CAN通信
    七层链路模型(Seven-LayerOSIModel)物数网传会表应--物理层、数据链路层、网络层、传输层、会话层、表示层(负责数据格式的转换和加密解密操作)和应用层。TCP/IP协议的四个层:应用层:应用层是TCP/IP协议中最高层,主要定义了各种应用程序的协议和数据格式。常见的应用层协议包括......
  • 汉枫HF2211,串口服务器 over tcp
      串口映射和tcp不能同时通信,串口和tcp,数据错乱。也可以找厂商询问帮助。 备注:同时使用,上位机软件和研华实用配置工具都会出现数据错乱不准。   ......
  • Linux tcpdump命令
    Linuxtcpdump命令非常强大的工具,只有root账号可以使用,是安全和黑客入侵必备工具tcpdump:verboseoutputsuppressed,use-v[v]...forfullprotocoldecodelisteningoneth0,link-typeEN10MB(Ethernet),snapshotlength262144bytes22:29:28.233024IP119.91.211.2......