来自不同 TCP 连接的重复序列号是否可能?

网络工程 tcp 网络
2022-02-25 01:17:51

在学习序列号和确认号时,有一件事困扰着我。如果主机 A 通过使用某些已建立的 TCP 连接向主机 B 发送数据的以下场景是可能的,我无法为自己排除:主机 A 向主机 B 发送具有序列号 X 和确认号 Y 的数据。主机作为回报,B 发送回具有序列号 Y 和确认号 X+1 的数据。现在假设主机 B 发送的数据很慢。同时,来自 A 和 B的相同套接字之间的较早连接的数据仍然存在于网络中,并且意外地也具有序列号 X 到达主机 A。在这种情况下,A 会接受错误的数据包吗?它如何能够检测到它不是正确的数据包?还是我的场景根本没有意义?

编辑:添加了斜体部分。

2个回答

不同连接(=套接字)中的相同序列号不是问题。每个套接字跟踪它自己的序列号。在任何时间点,socket 都由 sourceIP:sourcePort:destinationIP:destinationPort 元组明确定义。

为了确保以前使用的源端口不会被重用,而数据可能仍在“飞行中”,端口被阻塞(处于 FIN-WAIT 状态)直到远程主机确认关闭(或最终定时出去)。

对于每个连接,每个段在潜在无限数据流中的位置由其段号定义。只有当管道变得如此之大以至于它包裹了 32 位字段时,这才会造成问题——为此,您需要有 4 GB 的空间在运行,这只会成为行星际网络的问题。目前,TCP 的窗口缩放选项只允许最大 ~1 GB 的大小。

是的,这在理论上是可能的。但在实践中,网络堆栈的设计应通过稳健的随机初始序列号算法最大限度地减少发生这种情况的可能性。

是的,主机会接受此流量,因为它无法判断它来自先前的连接。(黑客使用相同的技巧来断开连接,但猜测序列号非常困难。)

(随着当今 NAT 的普及,端口号完全有可能以足够快的速度回收,仅端口重用就会产生这个问题。)