tcp基础

博客链接

https://dongshao.blog.csdn.net/category_8925006_2.html

tcp总览

https://unlockdoc.smain.cn/online/2025-12-07/c8483e8abf88c986f97e7225056dffb8.html

https://blog.csdn.net/qq_41453285/article/details/104016416

三次握手

https://blog.csdn.net/weixin_45304503/article/details/142029483

https://blog.csdn.net/weixin_42462382/article/details/142220870

四次挥手

https://blog.csdn.net/m0_61990249/article/details/138587105

https://blog.csdn.net/michaelwoshi/article/details/121180561

TIME_WAIT 是 TCP 里最容易被误解的机制之一,但它的作用非常关键。
我用最清晰的方式给你讲明白:


TIME_WAIT 的本质作用:两个目的,缺一不可

保证“最后一个 ACK”能成功送达对方(可靠性)

四次挥手流程:

FIN → ACK → FIN → ACK

当主动关闭方发送最后一个 ACK 后:

  • 它无法知道这个 ACK 是否丢失!
  • 如果 ACK 丢了,对方会重发 FIN
  • 因此主动关闭方必须在某个时间窗口内保持连接状态,一旦收到 FIN,要重新 ACK

👉 TIME_WAIT 就是这个“等待重传 FIN 的时间窗口”


确保旧连接的数据不会污染新连接(安全性)

TCP 是基于 序列号(sequence number) 的。

假设旧连接的 FIN、ACK 或数据包在网络中延迟很久(几分钟都可能)。

如果立即释放端口并被新的连接使用:

旧连接的延迟包 → 到达新连接 → 被误以为属于新连接

这会造成 数据错乱、协议失效、连接崩溃

所以:

TIME_WAIT = 2 × MSL(Maximum Segment Lifetime)

MSL 是网络中一个 TCP 报文最大生存时间。

TIME_WAIT = 2MSL 就能保证旧包全部消失后,端口才真正可用。


关键总结(非常重要)

TIME_WAIT = 防止未来发生问题  
CLOSE_WAIT = 表示现在已经出问题

为什么 TIME_WAIT 一定是主动关闭方来承担?

因为 主动关闭方发送最后 ACK,它必须保证对方收到。

被动关闭方不需要确认 ACK,因此不需要等待。

所以:

  • 主动关闭方进入 TIME_WAIT
  • 被动关闭方进入 CLOSED,直接释放资源

这也是为什么服务器常常满屏 TIME_WAIT —— 因为是它主动关闭连接。


再补一条:TIME_WAIT 的典型时长

一般为 2MSL

  • Linux 默认 MSL≈30 秒 → TIME_WAIT = 60 秒
  • RFC 推荐 MSL=2 分钟 → TIME_WAIT=4 分钟(旧系统)

面试级总结(你可以直接背)

TIME_WAIT 的目的:

  1. 确保主动关闭方发送的最后 ACK 能被对方收到(处理丢包)。
  2. 确保旧连接的延迟报文无法污染新的连接(序列号安全)。

因此主动关闭的一方必须进入 TIME_WAIT,持续 2MSL 时间。

流量控制 —— 窗口、滑动窗口工作方式

https://blog.csdn.net/roboko_/article/details/149284068

拥塞控制 —— 慢启动、拥塞避免、快重传、快恢复

https://blog.csdn.net/qq_35448165/article/details/106951020

延时确认(延迟ACK)、Nagle算法

https://blog.csdn.net/qq_41453285/article/details/104121538

TCP重传机制

https://blog.csdn.net/LUCIAZZZ/article/details/146980256

TCP选线字段

https://blog.csdn.net/qq_41396647/article/details/129376978

半连接队列/全连接队列

https://blog.csdn.net/michaelwoshi/article/details/122646545

TCP 不为 accept 队列满而设置额外排队队列,而是丢弃第三次握手 ACK,让客户端重传,是为了:

  1. 防止服务器被攻击(不能保存额外未验证状态)
  2. 利用 TCP 自带的重传机制,无需额外设计队列
  3. 减少内核复杂性和资源占用
  4. 确保服务器资源只为已验证、可靠的连接提供
  5. 保护服务器,代价由客户端承担
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐