今天我工作的地方讨论了临时端口的使用。讨论的内容是客户端的请求如何通过端口 80 到达服务器(这只是关于 HTTP 请求的讨论),但将其交给服务器上的临时端口来处理请求。我之前没有听说过这个,所以我试着做了一些研究,但找不到太多文档来说明这一点。
这真的是实际发生的事情吗?我看到的所有内容都提到,临时端口用于客户端,但服务器仍将只是端口 80。因此,您永远不会以这种方式在服务器上遇到端口耗尽问题,只有客户端才有可能。
我曾见过有人提到服务器使用这种方法进行 FTP(https://en.wikipedia.org/wiki/Ephemeral_port)尽管对于 HTTP 请求没有任何内容。
任何澄清都很好。谢谢!
答案1
在 TCP 套接字开发中,据我记得(已经有一段时间了,可能有点偏离),服务器有一个侦听套接字调用 bind、listen 和 accept 并等待。一旦有传入连接,accept 将解除阻塞并返回另一个套接字对象。这个第二个套接字对象将像实际连接的句柄一样,可以执行网络 I/O,而原始套接字可以循环回来接受网络连接。此操作不会占用临时端口。
我不确定操作系统在连接管理方面的确切内部工作原理,但对我来说,当调用 accept 时,网络驱动程序只需将来自远程 IP/端口组合的连接与特定句柄 ID 关联即可。这允许网络驱动程序成功地将网络 I/O 路由到正确的套接字句柄,同时允许侦听器处理来自同一本地端口但不同的远程 IP/端口的新 TCP 握手,而无需真正使用额外的端口。侦听器将再次调用 accept 并为下一个传入连接创建一个新的 I/O 套接字句柄,依此类推。