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

3

在同一台计算机上,如果一个TCP客户端已经占用了端口12345,例如客户端已经连接到了google.com,那么当一个TCP服务器尝试绑定自己的监听端口到12345时,这是否被允许?

2个回答

4
答案是“这取决于”(取决于操作系统和套接字选项)。
在Linux上,如果两个套接字都启用了SO_REUSEADDR选项,则可能发生所描述的情况:
$ 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

但仅当客户端先启动时才能使用。当服务器已经在监听时,该端口无法被客户端绑定(如果是客户端自动分配的话,也永远不会被自动分配,据我所知)。

在Windows上,无论是否使用SO_REUSEADDR端口就是端口,并且bind失败(无论是服务器还是客户端先绑定都是如此)。


-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及更高,服务不应使用这些端口。


2
你的答案是“如何避免冲突”,而不是“是否允许这样的冲突”。 - xmllmx
@xmllmx 学会阅读。避免冲突很简单:不要使用动态客户端端口范围之外的端口号。如果你不这样做,就根本不会有冲突的机会。 - TomTom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接