TCPv4 规范 (RFC 793)将接收到的段归类为不可接受,如果它的长度为零,序列号等于RCV.NXT
+RCV.WND
而接收窗口不为零(表中的第二行)。
这实质上意味着该段将被丢弃,除了可能发送ACK
. 不会进行任何ACK
处理或发送窗口更新。
这样做的理由是什么?
考虑这个场景:
- 主机 A 将所有可能的数据段发送到主机 B,只是耗尽了 B 的接收窗口。
- 主机 A 很快也会发送一个空段,例如窗口更新或接收数据的确认。该段的序列号等于主机 B 的接收窗口的右边缘 (
RCV.NXT
+RCV.WND
),因为它被设置为SND.NXT
主机 A的最新值。 - 上述数据包在网络中丢失或延迟,主机B先收到空段。
- 主机 B 会将空段归类为不可接受的,并丢弃它,忽略任何确认或窗口更新。
这似乎特别成问题,因为接收器通常会根据序列号和确认号的组合忽略看似较旧的窗口更新。但是只有那些不会被过滤掉的窗口更新(最高序列号)会因为段不被认为是可接受的而更早被丢弃。
有没有我没有正确理解的部分?这种场景真的可能吗?