网站首页 > 教程文章 正文
一句话总结
三次握手=“我能发→你能收→我知道你能收”,两次握手保证不了双方 都 确认通路可用,而四次又可把“确认 + 发起”合并成一次包,因此恰好三次最经济;若任意报文丢失或主机发完 SYN 就宕机,TCP 都靠 超时重传 + 半开连接清理 机制自动收场。
1. 三次握手流程回顾
2. 为什么必须“三次”——两次 / 四次都不行?
场景 | 说明 |
两次握手 | (1)C→S:SYN (2)S→C:SYN+ACK |
三次握手 | 第 3 包 ACK 让 S 确认“自己的 SYN+ACK 已被 C 收到”,至此双向通信能力得到验证。 |
四次握手 | 可把第 2 步拆成 “ACK(确认对方)” + “SYN(自己发起)”,但 TCP 把两包合并为一包 SYN|ACK,节省 RTT,没有必要多一步。 |
结论:三次 = 两端各自确认一次 + ACK/SYN 合包,既可靠又高效。
3. 若握手报文丢失,会发生什么?
丢失的报文 | 状态变化 & 补救 | 结果 |
① 客户端 SYN | C 超时重传 SYN;S 无感知 | 连接延迟增加 |
② 服务器 SYN + ACK | C 等不到响应,重传 SYN;S 收到重复 SYN,再发 SYN+ACK | 连接延迟增加;S 重传次数受tcp_synack_retries控制 |
③ 客户端最后 ACK | S 仍处SYN_RCVD,超时重发 SYN+ACK; | 最终成功;若 C 不回 ACK,S 会重传数次后 丢弃半开 |
4. 如果主机在发送完 SYN 后宕机(半开连接)怎么办?
- 场景C:SYN发出 → 宕机 / 掉线S:进入SYN_RCVD,占用 backlog
- 服务器处理按 RTO 指数退避重发 SYN+ACK,尝试tcp_synack_retries(默认 5)次仍无 ACK → 把该条目从队列移除,资源自动释放
- 进一步防护SYN Cookies:backlog 满时不保存状态,只在 ACK 中反推校验,抵御 SYN Floodtcp_abort_on_overflow=1:队列溢出立刻RST,避免死占端口
- 客户端恢复上线的情况因未持久化 SEQ,重连时会带新 ISN,旧握手在服务器侧最终超时作废,不冲突。
猜你喜欢
- 2025-08-21 TCP协议原理,有这一篇就够了_tcp协议技术
- 2025-08-21 TCP三次握手和四次挥手详解_tcp三次握手的作用
- 2025-08-21 深入解析常见三次握手异常_深入解析常见三次握手异常行为
- 2025-08-21 连肝7个晚上,总结了66条计算机网络的知识点
- 2025-08-21 Linux实例常用内核网络参数介绍与常见问题处理
- 2025-08-21 01-安装配置maxscale-6.0,mysql中间件
- 2025-08-21 TCP 的三次握手,四次挥手和重要的细节—干货满满,建议细读
- 2025-08-21 Linux使用中的一些问题及解决过程(记录1)
- 2025-08-21 DDOS攻击会带来什么危害?有什么应对策略?
- 2025-08-21 浅析大规模DDOS防御架构 应对T级攻防(1)
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)