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 |

相关推荐
星空寻流年3 小时前
设计模式第六章(观察者模式)
网络·观察者模式·设计模式
Vahala0623-孔勇3 小时前
微服务接口性能优化终极指南:从HTTP/2多路复用到gRPC选型,序列化性能一网打尽
http·微服务·性能优化
安娜的信息安全说3 小时前
工业与信息安全的交汇点:IT 与 OT 安全融合
网络·安全·web安全
init_23614 小时前
路由策略和流量策略的常见配置
运维·服务器·网络
安当加密4 小时前
如何利用开源库和安全芯片设计fido令牌
网络·安全·开源
YC运维5 小时前
Nginx核心配置详解:访问控制、用户认证与HTTPS部署
网络·nginx·https
apple_ttt6 小时前
融合:迈向 “一台计算机” 的终极架构
网络·架构·cxl·数据中心网络
祁弋7 小时前
UDP的理解
网络·网络协议·udp
独行soc8 小时前
2025年渗透测试面试题总结-98(题目+回答)
网络·安全·web安全·adb·面试·渗透测试·安全狮
十二月将至9 小时前
python读取文件的常用操作
网络·python