TCP 可靠传输核心:MSS 分段、重传确认与 RTO 定时器解析

一、数据传输与 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. 第 1 段:数据 1460 字节 → 对应 IP 数据报大小 = 1460+20+20=1500 字节(刚好等于 MTU);
    2. 第 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。

计算过程:

  1. 新 RTTVAR = (1-0.25)100 + 0.25|250-200| = 75 + 12.5 = 87.5ms;
  2. 新 SRTT = (1-0.125)200 + 0.125250 = 175 + 31.25 = 206.25ms;
  3. 新 RTO = 206.25 + max (100, 4*87.5) = 206.25 + 350 = 556.25ms。

0voice · GitHub

相关推荐
liulilittle9 小时前
OPENPPP2 Code Analysis Two
网络·c++·网络协议·信息与通信·通信
爱怪笑的小杰杰9 小时前
紧急补救:TCP心跳检测失效问题复盘与彻底解决
网络
学烹饪的小胡桃10 小时前
WGCAT工单系统 v1.2.7 更新说明
linux·运维·服务器·网络·工单系统
云飞云共享云桌面10 小时前
非标自动化工厂的设计云桌面为什么要选云飞云智能共享云桌面?
大数据·运维·服务器·网络·自动化·负载均衡
Lhan.zzZ11 小时前
基于Qt的UDP广播发现与TCP连接系统的设计与实现
qt·tcp/ip·udp
lowhot11 小时前
各种网络协议比较
网络·网络协议
运维有小邓@11 小时前
如何实现基于角色的访问控制?
运维·网络
EasyGBS11 小时前
EasyGBS打造变电站高效智能视频监控解决方案
网络·人工智能·音视频
东北小狐狸-Hellxz11 小时前
解决java客户端连接ssh失败问题
java·网络·ssh
可爱又迷人的反派角色“yang”11 小时前
k8s(一)
linux·运维·网络·云原生·容器·kubernetes