为什么 OS X 允许在同一个 TCP 端口上侦听两次?

2024-01-10

我试图通过使用 netcat 监听某些端口来调试 OS X 上 Jenkins 的端口分配问题,这导致了一些奇怪的结果。


在 OS X 10.8.2 的终端中:

$ uname -rs
Darwin 12.2.1

$ nc -l 54321

然后在第二个终端中:

$ nc -l 54321

在第三个航站楼,lsof显示两个实例已绑定到同一端口:

$ lsof -i | grep 54321
nc  70706 chris    3u  IPv4 0x55618c024692f4d1      0t0  TCP *:54321 (LISTEN)
nc  70769 chris    3u  IPv4 0x55618c0232cb8661      0t0  TCP *:54321 (LISTEN)

在 Linux 上:

第一个航站楼:

$ uname -rs
Linux 3.2.0-34-generic

$ nc -l 54321

第二航站楼:

$ nc -l 54321
nc: Address already in use

为什么 OS X 不报告该地址已被使用?


OS X 上的二进制文件正在设置 SO_REUSEPORT 套接字选项,该选项允许完全重复的绑定(OS X 上的 setsockopt https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html)。您可以在 OS X 上使用 dtrace 来验证这一点。

Linux 上的 netcat 二进制文件不会执行此操作,因此您会收到预期的绑定错误。同样,您可以使用 strace 来验证这一点。我相信 SO_REUSEPORT 已被弃用,或者甚至在较新的 Linux 内核上不可用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 OS X 允许在同一个 TCP 端口上侦听两次? 的相关文章

随机推荐