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

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

[[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 - 

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

TCP连接通常通过使用侦听套接字来build立。 但这不是要求。 TCP标准允许两端发送一个SYN数据包,而不通过LISTEN状态。

在这样的连接build立过程中,每个对等体将发送一个SYN和一个ACK作为两个独立的数据包。 所以当他们达到ESTABLISHED状态时,会发送四个数据包(不是通常的三个数据包)。

这是从CLOSED到SYN SENT到SYN RECEIVED在状态图中build立的path。

这样做的一个副作用是它也可以在TCP端点连接到它自己时起作用。 这是很less有用的,但标准允许的。 以这种方式build立的套接字将返回它自己发回的所有数据。 你可以用下面的方法testing它: nc -p 12345 ::1 12345

你会注意到状态图也允许从LISTEN转换到SYN SENT。 所以标准允许使用监听套接字来启动客户端连接。 我不知道Linux是否已经实现了对特定序列的支持, nc命令似乎不支持它,所以可能需要一些编码来testing。