同一主机同一端口运行两个netcat服务器时,为何仅第一个启动的服务器能接收连接?
同一主机同一端口运行两个netcat服务器时,为何仅第一个启动的服务器能接收连接?
嘿,这个问题问得挺有意思的,我来给你拆解一下背后的逻辑:
首先得搞清楚为什么你能在同一个端口上启动两个netcat服务器——这是因为Linux允许在设置了SO_REUSEADDR套接字选项的前提下,多个套接字绑定到同一个IP和端口(只要绑定的地址是通配符0.0.0.0或者相同的具体地址)。而netcat默认会启用这个选项,所以第二个nc进程能成功绑定端口并进入LISTEN状态,这也是你用netstat -tuldp能看到两个LISTEN条目原因。
那核心问题来了:为什么只有第一个启动的服务器能收到客户端的连接和数据?这就涉及到Linux内核处理监听套接字的机制了:
- 当你有多个套接字同时监听同一个IP:端口时,内核在收到客户端的SYN连接请求后,会遍历所有绑定该端口的监听套接字,选择第一个匹配的套接字来完成TCP三次握手(这里两个套接字都是绑定
0.0.0.0:12345,所以都匹配,内核就选最早绑定的那个)。 - 第一个
nc -lp 12345进程的套接字会先完成三次握手,建立起已连接的套接字,客户端发送的所有数据都会通过这个已连接套接字传递给第一个nc,而第二个nc的监听套接字就一直处于“等待连接”的状态,根本没机会处理任何客户端请求——因为内核已经把所有进来的连接都交给了第一个绑定的套接字。
简单说就是:SO_REUSEADDR允许你重复绑定端口,但内核并不会把连接请求分发给多个监听套接字,而是只会交给最早绑定的那个套接字处理所有连接。第二个nc看起来在监听,其实是个“备胎”,永远轮不到它上场。
内容来源于stack exchange
相关产品推荐
相关产品推荐

