最高的 TCP 端口号是 65535。如果执行 NAT 的路由器为代表内部网络上的主机与 Internet 建立的每个连接使用临时端口,这是否意味着路由器可能会耗尽端口?当路由器耗尽端口时会发生什么?
答案1
如果执行 NAT 的路由器为代表内部网络上的主机与 Internet 建立的每个连接使用临时端口,这是否意味着路由器可能会耗尽端口?
从理论上讲,但可能性不大。
NAT(通常)作用于元组{源IP、目标IP、源端口、目标端口}的映射。对于您的路由器,IP 地址之一是其本身,而元组的其他三个组成部分通常会因连接而异。假设我们将 NAT 应用于传出数据包(而不是其回复)。源 IP、目标 IP 和目标端口将是已知且固定的。源端口可能会有所不同。这为同一主机上的同一服务提供了大约 65000 个并发连接。通常,您将访问多个服务上的多个服务器,因此数字确实会迅速上升。
您更有可能耗尽连接状态表中的空间,该表可能只能处理几百个并发连接。即使它可以处理几千个并发连接,它仍然远远少于我们刚刚考虑的数字。
一旦空间不足,接下来发生的事情取决于实现。路由器软件可能拒绝允许额外的连接,或者可能会踢出最近最少使用的连接。无论如何,它可能会也可能不会返回相应连接尝试的错误信息。
有一个关于 CloudFlare 的好文章它描述了一些有关连接跟踪的 Linux 实现的信息。
答案2
是的,NAT 路由器可能会耗尽端口。
此时会发生什么由特定的 NAT 路由器实现决定,但一般来说,我希望一个常见的策略可能会抛出最近最少使用活动连接(即最长时间没有流量空闲的连接)并重用其端口。
然而,相关的RFC说TCP连接是由4个标识符的组合来标识的:
- 源IP地址
- 目的IP地址
- 源端口
- 目的端口
其中只有一个的区别是(并且必须be) 足以区分两个连接。
虽然主机通常为每个传出连接使用一个端口(作为源端口),但只要所有其他三个标识符不相同,NAT 路由器就可以重复使用端口号。
因此,外部 IP 地址为 NNNN 的 NAT 路由器可以将一个传出连接映射为 NNNN:60000 -> 1.2.3.4:80,将另一个同时连接映射为 NNNN:60000 -> 4.5.6.7:80,因为目的地不同IP 地址足以将数据包识别为属于两个单独的连接。
因此,如果 NAT 实现经过适当设计以处理大量连接,则在实践中不太可能发生端口号耗尽的情况。
答案3
是的,就像您的计算机打开太多网络连接一样,可能会耗尽端口。
不同之处在于 NAT 路由器没有很好的方法来报告错误,因此它可能只是默默地丢弃新连接的数据包。
答案4
是的,路由器(理论上)可以用完端口。
我不知道标准是否规定了路由器在这种情况下应该做什么。但由于大多数(TCP)连接的寿命相对较短,我想合理的第一步是保留数据包并在(非常)短时间内重试。如果端口不可用,我会看到两个选项:
- 默默地丢弃数据包 - 结果是无法建立连接,但客户端必须在不知道出了什么问题或问题发生在哪里的情况下处理它。
- 返回错误数据包 - 相同的结果,但至少客户端知道问题发生的位置。
我说的是“理论上”,因为在现实世界中,NAT 通常仅在拥有足够多(IP+)端口的情况下使用。