TCP 可以提供超过 65535 个端口吗?

slm*_*slm 55 linux networking ip tcp ipv4

是否可以设置 Linux 系统使其提供超过 65,535 个端口?目的是让超过 65k 个守护进程在给定的系统上监听。

显然有端口正在使用,因此由于这些原因这是不可能的,因此将其视为尝试了解 TCP 在执行此类操作时会受到限制的地方的理论练习。

slm*_*slm 89

查看 TCP 的 RFC:RFC 793 - 传输控制协议,答案似乎是否定的,因为 TCP 标头对于源/目标端口字段限制为 16 位。

    党卫军#1

IPv6 会改进吗?

不会。尽管 IPv6 将为我们提供更大的 IP 地址空间,32 位与 128 位,但它并未尝试改进 TCP 数据包对端口号 16 位的限制。有趣的是 IPv6 的 RFC: Internet Protocol, Version 6 (IPv6) Specification,需要扩展 IP 字段。

当 TCP 在 IPv6 上运行时,用于计算校验和的方法会根据RFC 2460更改:

任何在其校验和计算中包含来自 IP 标头的地址的传输或其他上层协议都必须修改以在 IPv6 上使用,以包含 128 位 IPv6 地址而不是 32 位 IPv4 地址。

                 党卫军#2

那么如何获得更多的端口呢?

一种方法是使用更多接口堆叠额外的 IP 地址。如果您的系统有多个 NIC,这会更容易,但即使只有一个 NIC,如果需要,也可以使用虚拟接口(又名别名)来分配更多 IP。

注意:使用别名已被取代iproute2,您可以使用别名在单个接口上堆叠 IP 地址(即eth0)。

例子

$ sudo ip link set eth0 up
$ sudo ip addr add 192.0.2.1/24 dev eth0
$ sudo ip addr add 192.0.2.2/24 dev eth0
$ ip addr show dev eth0
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc
      pfifo_fast state DOWN qlen 1000
    link/ether 00:d0:b7:2d:ce:cf brd ff:ff:ff:ff:ff:ff
    inet 192.0.2.1/24 brd 192.0.2.255 scope global eth1
    inet 192.0.2.2/24 scope global secondary eth1
Run Code Online (Sandbox Code Playgroud)

来源:iproute2:ifconfig 后的生活

参考

  • 仅使用目标端口是不可能在 65,536 多个守护进程中进行选择的,但是如果一个具有无限内存和带宽的守护进程,则每个传入端口上的每个不同 TCP 地址都可以有超过 32,000 个连接。 (3认同)

Law*_*ceC 6

是否可以设置 Linux 系统使其提供超过 65,535 个端口?

不。

目的是让超过 65k 个守护进程在给定的系统上监听。

那么你需要:

  • iptables重定向流量内容的配置或

  • 一个“服务代理服务”或“多路复用器服务”,它将接受单个端口上的传入连接并将其路由到“后面”的适当守护程序。如果您希望标准协议未经修改地通过,您可能必须在此多路复用器服务中以 IDS 或第 7 层防火墙会分析的方式实现协议嗅探/识别;大多数协议完全可能。

根据第二项,如果您真的愿意,您可以将此服务设计为处理超过 2^16 个“端口”。我确信与运行 2^16+ 个侦听器的负载相比,性能影响将是最小的。

Linux 中的守护进程可以侦听文件系统中存在的 unix 套接字,因此您的“多路复用器服务”可以维护外部端口 <-> 内部 unix 套接字的内部映射。在任何现代文件系统上的 inode 耗尽之前,您可能会遇到内核进程限制(32Kbyte 进程?)。

  • 错误的。人们已经设法在单个系统上获得 50 万个并发连接。是的,需要多个 IP 和负载平衡器(不一定在同一系统上),但如果做得好,单个系统可以打开超过 64k 的端口,甚至超过 64k 的侦听器。 (3认同)
  • 单个系统上的端口数超过 64K 是不可能的。超过 64K *listeners* 可能是可能的,但您必须拥有代理或前端侦听器,可以将传入连接“拆分”到正确的真正“后端”侦听器。例如,您可以对多个内部 IP 地址执行诸如内部 NAT 之类的疯狂操作。 (2认同)