TCP客户端的端口和TCP服务器的端口是否共享相同的地址空间?

时间:2013-01-26 09:59:39

标签: sockets networking tcp conflict port-number

在同一台机器上,如果tcp客户端已占用端口12345,例如,客户端已连接到google.com,然后tcp服务器尝试将其侦听端口绑定到12345,这是否允许?

2 个答案:

答案 0 :(得分:4)

答案是“它取决于”(在操作系统和套接字选项上)。

在两个套接字上都有SO_REUSEADDR的Linux上,可能会出现所描述的确切情况:

$ sudo netstat -panl |grep 12300
tcp        0      0 127.0.0.1:12300         0.0.0.0:*               LISTEN      3591/nc         
tcp        0      0 127.0.0.1:12300         127.0.0.1:25            ESTABLISHED 3547/nc         
tcp        0      0 127.0.0.1:25            127.0.0.1:12300         ESTABLISHED 3548/exim4

...但只有当客户首先到达那里时。当服务器已经在侦听时,同一个端口不能被客户端绑定(并且不会自动分配给客户端,IIRC)。

在Windows上,无论是否有SO_REUSEADDR端口都是端口bind失败(无论是服务器还是首先执行此操作的客户端)。

答案 1 :(得分:-2)

没有。港口是港口。

这说:很少有冲突,因为通常服务器在客户端请求非指定端口之前启动(即客户端从不设置端口号,他的机器需要一个免费的端口号。)

大多数服务器都有预定义的端口。

http://www.webopedia.com/quick_ref/portnumbers.asp http://www.ietf.org/rfc/rfc1700.txt?number=1700

范围:

http://www.tcpipguide.com/free/t_TCPIPApplicationAssignmentsandServerPortNumberRang-2.htm

如您所见,已注册的端口转到49151,并从那里保留用于动态使用。因此,客户端端口通常来自49152向上的范围,服务不应该使用。