“套接字”:为什么连接到服务器时未明确说明客户端地址和端口?

时间:2015-11-11 05:34:07

标签: sockets tcp

我从here读取了一些套接字编程示例代码。一个问题突然袭击了我。

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

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

但似乎只在客户端和服务器代码中明确指定了<server address, server port>。此server port仅用于监听,而不是服务器实际用于通信的那个。

那么谁来决定<client address, client port>?为什么不明确地由客户端代码的程序员?

ADD1

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

2 个答案:

答案 0 :(得分:2)

  

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

TCP / IP。它确定哪个IP地址具有到目标的最佳路由,并找到一个空闲端口。

  

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

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

  

此服务器端口仅用于侦听,而不是服务器实际用于通信的端口。

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

答案 1 :(得分:2)

这些客户端端口称为临时端口,这在这里有相当好的解释:

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

也许在这里更好:

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

  

什么是不明显的,当连接是   确定连接的客户端使用端口号。   除非客户端程序明确请求特定的端口号,   使用的端口号是一个短暂的端口号。短暂的港口是   由机器的IP堆栈分配的临时端口,并已分配   为此目的从指定范围的港口。当。。。的时候   连接终止,临时端口可供重用,   虽然大多数IP堆栈在整个之前不会重用该端口号   短暂的港口池已被使用。所以,如果是客户端程序   重新连接时,将为其分配一个不同的临时端口号   它是新连接的一面。