一、数据传输与 MSS 分段:TCP 如何 "高效切分" 数据
TCP 的数据传输不是直接发送应用层的原始数据,而是通过MSS(最大分段大小) 切分为合适的报文段 ------ 这是避免网络层低效分片、提升传输可靠性的关键。
1. 先搞懂:MSS 是什么?和 MTU 的关系?
- MTU(最大传输单元) :链路层(如以太网)的最大帧长度(默认 1500 字节),超过 MTU 的 IP 数据报会被IP 层分片(中间网络设备处理,效率低)。
- MSS(最大分段大小) :TCP 报文段中数据部分的最大长度 ,公式为:
MSS = MTU - IP首部长度(默认20字节) - TCP首部长度(默认20字节)以太网下默认 MSS=1500-20-20=1460 字节。
2. 为什么需要 MSS 分段?
IP 层分片的缺点是:
- 分片由路由器等中间设备处理,消耗网络资源;
- 只要有一个分片丢失,整个 IP 数据报都要重传。
而TCP 的 MSS 分段是 "端系统主动切分":
- 发送方在三次握手时,通过
MSS选项协商双方支持的最大分段大小; - 发送方将应用数据切分为≤MSS 的 TCP 报文段,确保每个 TCP 报文段对应的 IP 数据报不超过 MTU,避免 IP 层分片。
3. MSS 分段示例
假设应用层发送 2000 字节数据,双方协商的 MSS=1460:
- 发送方将 2000 字节切分为2 个 TCP 报文段 :
- 第 1 段:数据 1460 字节 → 对应 IP 数据报大小 = 1460+20+20=1500 字节(刚好等于 MTU);
- 第 2 段:数据 540 字节 → 对应 IP 数据报大小 = 540+20+20=600 字节。
- 接收方收到后,按 TCP 序号重组为 2000 字节的完整数据,无 IP 分片开销。
二、重传与确认:TCP 如何保证 "数据不丢"
TCP 的可靠传输依赖确认机制 (接收方告诉发送方 "收到了什么")和重传机制(发送方补发丢失的数据),核心是 "确保每一个字节都被接收"。
1. 确认机制:累计确认与 SACK
(1)累计确认(默认)
- 原理:接收方回复的确认号是 "期望收到的下一个字节的编号",代表 "我已收到所有≤确认号 - 1 的字节"。
- 示例:发送方发送字节 1-1000(报文段 A)、1001-2000(报文段 B);接收方收到 A 和 B 后,回复确认号 2001 → 表示 "1-2000 字节都收到了"。
- 缺点:若中间报文段丢失(如收到 A、没收到 B、收到 C),接收方只能回复确认号 1001,发送方会重传 B 及之后的所有报文段("冗余重传")。
(2)选择性确认(SACK,扩展选项)
- 原理:接收方通过
SACK选项,明确告诉发送方 "哪些字节段已收到",避免冗余重传。 - 示例:发送方发送 A(1-1000)、B(1001-2000)、C(2001-3000);接收方收到 A、C,没收到 B → 回复确认号 1001 + SACK 信息 "1-1000、2001-3000 已收到";发送方仅重传 B(1001-2000),无需重传 C。
2. 重传机制:超时重传与快速重传
(1)超时重传
- 原理:发送方发送每个报文段后,启动RTO 定时器(超时时间);若定时器到期前未收到对应 ACK,重传该报文段。
- 缺点:RTO 需适配网络延迟,若 RTO 过短会导致 "不必要的重传",过长则会延迟恢复丢包。
(2)快速重传(更高效)
- 原理:若发送方收到3 个重复的 ACK(确认号相同),说明 "中间有报文段丢失",无需等 RTO 超时,直接重传丢失的报文段。
- 示例:发送方发 A(1-1000)、B(1001-2000)、C(2001-3000);接收方收到 A、C、D → 每次收到后都回复确认号 1001(期望 B);发送方收到 3 个确认号 1001 的 ACK → 立即重传 B。
三、RTO 重传定时器的计算:如何动态适配网络延迟
RTO(Retransmission Timeout)是超时重传的时间阈值 ------ 不能固定 RTO(网络延迟会动态变化),需基于RTT(往返时间) 动态计算。
1. 核心概念:RTT 相关指标
- SampleRTT:单次测量的往返时间(发送报文段到收到对应 ACK 的时间);
- SRTT(平滑 RTT):SampleRTT 的加权平均值,消除单次测量的波动;
- RTTVAR(RTT 偏差):SampleRTT 与 SRTT 的差值的加权平均,反映 RTT 的波动程度。
2. RTO 的计算流程(RFC 6298 标准)
(1)初始化(首次测量)
- 首次 SampleRTT 记为
SRTT = SampleRTT; RTTVAR = SampleRTT / 2;RTO = SRTT + max(G, 4*RTTVAR)(G 是时钟粒度,通常为 100ms)。
(2)后续更新(每次新 SampleRTT)
- 计算新的 RTTVAR:
RTTVAR = (1-β) * RTTVAR + β * |SampleRTT - SRTT|(β=0.25) - 计算新的 SRTT:
SRTT = (1-α) * SRTT + α * SampleRTT(α=0.125) - 计算新的 RTO:
RTO = SRTT + max(G, 4*RTTVAR)
3. 计算示例
假设:
- 初始 SRTT=200ms,RTTVAR=100ms,G=100ms;
- 新 SampleRTT=250ms。
计算过程:
- 新 RTTVAR = (1-0.25)100 + 0.25|250-200| = 75 + 12.5 = 87.5ms;
- 新 SRTT = (1-0.125)200 + 0.125250 = 175 + 31.25 = 206.25ms;
- 新 RTO = 206.25 + max (100, 4*87.5) = 206.25 + 350 = 556.25ms。