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时:
- 计算
(n - b) mod N,判断结果是否在1到w之间:- 如果是,说明
n是当前窗口之后的有效确认,代表所有序号小于n的数据包都已被正确接收。 - 如果否,说明这是延迟的旧ACK,直接忽略。
- 如果是,说明
- 仅当确认有效时,将窗口基值更新为
n,新窗口范围变为[n, n+w-1](模N)。
这样,只要窗口大小不超过序列号空间的一半,就能完全避免乱序ACK带来的歧义,保证Go-Back-N的安全运行。
内容的提问来源于stack exchange,提问作者Michael Lee
相关产品推荐
相关产品推荐

