linux 盒子可以同时打开多少个输出套接字
How many simultaneous outgoing sockets a linux box can open
我想知道一个 linux 盒子可以为 IPv4 和 IPv6 中的 TCP、UDP 和 ICMP 通信打开多少个同时 套接字。虽然有几个关于处理 incoming(主要是 TCP)连接的回复,但我没有看到关于 outgoing.
的明确说明
我的理解如下:
TCP:由于TCP是基于端口的,所以只能打开与临时端口数相等的套接字,我的盒子上是
cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999 # == 28231
如果我想增加该数量(不更改上述配置),我将需要创建额外的接口并且每个接口我将获得大约 28K 的额外连接,对吗?
这里是否有任何每个系统进程需要考虑的因素?
我可以看到使用额外的(虚拟)接口和 public IP,但如果我在虚拟接口上定义私有 IP 并通过唯一的 public IP 对它们进行 NAT,它仍然有效吗?
UDP:我相信 UDP 也是如此,因为 UDP 也使用端口。如果我有 UDP 和 TCP 流量,两者都会竞争 28K 端口,对吗?
ICPM:ICMP 不基于端口,那么打开(原始)套接字的数量限制是多少?是否取自FD池最大开启数:
cat /proc/sys/fs/file-max
9223372036854775807
IPv6:以上都是与 IPv4 相关的,但是 IPv4 和 IPv6 在这方面有什么区别?
这有点乱,因为我不是很清楚。在此先感谢您的指教!
... one can only open a number of sockets equal to the number of ephemeral ports
没有。 TCP 连接对于源 IP、源端口、目标 IP 和目标端口的集合必须是唯一的。因此,只有在其他一切都保持不变的情况下,关于源端口的限制才是正确的。这意味着对于传出连接,此限制仅适用于与特定固定 IP 和端口的连接(假设传出接口上只有一个 IP)。
对于 UDP,还必须区分已连接和未连接的套接字。对于已连接的套接字,适用与 TCP 连接相同的限制。但是也可以有未连接的 UDP 套接字,它可以 sendto
到任意对等点,也可以 recvfrom
来自任意对等点,即每个发送或接收的数据包对于对等点来说都是唯一的。在这种情况下,套接字的数量受端口数量的限制,因为每个未连接的套接字都需要(通常,请参阅 SO_REUSEPORT 以了解例外情况)具有唯一的源 IP 和源端口。但另一方面,这些套接字更灵活,因为单个套接字可用于与任意对等点通信。
... what is the limit on the number of open (raw) sockets
没有固有的限制。但是由于所有传入数据都传递到所有原始套接字,因此原始套接字太多会变得混乱。
IPv6: all above was IPv4 related, but what are the differences between IPv4 and IPv6 on that matter ?
没有区别。
除了这些限制之外,当然还有其他限制,例如每个进程打开的文件描述符的数量,文件描述符的总数......。但是这些限制是可以调整的,并且主要受可用内存量的限制。
我想知道一个 linux 盒子可以为 IPv4 和 IPv6 中的 TCP、UDP 和 ICMP 通信打开多少个同时 套接字。虽然有几个关于处理 incoming(主要是 TCP)连接的回复,但我没有看到关于 outgoing.
的明确说明我的理解如下:
TCP:由于TCP是基于端口的,所以只能打开与临时端口数相等的套接字,我的盒子上是
cat /proc/sys/net/ipv4/ip_local_port_range 32768 60999 # == 28231
如果我想增加该数量(不更改上述配置),我将需要创建额外的接口并且每个接口我将获得大约 28K 的额外连接,对吗?
这里是否有任何每个系统进程需要考虑的因素?
我可以看到使用额外的(虚拟)接口和 public IP,但如果我在虚拟接口上定义私有 IP 并通过唯一的 public IP 对它们进行 NAT,它仍然有效吗?
UDP:我相信 UDP 也是如此,因为 UDP 也使用端口。如果我有 UDP 和 TCP 流量,两者都会竞争 28K 端口,对吗?
ICPM:ICMP 不基于端口,那么打开(原始)套接字的数量限制是多少?是否取自FD池最大开启数:
cat /proc/sys/fs/file-max 9223372036854775807
IPv6:以上都是与 IPv4 相关的,但是 IPv4 和 IPv6 在这方面有什么区别?
这有点乱,因为我不是很清楚。在此先感谢您的指教!
... one can only open a number of sockets equal to the number of ephemeral ports
没有。 TCP 连接对于源 IP、源端口、目标 IP 和目标端口的集合必须是唯一的。因此,只有在其他一切都保持不变的情况下,关于源端口的限制才是正确的。这意味着对于传出连接,此限制仅适用于与特定固定 IP 和端口的连接(假设传出接口上只有一个 IP)。
对于 UDP,还必须区分已连接和未连接的套接字。对于已连接的套接字,适用与 TCP 连接相同的限制。但是也可以有未连接的 UDP 套接字,它可以 sendto
到任意对等点,也可以 recvfrom
来自任意对等点,即每个发送或接收的数据包对于对等点来说都是唯一的。在这种情况下,套接字的数量受端口数量的限制,因为每个未连接的套接字都需要(通常,请参阅 SO_REUSEPORT 以了解例外情况)具有唯一的源 IP 和源端口。但另一方面,这些套接字更灵活,因为单个套接字可用于与任意对等点通信。
... what is the limit on the number of open (raw) sockets
没有固有的限制。但是由于所有传入数据都传递到所有原始套接字,因此原始套接字太多会变得混乱。
IPv6: all above was IPv4 related, but what are the differences between IPv4 and IPv6 on that matter ?
没有区别。
除了这些限制之外,当然还有其他限制,例如每个进程打开的文件描述符的数量,文件描述符的总数......。但是这些限制是可以调整的,并且主要受可用内存量的限制。