从三次握手到拥塞控制,探索互联网数据传输背后的精密设计
一种面向连接的、可靠的、基于字节流的传输层协议(RFC 793)
通信双方必须先通过三次握手建立连接,数据传输结束后再通过四次挥手释放连接。
通过序号确认、超时重传、校验和等机制,保证数据不丢失、不重复、按序到达。
应用层数据被视为无结构的连续字节流,TCP 按需分段封装,不保留消息边界。
连接建立后,通信双方可以同时发送与接收数据,两个方向互不干扰。
可靠性与效率之间的权衡,两种截然不同的设计哲学
20 字节固定首部,承载着可靠传输所需的全部控制信息
确保双方都具备收发能力,防止已失效的连接请求突然到达服务器
发送方在窗口范围内连续发送数据,无需等待每个包单独确认
接收方通过首部中的 rwnd 字段,动态告知自己还能接收多少数据
发送方结合网络拥塞状况,自适应调整拥塞窗口 cwnd
cwnd 从 1 个 MSS 开始,每收到一个 ACK 就翻倍,呈指数增长。
达到 ssthresh 后转为线性增长,每个 RTT 增加 1 个 MSS。
收到 3 个重复 ACK 立即重传;出现丢包时 ssthresh 减半。
cwnd 直接降为 ssthresh 而非回到 1,避免流量剧烈波动。
全双工连接需双方分别确认,才能安全释放
TCP 用精密的状态机与算法,在不可靠的网络之上,构建起一座可靠的通信基石