首页/网络/协议速查/序列号、确认号与乱序重排
TCP 与 UDP54 条

序列号、确认号与乱序重排

每个字节都有序号,接收方用确认号表示「已连续收到这里」;编号从随机 ISN 开始(防伪造),乱序由接收缓冲重排。

协议速查网络更新于 2026-10-13

序列号与确认号是什么

TCP 把数据看成字节流,每个字节都有一个序号:报文头里的序号表示本报文首个字节的位置,确认号表示「这个位置之前的字节我都连续收到了」。初始序号 ISN 不是从 0 开始,而是随机生成以抵抗连接伪造与旧报文串扰(RFC 6528)。接收方遇到乱序段会先放入缓冲,等缺口被重传补齐后再按序交付给应用。

基本信息

序号32 位,本报文首字节在字节流中的位置
确认号32 位,累积确认,表示期望的下一个字节
ISN连接建立时随机生成,非固定 0
选择性确认SACK 选项可额外声明已收到的乱序区间
规范RFC 9293 §3.3、RFC 6528
抓包显示tcpdump 默认相对序号,-S 显示绝对序号

典型使用场景

  • 分析重传:同一序号重复出现说明该段未被确认
  • 识别乱序:序号跳跃但都在窗口范围内,通常是路径多链路负载分担造成
  • 判断丢包位置:连续多个重复确认(duplicate ACK)提示对端在催缺口数据
  • 验证 SACK 是否生效:抓包看选项区是否有 SACK 块,影响重传效率
  • 对账抓包与应用日志:用绝对序号才能与内核日志对上

抓包观察序号与确认号

抓包观察序号与确认号
tcpdump -nn -S 'tcp port 8080' -c 6      # -S:显示绝对序号,便于对账
tcpdump -nn -v 'tcp port 8080' -c 2 | grep -i -E 'seq|ack'
tcpdump -nn -v 'tcp port 8080' -c 20 | grep -c 'seq'   # 粗看是否有重复序号
ss -ti '( dport = :8080 )'               # 内核侧看重传与 rtt 统计

现象与归因

抓包现象含义排查方向
同一 seq 多次出现该段被重传,说明未收到确认查路径丢包与对端接收缓存的状况
相同 ack 连续出现多次对端在催缺口数据定位缺口与丢包点
seq 跳跃但被后续 ack 覆盖乱序,非丢包多为多路径或链路聚合导致
ack 长时间不前进对端应用不读取数据或卡死看接收窗口是否降到 0
窗口内出现空洞且无重传SACK 生效,选择性补发属于正常优化行为
Wireshark 提供现成过滤器:tcp.analysis.retransmission 列重传、tcp.analysis.out_of_order 列乱序,比手工比对序号快得多;分析前记得把相对序号关掉。
SACK(选择性确认)让接收方可以报告「缺哪一段」,发送方只需重传缺口而不是把缺口之后的数据全部重发,在高带宽高延迟链路上对吞吐影响很大。

易错点

  • 把乱序当成丢包处理:乱序由接收缓冲自动重排,只有重传超时才说明真的丢了
  • 看 tcpdump 默认的相对序号去和日志里的绝对序号对比,两边对不上会得出错误结论
  • 依赖 32 位序号的回绕特性做长期对账:高速链路下序号会绕回,需结合时间戳选项判断
  • 忽略 ISN 随机化的意义:如果看到固定或可预测的 ISN,说明实现异常或存在中间设备改写

数据来源与参考

  • RFC 9293 §3.3
  • RFC 6528(ISN 随机化要求)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌