linux - 在本地主机上使用相同的 IP 和端口创建套接字

标签 linux sockets networking tcp

我在 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/

相关文章:

c - 我的服务器无缘无故暂停,直到我杀死客户端

c++ - 需要一个散列函数来从 ipv6 16 字节地址和 TCP 2 字节端口号中创建 32 位值

c - 线程和文件描述符

linux - 如何增加新生成进程的 CPU 频率

c - 使用 C 套接字在 HTTP 响应中发送二进制文件

Java 套接字导致客户端或服务器崩溃?

c++ - 使用 boost::asio 将序列化数据写入套接字

java - 如何为多人 Android 应用程序设置 Java 服务器和数据库

Python Netsnmp 和 snmpwalk

ruby - 如何获取某个进程正在读取的打开文件的文件指针位置?