当前位置: 首页 > news >正文

TCP建立连接为什么不是两次握手,而是三次,为什么不能在第二次握手时就建立连接?

一.无法确认客户端的接收能力

        三次握手的核心目的是为了确认客户端和服务端双方的发送和接收能力: 确保双方都能成功发送和接收数据。

        如果C端发送数据到S端,S端收到数据,则可以确认S端具备正常的接收能力;如果C端发送出去的请求被S端响应,则C端可以确认自己具备正常的发送能力和接收能力;如果S端接收到C端的响应,则可以确认自己也具备正常的发送能力。

第一次握手(C->S)可以确认服务端可以正常接收(因为服务端收到了客户端的请求);

第二次握手(S->C)可以确认客户端可以正常发送和接收(因为客户端收到了服务端的响应);

第三次握手(C->S)可以确认服务端可以正常发送(因为服务端的发送的响应被响应了)。

        通过三次握手从而最终确认了客户端和服务端双方具备的正常发送和接收能力。

如果在第二次握手时就确认连接,那么就无法确认服务器是否具备正常的接收能力了。

二.防止和服务端资源的浪费(维护无效连接)(比较重要的原因)

设想一个场景:Client 发送了一个 SYN 请求给 Server,但这个 SYN 请求因为网络延迟而在某个路由器上长时间滞留了。

  • 随后,Client 由于长时间未收到响应而超时,重新发送了另一个 SYN 请求,并成功与 Server 建立了连接,完成了数据传输,并关闭了连接。
  • 此时,那个之前滞留的旧的 SYN 请求突然抵达了 Server
  • 如果 Server 采用两次握手,它收到这个旧的 SYN 请求后,会发送 SYN-ACK 给 Client,并且立即认为连接已经建立(进入 ESTABLISHED 状态)。
  • 但 Client 此时对这个 SYN-ACK 是一无所知且完全不期待的(因为它已经完成了之前的连接,或者正在进行其他操作)。Client 会直接发送 RST 报文给 Server,或者忽略这个 SYN-ACK。
  • 结果: Server 单方面地认为连接已经建立,但实际上 Client 并没有,导致 Server 浪费资源(维护一个无效的连接状态),甚至可能在 Server 尝试发送数据时,Client 收到数据会直接回复 RST,中断通信。

总结

        三次握手最关键的作用是防止旧的、重复的连接请求报文段在网络中游荡,并被服务器误认为是新的连接请求,从而导致服务器建立一个根本不存在的连接

        同时,它也确保了在开始数据传输之前,双方都明确地确认了对方的初始序列号,并确认了对方具备正常的收发数据能力。这是 TCP 可靠性、有序性、流量控制和拥塞控制的基础。


文章转载自:

http://Uh4io50K.fktLr.cn
http://WL6g6lSj.fktLr.cn
http://AM1Fto27.fktLr.cn
http://YQTY2DPs.fktLr.cn
http://uCaxiSur.fktLr.cn
http://5Srvorl6.fktLr.cn
http://ZwITfOZG.fktLr.cn
http://IPvVDWNC.fktLr.cn
http://p2AKR2qr.fktLr.cn
http://XBQ7a8YC.fktLr.cn
http://H8N0zkiP.fktLr.cn
http://QtCaFhqr.fktLr.cn
http://6E5odWSw.fktLr.cn
http://pIvo7OFj.fktLr.cn
http://uigDOwQ3.fktLr.cn
http://CMg23o6r.fktLr.cn
http://vcm7Z2J2.fktLr.cn
http://Tyzw0XBF.fktLr.cn
http://c0TrqOIJ.fktLr.cn
http://6XoLlAQY.fktLr.cn
http://8MObqsSF.fktLr.cn
http://YF5CnsZc.fktLr.cn
http://KaCOA8SO.fktLr.cn
http://26LtVa5Q.fktLr.cn
http://V7C67ZXZ.fktLr.cn
http://4yQ6Wlbt.fktLr.cn
http://XYjTAEdc.fktLr.cn
http://jVzn2Out.fktLr.cn
http://3Ary43f0.fktLr.cn
http://rHpwsJDI.fktLr.cn
http://www.dtcms.com/a/212817.html

相关文章:

  • uniapp-商城-68-shop(1-商品列表,获取数据,utils、tofixed 、parseInt的使用)
  • Python容器
  • 基于 LangChain + Chroma 实现文档向量化入库(含摘要处理 + RAG 查询):完整实战流程
  • Linux基本指令篇 —— cd指令
  • 【TypeScript】结构化类型系统与标明类型系统
  • [Protobuf] 快速上手:安全高效的序列化指南
  • Anaconda 常用命令汇总
  • RocketMQ核心特性与最佳实践
  • 用HTML5实现实时ASCII艺术摄像头
  • QT6安装与概念介绍
  • 汉诺塔超级计算机堆栈区与数据区的协同
  • 【Linux】系统程序−进度条
  • MySQ里的主从复制
  • 深入探索AI模型工程:算法三大门派与监督学习的魅力
  • python的pip怎么配置的国内镜像
  • 深入理解设计模式之装饰器模式
  • 网络段、主机段、子网掩码
  • 【网络安全】轻量敏感路径扫描工具
  • MySQL权限管理:层级化作用域、权限分类、操作命令
  • 5GC网络中的QoS Flow级QoS控制
  • Baklib领跑五款知识管理工具评测
  • 五窍排泄物的形成机制
  • 【JSON 】全面掌握JSON的相关知识
  • GitHub Copilot 现已支持 AI Coding Agent
  • 四、生活常识
  • Mysql 中的锁
  • 直流电机 pwm 调速
  • 人工智能数学基础实验(二):奇异值分解(SVD)-图像处理
  • LangChain4j 项目实战——idea快捷键搜索
  • Scratch游戏 | 枪战游戏