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

TCP创建通信前的三次握手(为啥不是两次?)

1.三次握手的过程

  • 客户端发送 SYN(同步)报文
    • 客户端向服务器发送 SYN 标志的数据包,请求建立连接,表示 "你好,我要连接你"。
  • 服务器回复 SYN+ACK(同步+确认)报文
    • 服务器收到 SYN 后,确认收到请求并回复一个包含 SYNACK 标志的数据包,表示 "好的,我同意,建立连接吧,你确定吗?"
  • 客户端发送 ACK(确认)报文
    • 客户端收到服务器的 SYN+ACK 后,回复一个 ACK 确认数据包,表示 "是的,我确定,连接已建立"。

2.为什么 TCP 不使用两次握手?(避免服务端和客户端的资源浪费)

如果采用 两次握手(假设的情景),一般包括以下两个步骤:

  1. 客户端发送 SYN(同步)请求:客户端向服务器发送 SYN 报文,表示 "你好,我要连接你"。
  2. 服务器回复 SYN+ACK(同步+确认)响应:服务器收到客户端请求后,返回 SYN+ACK 报文,表示 "好的,我同意,建立连接吧"。
  • 假设客户端发送 SYN 请求,但由于网络延迟,这个请求迟迟没有到达服务器,客户端在超时后放弃连接,并重新发送新的 SYN 请求。
  • 旧的 SYN 请求后来又因为网络问题到达服务器,如果是两次握手机制,服务器收到后直接建立连接,此时服务器会误以为客户端要建立连接,导致错误的连接建立(僵尸连接)。

两次握手的缺陷:

  1. 无法确认客户端是否收到了服务器的 SYN+ACK 响应

    服务器会认为连接已建立,等待客户端发送数据,而客户端可能未收到 SYN+ACK,导致连接不同步。
  2. 旧的连接请求可能引发问题

    由于网络延迟或重复请求,可能会导致服务器误以为客户端要重新建立连接,导致资源占用(僵尸连接)。

因此,TCP 使用三次握手,在第二步后,客户端再发送一次 ACK 确认,确保双方都能正常通信,避免上述问题。


http://www.kler.cn/a/512612.html

相关文章:

  • EXCEL的一些用法记录
  • 不用编程即可实现多台PLC的MQTT协议JSON文件发布与订阅的智能网关的配置说明
  • 【日志篇】(7.6) ❀ 01. 在macOS下刷新FortiAnalyzer固件 ❀ FortiAnalyzer 日志分析
  • 软件的收费方式
  • QLineEdit 在文本发生变更时触发事件几种方式详细说明
  • wps数据分析000002
  • 创建基于Prism框架的WPF应用(NET Framework)项目
  • 打开DevEco Studio后,选择“Create New Project”
  • docker运行Java项目,Kaptcha因为字体缺失没法显示验证码图片
  • Spring Boot自动配置原理:如何实现零配置启动
  • STM32之CubeMX新建工程操作(十八)
  • npm的包管理
  • Redis Windows 解压版安装
  • AIGC视频生成模型:ByteDance的PixelDance模型
  • 51c~缺陷检测~合集2
  • CAN 网络介绍
  • mysql 如何清理磁盘碎片
  • 怎么使用langchain和ollama自己简单开发搭建一个本地有记忆的大模型?
  • LLM 的星辰大海:大语言模型的前世今生
  • Python毕业设计选题:基于django+vue的二手电子设备交易平台设计与开发
  • ServiceEntry 是一种用于将外部服务引入到Istio内部的服务注册表中的配置资源。
  • kafka学习笔记6 ACL权限 —— 筑梦之路
  • PC端自动化测试实战教程-1-pywinauto 环境搭建(详细教程)
  • 面试题-redis的大key与热key
  • 系统架构演进:从单体到微服务的智能转型
  • Spring boot启动原理及相关组件