为什么接收窗口右边缘的空 TCP 段是不可接受的?

网络工程 通讯协议 协议理论 传输协议 第4层 射频卡
2021-07-27 19:55:56

TCPv4 规范 (RFC 793)将接收到的段归类为不可接受,如果它的长度为零,序列号等于RCV.NXT+RCV.WND而接收窗口不为零(表中的第二行)。

这实质上意味着该段将被丢弃,除了可能发送ACK. 不会进行任何ACK处理或发送窗口更新。

这样做的理由是什么?

考虑这个场景:

  1. 主机 A 将所有可能的数据段发送到主机 B,只是耗尽了 B 的接收窗口。
  2. 主机 A 很快也会发送一个空段,例如窗口更新或接收数据的确认。该段的序列号等于主机 B 的接收窗口的右边缘 ( RCV.NXT+ RCV.WND),因为它被设置为SND.NXT主机 A的最新值。
  3. 上述数据包在网络中丢失或延迟,主机B先收到空段。
  4. 主机 B 会将空段归类为不可接受的,并丢弃它,忽略任何确认或窗口更新。

这似乎特别成问题,因为接收器通常根据序列号和确认号的组合忽略看似较旧的窗口更新但是只有那些不会被过滤掉的窗口更新(最高序列号)会因为段不被认为是可接受的而更早被丢弃。

有没有我没有正确理解的部分?这种场景真的可能吗?

1个回答

在此上下文中的段是指 TCP 的有效载荷。L=0 扔掉它。窗外段扔吧。S<RCV.NXT+RCV.WND 但这就是他们在规范中搞砸的地方,它在以后的 RFC 中得到修复。
任何 S<RCV.NXT+RCV.WND 都将被接受。就像重传一样。ACK、SACK 和窗口更新总是被处理。(最大值用于在无序情况下保持事物直立)

希望你毕业!