连接到同一路由器的三台计算机将具有相同的公共 IP。
正确,从服务器的角度来看,而不是从客户端的角度来看。
如果这些计算机向我的服务器发送请求,它们是否都具有相同的 PORT 或是否有例外?
不,它们在路由器上不会有相同的端口(尽管它们可能在每台客户端 PC 上)。
一个 TCP 连接由元组 {protocol, local-ip, local-port, remote-ip, remote-port} 唯一标识。因此,当多个 TCP 连接具有相同的{remote-ip, remote-port} 时(IOW,当多个客户端连接到同一个服务器时),那么每个{local-ip, local-port} 必须是唯一的。反之亦然,当多个 TCP 连接具有相同的{local-ip, local-port}(IOW,当客户端连接到多个服务器时),那么每个{remote-ip, remote-port} 必须是唯一的。
当通过路由器时,在客户端看到的每个 TCP 连接将是{TCP, lan-ip, lan-port, server-ip, server-port},而在服务器端每个连接将被视为{TCP, listen-ip, listen-port, client-ip, client-port},其中{client-ip, client-port} 将是路由器的{public-ip, public-port} ,所以每个{public-ip, public-port} 都必须是唯一的。
因此,通过路由器连接到同一服务器的多个客户端根本不能使用路由器上的相同传出端口,否则服务器将无法区分连接。
当我从浏览器收到请求时,它创建的每个连接的 PORT 都是不同的。
正确。
浏览器客户端是否只是选择路由器上可用的随机端口?
不,浏览器也不关心路由器是否存在。浏览器创建一个本地套接字端点并将其绑定到可用的{local-ip, local-port},然后使用它连接到服务器的{server-ip, server-port}。数据包进入操作系统,操作系统将它们发送到路由器,路由器为每个新连接打开自己的可用{public-ip, public-port},然后将这些数据包转发到服务器。当服务器发回数据包时,路由器将在其公共 NIC 上接收这些数据包,并将它们转发到适当的客户端操作系统,然后将它们传递到适当的套接字端点。
-------------
|客户端 PC A |
-------------
{tcp,客户端局域网IP,客户端局域网端口,服务器IP,服务器端口}
/|\
|
\|/
{tcp,路由器局域网IP,路由器局域网端口,客户端局域网IP,客户端局域网端口}
--------
|路由器 |
--------
{tcp,路由器公共 IP,路由器公共端口,服务器 IP,服务器端口}
/|\
|
\|/
{tcp,监听 IP,监听端口,路由器公共 IP,路由器公共端口}
--------
|服务器 |
--------