You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go-Back-N发送端如何处理乱序确认?模运算场景安全性分析

Go-Back-N 模运算下的乱序确认安全性保障

要解决模运算下乱序ACK的安全问题,核心在于严格遵守窗口大小w ≤ 序列号空间大小N/2的约束(N是模值,比如你例子里的序列号0-3,N=4)。一旦违反这个约束,就会出现你例子里的歧义;满足约束时,发送端可以明确区分延迟的旧ACK和有效的新ACK。

为什么这个约束能避免歧义?

当w ≤ N/2时,发送窗口内的所有序列号,在模N的循环中,不会和已确认数据包的下一轮次序列号重叠。也就是说,发送窗口的范围和已确认过的旧序列号区间(下一轮)完全分离,发送端收到ACK时,能清晰判断它属于旧轮次还是当前/新轮次。

结合你的例子分析问题所在

你例子里N=4,窗口大小w=3,显然w > N/2(2),这就导致了歧义:

  • 初始窗口为[0,1,2],收到ACK2后窗口滑动到[2,3,0]
  • 收到ACK3后窗口滑动到[3,0,1]
  • 此时收到延迟的ACK1(对应旧轮次的0号包确认),因为w=3,模运算下无法区分这个ACK是旧轮次的确认,还是新轮次中1号包的确认(假设新轮次的1号包已被接收)

如果把窗口大小改为2(符合w ≤ N/2),情况就完全不同:

  • 初始窗口[0,1],收到ACK2后窗口滑到[2,3]
  • 收到ACK3后窗口滑到[0,1](新轮次)
  • 此时收到延迟的ACK1,发送端会判断:当前窗口基值是0,ACK1对应的是旧轮次的0号包确认,对当前新窗口没有意义,直接忽略即可,不会触发窗口滑动。

发送端的正确ACK处理逻辑

在模运算下,发送端维护窗口基值b,窗口范围是[b, b+w-1](模N)。收到ACK n时:

  1. 计算(n - b) mod N,判断结果是否在1到w之间:
    • 如果是,说明n是当前窗口之后的有效确认,代表所有序号小于n的数据包都已被正确接收。
    • 如果否,说明这是延迟的旧ACK,直接忽略。
  2. 仅当确认有效时,将窗口基值更新为n,新窗口范围变为[n, n+w-1](模N)。

这样,只要窗口大小不超过序列号空间的一半,就能完全避免乱序ACK带来的歧义,保证Go-Back-N的安全运行。

内容的提问来源于stack exchange,提问作者Michael Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:05:31