它确保你点的每一份外卖、刷的每一个视频、敲的每一行消息, 都能按顺序、不丢、不重复地从一台机器送到另一台机器。
从快递员的比喻出发,理解面向连接、可靠、字节流。
20 字节首部里藏了什么秘密。
连接的建立与拆除。
为什么 TCP 永远送达。
慢启动 · 拥塞避免 · 快重传 · 快恢复
一句话记住 TCP。
你寄出 10 个包裹,他保证:
① 一个都不会丢,丢了他重发;
② 顺序不会乱,到件时按编号排好;
③ 不会送重复,对方签收他才放心。
序列号给每个字节编号,丢包检测和按序重组都靠它。
确认号=对方下一个该发的字节号。"我收到 x 前的所有数据。"
SYN 发起连接 · FIN 关闭连接 · RST 强制断开 · ACK 表示有效
窗口大小告诉对方"我还能接收多少",用于流量控制。
想象一个早就被网络遗忘的旧连接请求,突然延迟送达。 如果只两次握手,服务端立刻就建立了一条幽灵连接, 白白消耗资源等数据。
三次握手让双方都确认自己的发送和接收能力都正常, 同时同步初始序列号,过滤掉幽灵 SYN。
TCP 把要发的数据想象成连续的字节流, 每一字节都有一个连续递增的编号。
对方说 ack=1009, 意思是 "1009 以前的我都收到了,下一个发 1009"。
发送方不必等每个 ACK 才发下一个,而是一次塞满整个窗口, 收到 ACK 后窗口向右滑动 — 这就是"边走边发"的秘密。
RTO(Retransmission Timeout)= 根据 RTT 动态计算的"该等多久"。
cwnd 每 RTT 翻倍,直到达到 ssthresh。
每 RTT 增加 1 MSS,温柔地探测带宽上限。
ssthresh 减半,cwnd 重置或减半。
3 个 dup ACK 后从 ssthresh 直接进入拥塞避免。
cwnd 每个 RTT 翻倍。听起来"快",叫"慢"是相对于一开始就发满。
超过 ssthresh 后变线性,每 RTT 加 1,避免冲过头。
收到 3 个重复 ACK 立即重传,不必等 RTO 超时。
配合快重传:不回到 1,直接从 ssthresh 进入拥塞避免。