我从here读取了一些套接字编程示例代码。一个问题突然袭击了我。
构建TCP套接字连接需要4个元组:
<client address, client port, server address, server port>
但似乎只在客户端和服务器代码中明确指定了<server address, server port>
。此server port
仅用于监听,而不是服务器实际用于通信的那个。
那么谁来决定<client address, client port>
?为什么不明确地由客户端代码的程序员?
更正,似乎上面的大胆部分是不正确的。服务器端口不会更改。 参考:Does the port change when a TCP connection is accepted by a server?
答案 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堆栈在整个之前不会重用该端口号 短暂的港口池已被使用。所以,如果是客户端程序 重新连接时,将为其分配一个不同的临时端口号 它是新连接的一面。