我在 Linux 上看到奇怪的行为,我看到远程端和本地端都显示相同的 IP 和端口组合。以下是 netstat 输出
网络统计-anp | grep 6102
tcp 0 0 139.185.44.123:61020 0.0.0.0:* 监听 3361/a.out
tcp 0 0 139.185.44.123:61021 139.185.44.123:61021 已建立 3361/a.out
谁能告诉我这是否可能?如果是,那么可能是什么情况?
最佳答案
连接由 4 元组((源 ip,源端口),(目标 ip,目标端口))标识,源端口和目标端口可以毫无问题地相同。这种连接甚至可以由一个进程建立,这将导致您看到的输出。
但是,我刚遇到一个讨厌的错误,客户端套接字会尝试连接到服务器套接字,该服务器套接字的端口号在同一台机器上的临时端口范围内。连接操作将重试操作直到成功。
重试功能是个问题:如果服务器应用程序没有运行并且随机选择的源端口与目标端口相同(这是可能的,因为目标端口在临时范围内),客户端套接字将连接到自身(这对客户端应用程序的内部逻辑造成了严重破坏,您可以想象)。
由于客户端尽可能快地执行重试,所以这种情况发生的几率达到了 30.000 分之一。
以下 Python 脚本再现了它:
import socket
host = 'localhost'
port = 35911
ctr = 0
while True:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(5)
ctr += 1
s.connect((host, port))
print "Connected to self after", ctr, "tries"
break
except socket.error, e:
print e
# Retry
关于linux - 在本地主机上使用相同的 IP 和端口创建套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4021271/