当 Alice 连接到www.example.com,路由器将该请求转发到互联网并监听来自www.example.com在端口上。
- 这个端口是唯一的吗?(即路由器是否会期望多个网站对此端口做出响应)
- 响应完成后端口是否直接关闭?
- 爱丽丝有可能知道哪个路由器开放了端口吗?
爱丽丝现在在更多标签中打开网站,提出更多请求。
- 路由器是否为每个请求分配一个新的端口?
- 如果是的话,那么传出请求的数量是否有限制?(因为可能的端口数量是有限的)
答案1
这个端口是唯一的吗?(即路由器是否会期望多个网站对此端口的响应)
可能是,但不一定。(情况各不相同。)路由器知道数据包地址和端口——因此没有什么从根本上阻止它跟踪具有相同本地端口但不同远程服务器的多个连接。我认为一些实现尝试以避免重复使用同一个端口。
响应完成后端口是否直接关闭?
路由器实际上并不知道“请求”和“响应”。这些是 HTTP 定义的应用程序概念,但路由器只关心 TCP 连接(即 IP 层之上),而 TCP 是一种自由格式的数据流,不区分什么是请求,什么是响应。
在询问网站时,这一点很重要,因为大多数浏览器通过同一个 TCP 连接发送多个 HTTP 请求,并且只在空闲一段时间后关闭它。(这HTTP 连接重用不是 HTTP 的一部分起初,但在 1995 年左右被添加为可选功能。)
所以要回答这个问题,当浏览器决定关闭 TCP 连接并且路由器看到相应的“关闭”数据包通过时,端口就会关闭。
Alice 有可能知道路由器打开了哪个端口吗?
不是直接的——只能通过询问外部服务器看到数据包来自哪个端口。(游戏和 P2P 软件通过 STUN 协议实现此操作)。
如果需要固定端口号,通常会添加一个静止的端口映射规则到路由器(又名“端口转发”),而不是依赖动态规则。
路由器是否为每个请求分配一个新的端口?
如上所述,HTTP 请求与 TCP 连接并不是 1:1 对应的,“端口号”是为整个 TCP 连接设置的,浏览器能够通过同一个连接发送多个 HTTP 请求。
是否每个 TCP 连接分配一个新端口……它是有所不同的。
此时,请记住路由器实际上并没有创造端口。TCP 连接始终使用端口号进行识别 - 在 NAT 出现之前,在私有 LAN 地址出现之前。您自己的计算机的操作系统选择本地端口号,而路由器的 NAT 只是像转换 IP 地址一样转换端口。
(也可以看看这个帖子。
因此考虑到这一点:
- 您的计算机通常会为每个新连接分配一个新端口号。它会刻意避免在短时间内使用同一个端口号(“TIME_WAIT”状态)。有些操作系统使用递增端口号,有些则随机选择。
- 当连接到达您的路由器时,某些路由器会使用一种 NAT,尝试尽可能保留原始源端口号(由您的计算机选择),并且仅在与另一台设备重复的情况下重新分配它。
- 但有些路由器使用一种 NAT,总是为每个新连接重新分配一个完全随机的端口号。(这通常称为“对称 NAT”。)
如果是的话,那么传出请求的数量是否有限制?(因为可能的端口数量是有限的)
是的,尽管理论极限并不总是与实际极限相符。
如上所述,理论上,只要其他参数(远程 IP 和/或远程端口)不同,路由器或计算机就可以重复使用相同的本地端口。但实际上,大多数操作系统不会这样做,而是会保留整个端口号,导致连接数限制为 64k。当路由器试图将所有 LAN 连接塞入您的单个公共 IP 地址下时,情况也是如此。
此外,并非所有本地端口都可用作源端口。通常,1-1023 范围几乎总是禁止使用的(因为这是目的地端口),并且由于同样的原因,有时也会避免使用 1024–49151 的范围。
最后,家用路由器的一个问题是,它们的 RAM 容量有时非常少,无法在内存中跟踪如此多的连接——当不堪重负时,它们要么开始拒绝新的连接,要么踢掉旧的连接。