【问题标题】:"Socket": Why client address and port are not explicitly speicified when connecting to a server?“Socket”:为什么在连接到服务器时没有明确指定客户端地址和端口?
【发布时间】:2015-11-11 05:34:07
【问题描述】:

我从here 阅读了一些套接字编程示例代码。我突然想到一个问题。

构建一个 TCP 套接字连接需要一个 4 元组:

<client address, client port, server address, server port>

但似乎只有&lt;server address, server port&gt; 在客户端和服务器代码中都明确指定。而这个server port只是用来监听的,并不是服务器真正用来通信的。

那么谁来决定&lt;client address, client port&gt;?为什么不由客户端代码的程序员明确说明?

添加1

更正,似乎上面的粗体部分不正确。服务器端口不变。 参考:Does the port change when a TCP connection is accepted by a server?

【问题讨论】:

  • 我猜如果没有指定,内核会决定连接服务器的客户端端口。但是,对于 Java 中的示例,有一个 API,您可以在其中显式指定表示客户端 Socket 的本地地址和端口。 public Socket(String host, int port, InetAddress localAddr, int localPort)link

标签: sockets tcp


【解决方案1】:

这些客户端端口被称为临时端口,这里解释得很好:

https://en.wikipedia.org/wiki/Ephemeral_port

也许在这里更好:

http://www.ncftp.com/ncftpd/doc/misc/ephemeral_ports.html

没有立即明显的是,当连接 确定连接的客户端使用端口号。 除非客户端程序明确请求特定的端口号, 使用的端口号是一个临时端口号。临时端口是 由机器的 IP 堆栈分配的临时端口,并被分配 为此目的,从指定的端口范围。当。。。的时候 连接终止,临时端口可供重用, 尽管大多数 IP 堆栈直到整个 临时端口池已被使用。所以,如果客户端程序 重新连接,它将被分配一个不同的临时端口号 它在新连接的一侧。

【讨论】:

    【解决方案2】:

    那么谁来决定{client address, client port}

    TCP/IP。它会计算出哪个 IP 地址具有到目标的最佳路由,并为您找到一个空闲端口。

    为什么不由客户端代码的程序员明确说明?

    如果您愿意,可以在connect() 之前通过bind() 指定它,但很少需要这样做。

    而且这个服务器端口只是用来监听的,并不是服务器实际用来通信的端口。

    这是不正确的。侦听和与接受的连接通信使用相同的端口号。

    【讨论】:

    • 谢谢,我在想bind() 只能在服务器端使用。似乎到目前为止我看到的所有教程暗示
    猜你喜欢
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多