是否可以使用监听套接字来启动客户端连接?

是否可以使用监听套接字来启动客户端连接?

今天我注意到了这样的情况:

[[email protected] ~]#netstat -taupen | grep 54310
tcp        0      0 ::ffff:10.0.12.209:54310    ::ffff:10.0.12.209:54310    TIME_WAIT   0          0          -                   

您会注意到源套接字与目标套接字相同。这可能吗?有人可以解释一下吗。

答案1

TCP 连接通常使用监听套接字来建立。但这不是必需的。TCP 标准允许两端都发送 SYN 数据包,而无需任何一端经过 LISTEN 状态。

在建立连接的过程中,每个对等体将发送 SYN 和 ACK 作为两个单独的数据包。因此,当它们达到 ESTABLISHED 状态时,将发送四个数据包(而不是通常的三个数据包)。

这是从 CLOSED 到 SYN SENT 到 SYN RECEIVED 到 ESTABLISHED 的路径。状态图

这样做的一个副作用是,当 TCP 端点连接到自身时,它也有效。它很少有用,但标准允许。以这种方式建立的套接字将返回它发送回自身的所有数据。您可以使用以下方法进行测试:nc -p 12345 ::1 12345

您会注意到,状态图还允许从 LISTEN 过渡到 SYN SENT。因此,标准确实允许使用监听套接字来启动客户端连接。我不知道 Linux 是否已实现对该特定序列的支持,该nc命令似乎不支持它,因此可能需要一些编码来测试。

相关内容