【问题标题】:Do TCP clients' ports and TCP servers' ports share the same address space?TCP 客户端的端口和 TCP 服务器的端口是否共享相同的地址空间?
【发布时间】:2013-01-26 19:03:53
【问题描述】:

在同一台机器上,如果一个tcp客户端占用了12345端口,比如客户端连接了google.com,然后一个tcp服务器尝试将它的监听端口绑定在12345上,这样可以吗?

【问题讨论】:

    标签: sockets networking tcp conflict port-number


    【解决方案1】:

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

    在两个套接字上都有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_REUSEADDRport 是端口 并且 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 以上范围。

      【讨论】:

      • 你的答案是“如何避免冲突”,而不是“是否允许这样的冲突”。
      • @xmllmx 学习阅读。避免冲突很简单:不要使用超出用于动态客户端端口范围的端口号。如果你不这样做,就没有开始冲突的机会。
      猜你喜欢
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 2012-08-17
      • 2019-01-31
      • 2021-10-10
      • 1970-01-01
      • 2014-07-02
      • 1970-01-01
      相关资源
      最近更新 更多