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

  • 本文关键字:两次 TCP OS macos sockets netcat
  • 更新时间 :
  • 英文 :


我试图通过使用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)。您可以在OS X上使用dtrace进行验证。

Linux上的netcat二进制文件无法做到这一点,因此您会得到预期的绑定错误。同样,您可以使用strace验证这一点。我相信SO_REUSEPORT已经被弃用,甚至在更新的Linux内核上都不可用。

最新更新