在不深入研究内核源代码的情况下,我已经尽了最大的努力。关于该主题似乎有大量虚假信息/错误信息,所以我希望这能为我和其他人一劳永逸地回答这个问题。
严格说来IPv4,端口耗尽实际上有可能吗?让我解释:
- 似乎有65535个端口可以使用。0不可用。
- 我读过端口耗尽要求(src ip,src端口,dst ip,dst端口)元组是唯一的。
- 为了清楚起见,并假设我可以通过sysctl net.ipv4.ip_local_port_range设置使用100%的临时端口
这就是问题:这是如何工作的?
- 我可以从127.0.0.1:(x)到127.0.0.1:80有65k个连接
- 我可以从127.0.0.1:(x)到127.0.0.1:555有65k个连接
- 基本上再一次,问题是(srcip,srcport,dstip,dstport)必须是唯一的,对吗?
- 我无法打开从 IP“ A”到IP“ B”,端口“ N”的超过65k个连接
- 同样,单个IP不能在xxxx:80处打开到我的Web服务器的超过65k的连接,但是,只要它们来自不同的源IP,我就可以总体支持超过65k的连接。
最后,我对正在侦听的(传出)临时端口和传入端口有些困惑。我意识到,一旦建立了连接,连接的每一端都是对等的,并且相等,但是在此之前发生了:
例如,如果确实(srcip,srcport,dstip,dstport)元组必须是唯一的,那么如果启用,为什么会这样呢?
net.ipv4.ip_local_port_range = 1024 65535
这允许使用1024-65535的临时端口,如果我有绑定在端口3306上的服务(例如,mySQL),则由于使用该端口,有时它们将无法启动。
这是否与以下事实有关:(这是我要验证的声明):
- (srcip,srcport,dstip,dstport)对于端口范围为1-65535的每个连接都必须是唯一的(不注意操作系统对临时端口的使用)
- 但是,对于要绑定的套接字,可以将其视为(srcip,srcport,*,*)。换一种说法,IP是否一定出于某种原因不能使用该端口?
我可以验证上述行为,即使用上面的确切sysctl行,由于这个原因,我将mySQL移到了一个低于1024的端口,因为它偶尔会非常随机地失败,因为假设操作系统正在使用该端口(3306)临时港口。