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

pra*_*tri 2 networking linux

今天我注意到这样一个情况:

[root@cwf-hmaster.staging-scp ~]#netstat -taupen | grep 54310
tcp        0      0 ::ffff:10.0.12.209:54310    ::ffff:10.0.12.209:54310    TIME_WAIT   0          0          -                   
Run Code Online (Sandbox Code Playgroud)

您可以注意到源套接字与目标套接字相同。是否可以 ?有人可以解释一下。

kas*_*erd 7

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

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

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

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

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