那么,当服务器监听 TCP 端口上的传入连接时会发生什么情况呢?例如,假设您在80端口上有一个 Web 服务器。假设您的计算机的公共 IP 地址为24.14.181.229,而试图连接到您的人的 IP 地址为10.1.2.3。这个人可以通过打开一个 TCP 套接字到24.14.181.229:80来连接到您。很简单。
凭直觉(也是错误的) ,大多数人认为它看起来是这样的:
Local Computer | Remote Computer
--------------------------------
<local_ip>:80 | <foreign_ip>:80
^^ not actually what happens, but this is the conceptual model a lot of people have in mind.
这是直观的,因为从客户机的角度来看,他有一个 IP 地址,并在 IP: PORT 连接到服务器。既然客户端连接到端口80,那么他的端口也必须是80?这是一个明智的想法,但实际上并非如此。如果这是正确的,我们只能为每个外国 IP 地址服务一个用户。一旦远程计算机连接上了,他就会霸占80端口到80端口的连接,其他人就无法连接了。
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:500 0.0.0.0:* LISTEN -
所以现在有一个进程正在积极监听端口500(State: LISTEN)。本地地址是0.0.0.0,这是“监听所有 ip 地址”的代码。一个很容易犯的错误是只侦听端口127.0.0.1,它将只接受来自当前计算机的连接。所以这不是一个连接,这只是意味着一个被请求绑定()到端口 IP 的进程,该进程负责处理到该端口的所有连接。这暗示了一个端口上每台计算机只能监听一个进程的局限性(使用多路复用可以绕过这个局限性,但这是一个更复杂的主题)。如果一个 Web 服务器正在监听端口80,它就不能与其他 Web 服务器共享该端口。