TCP确认号计算要找的是“接下来期望收到哪个序号”,累积确认不是给收到的报文段计数。中间缺了字节,累积确认就停在第一个缺失位置;不能直接把最后到达那一段的序号加上长度,当作所有数据都已收到。

先把SEQ、ACK字段和ACK标志分开

学习软件设计师网络基础时,可以把SEQ理解为本段占用序号空间的起点,把确认号ACK理解为本端对另一方向接收进度的回应。ACK标志则说明确认号字段有意义;一个是标志,一个是数值,不能混写成同一件事。

TCP按字节编号,而不是每发一段就加1。无SYN、FIN的数据段若从3001开始、承载160字节,覆盖的是3001到3160,紧接着的序号才是3161。这里最后一个字节要减1,确认连续收齐这一段时又指向下一个位置。

知英教育建议画一条单方向字节轴,先标本段第一字节与最后字节,再求接收端下一个缺失的位置。另一方向的SEQ需要另记,不能拿来填这条轴。

160个字节从3001起占用3001到3160,下一个位置为3161的三列计算图
末尾与下一位置只差1,所回答的问题不同。

TCP确认号计算要先找第一个缺口

下面是原创教学算例,不是考试原题或实际抓包。只看A向B这一方向,假设报文有效、接收窗口足够、没有序号回绕;B保留已到达的乱序数据,以下数值表示各步接收后的累积确认值,不讨论确认发出的具体时机。

  1. A先发送SEQ为3000、无数据的SYN。SYN占一个序号,B接下来期望3001。
  2. B收到SEQ为3001、长度160字节的数据段,连续数据覆盖3001至3160,确认号变为3161。
  3. 本应接着到达的3161至3240共80字节尚未收到;B先收到SEQ为3241、长度60字节的后段,覆盖3241至3300。
  4. 虽然后段已经到达,3161仍是第一个缺失字节,所以确认号仍为3161,不能写3301。
  5. 缺少的80字节随后到达,并与此前保留的后段接上,连续范围扩展到3300,确认号才变为3301。

知英教育建议把“已到达”与“已连续收到”画成两层。第三步B已经拥有两块数据,但它们之间还没接通;最后一步确认号一次前移140,不表示刚刚新到达了140字节,其中60字节此前已被保留。

依次收到3001至3160、乱序3241至3300、补齐3161至3240后确认号变化3161、3161、3301
后段按题设保留;补齐缺口后,已有两块才能连为完整范围。

为什么不能每见一次ACK就把SEQ加1

SYN和FIN各占一个序号;不带数据且不含SYN、FIN的纯ACK段不占序号空间。判断加多少,应看这一段实际包含的数据长度和这两个控制标志,不是看报文名称里有没有ACK。

接着本例,假设A已发完上述数据,下一序号为3301。A发送一个SEQ为3301、无数据的FIN,该FIN占用序号3301。B在前面的数据都已连续收到时,确认这个FIN所用的确认号为3302。若只是一个无数据的纯ACK,则不能因为ACK标志置位就再加1。

RFC 9293第3.4节把数据字节与SYN、FIN统一放入序号空间说明。本文的160、80、60字节及3000起点均为自编数字,计算只适用于前面列出的条件。

数据按载荷字节数、SYN与FIN各1、无数据无SYN/FIN的纯ACK为0的对照
ACK标志置位,不代表这一段额外占1个序号。

三项检查,定位自己错在哪里

  • 答案只差1:核对写的是最后一个已收字节,还是下一个期望序号;再核对SYN、FIN。
  • 答案跳到了后段末尾:检查中间是否仍有缺口,不要只看最后一段。
  • 双向图里数值跳来跳去:给A到B、B到A各画一条轴,分别记SEQ与对方的确认。

本文只讨论基础序号语义。实际TCP还涉及接收窗口、确认时机及扩展机制;不能仅凭一个确认号断言某一段永远丢失,也不能把例子的缓存条件当作所有接收实现的固定行为。

整理TCP确认号计算错题时,可先去软考学习指南核对自己的网络基础学习安排,再经联系咨询向知英教育描述从哪一步开始算错。可协助梳理概念与练习方法,具体课程范围以确认的信息为准,不承诺押题或考试结果。

资料核对日期:2026年10月31日。技术依据为RFC 9293(2022年8月)的报文头定义与序号章节。本文为常青基础学习说明,未据此判定当期大纲新增内容或必考范围。