TCP核心机制
1. TCP五大核心机制
1.1. 顺序问题(稳重不乱)
背景:网络传输中数据包可能因路径不同或网络波动导致乱序到达,需保证接收方能按正确顺序处理数据。
原理:
- 序列号(Sequence Number):每个数据包携带唯一序列号,接收方按序号重组数据。
- 累积确认(Cumulative ACK):接收方通过ACK确认“已收到的最大连续序号”,例如ACK=6表示1-5号包已按序接收。
- 缓存乱序包:接收方缓存非连续包,待缺失包到达后一并处理。
关键技术:
- 快速重传(Fast Retransmit):收到3次重复ACK(如ACK=5),立即重传缺失包(6号包)。
- SACK(Selective Acknowledgment):通过扩展选项标记已接收的非连续包范围(如SACK=8-9),帮助发送方精准重传。
在 TCP 里,接收端会给发送端报一个窗口的大小,叫Advertised window。
发送端需要保持下面的数据结构:
接受端需要保持下面的数据结构:
1.2. 丢包问题(承诺靠谱)
背景:网络拥塞或链路故障可能导致数据包丢失,需确保数据可靠传输。
原理:
- 超时重传(Retransmission Timeout, RTO):
RTT采样:动态计算往返时间(Round-Trip Time),加权平均历史值(SRTT)。
自适应超时:超时时间 = SRTT + 4×RTT波动值(RTTVAR),避免过早或过晚重传。
指数退避:超时后重传时间加倍(如2×RTO),防止加剧拥塞。
- 快速重传:触发条件为收到3次重复ACK,无需等待超时。
- SACK
示例:
发送方发送包6-9,若包7丢失,接收方持续发送ACK=6;发送方收到3次ACK=6后,立即重传包7。
1.3. 连接维护(有始有终)
背景:TCP是面向连接的协议,需明确建立和释放连接,防止资源泄漏。
原理:
三次握手(建立连接):
- SYN:客户端发送初始序列号(seq=x)。
- SYN-ACK:服务端确认x+1(ack=x+1),并发送初始序列号(seq=y)。
- ACK:客户端确认y+1(ack=y+1),双方进入ESTABLISHED状态。
- 为什么不是两次?:防止历史SYN包导致无效连接(如网络延迟的重传包)。
四次挥手(释放连接):
- FIN:主动方发送终止请求。
- ACK:被动方确认。
- FIN:被动方处理完数据后发送终止请求。
- ACK:主动方确认,进入TIME_WAIT状态(等待2MSL)。
- TIME_WAIT作用:确保最后一个ACK到达,避免旧连接数据干扰新连接。
异常处理:
- Keepalive机制:长时间无数据时发送探测包,检测连接存活。
- RST包:强制终止异常连接(如对方进程崩溃)。
1.4. 流量控制(把握分寸)
背景:防止发送速率超过接收方处理能力,导致缓冲区溢出。
原理:
- 滑动窗口(Sliding Window):
接收窗口(rwnd):接收方通过ACK告知剩余缓冲区大小(Advertised Window)。
发送窗口:发送方限制未确认数据量 ≤ min(rwnd, cwnd)。
关键策略:
- 零窗口探测:当rwnd=0时,发送方定期发送1字节探测包,避免死锁。
- 糊涂窗口综合征避免:接收方在缓冲区有足够空间(如≥1MSS)时才更新窗口。
示例:
接收方缓冲区满时,发送ACK携带rwnd=0,发送方暂停发送;待接收方处理数据后,通过ACK更新rwnd恢复传输。
1.5. 拥塞控制(知进知退)
背景:防止发送速率超过网络承载能力,导致全局性丢包和拥塞崩溃。
原理:
- 拥塞窗口(cwnd):动态调整的发送速率上限,与rwnd共同限制发送量。
- 核心算法:
慢启动(Slow Start):
初始cwnd=1 MSS,每RTT指数增长(cwnd×2)。
当cwnd≥ssthresh(慢启动阈值,默认65535字节)时进入拥塞避免。
拥塞避免(Congestion Avoidance):
每RTT线性增长(cwnd += 1 MSS)。
快重传与快恢复:
收到3次重复ACK时,ssthresh=cwnd/2,cwnd=ssthresh+3,进入线性增长。
超时重传:
ssthresh=cwnd/2,cwnd=1,重新慢启动。
优化算法(如BBR):
带宽与时延探测:动态计算最大带宽(BtlBw)和最小RTT(RTprop),按BtlBw×RTprop设置cwnd,避免填满中间设备缓存。
示例:
网络拥塞时,传统TCP通过丢包触发降速;BBR通过测量带宽和时延主动调整,保持高吞吐和低延迟。
总结:
机制 | 核心目标 | 关键技术 | 关键参数/算法 |
顺序问题 | 数据按序到达 | 序列号、累积确认、SACK | 快速重传、SACK选项 |
丢包问题 | 数据可靠传输 | 超时重传、快速重传 | RTT计算、指数退避 |
连接维护 | 明确连接生命周期 | 三次握手、四次挥手、TIME_WAIT | Keepalive、RST |
流量控制 | 匹配发送与接收速率 | 滑动窗口、零窗口探测 | rwnd、MSS |
拥塞控制 | 避免网络过载 | 慢启动、拥塞避免、快恢复、BBR | cwnd、ssthresh、BtlBw、RTprop |