我在套接字上设置 SO_REUSEADDR 选项。假设一个套接字从一端关闭。
并且套接字描述符被重新分配给其他进程。
旧 TCP 连接的数据是否有机会潜入新的 TCP 连接?
有没有人观察到旧数据潜入新的 TCP 连接,尤其是在 Solaris 上?
不。
如果你重新使用本地端口,但是远程主机或端口在后续连接中发生了变化,那么这是不可能的。
对于从同一个本地 IP/端口重新连接回同一个远程 IP/端口的情况,也称为 TIME-WAIT Assasination,TCP 堆栈需要遵守一些规则。主要是 - 从比前一个连接更高的序列号开始。您可以阅读 RFC 1337 中的细则。但这里有一个更好的链接和引用,它概述了如何在后续连接中调整序列号。
http://blogs.technet.com/b/networking/archive/2010/08/11/how-tcp-time-wait-assassination-works.aspx
在服务器端套接字进入 TIME-WAIT 状态并且客户端在 2MSL(默认 TIME-WAIT 时间)内重新连接到服务器的情况下,可能会发生 2 件事:
服务器将不会响应来自客户端的 SYN 数据包,因为套接字处于 TIME-WAIT 状态。
服务器可以接受来自客户端的 SYN 并将套接字的状态从 TIME-WAIT 更改为 ESTABLISHED。这被称为 TIME-WAIT 暗杀,或先前连接的化身。
上面场景'2'的关键是发送的SYN的ISN(初始序列号)需要高于之前会话中使用的最高序列号。如果 ISN 不符合预期,服务器将不会响应 SYN,并且套接字将等待 2MSL 才能再次使用。
这就是 TIME_WAIT 状态的用途。它的持续时间是最大段生命周期的两倍,因此发送到旧连接的任何数据都会在相同 IP:port 对之间的新连接形成之前过期。