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

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

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

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

答案1

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

    SS #1

IPv6 会改善现状吗?

不会。尽管 IPv6 将为我们提供更大的 IP 地址空间(32 位与 128 位),但它并没有尝试改善 TCP 数据包对端口号的 16 位限制。有趣的是 IPv6 的 RFC:互联网协议第 6 版 (IPv6) 规范,IP领域需要拓展。

当 TCP 在 IPv6 上运行时,用于计算校验和的方法会发生变化,如下所示:RFC 2460:

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

                 SS #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

来源:iproute2:ifconfig 之后的生活

参考

答案2

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

没有。

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

那么你需要:

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

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

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

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

答案3

只是因为没有好的答案,我才想插话。

一种方法是添加指定端口扩展的 IP 选项。该选项必须设计为适合 IP 标头的可选部分,并且会被未知的跃点跳过。

您可以使用此选项及其信息来扩展源、目标或两个端口号。

无论如何,仅通过添加选项,这些限制不会在现有软件中自动起作用,无论如何实现,都必须重写它们才能利用该选项,现有软件和防火墙将忽略数据包或照常处理它使用源端口字段和目标端口字段中的值。

简而言之,这并不容易做到,最好使用单个可重用侦听器和数据包有效负载中包含的数据来完成。

您还可以更轻松地允许在软件中重用端口,这可以通过为多个客户端连接重用服务器端口来帮助克服此限制。

例如,Rtsp 可以将 SessionId 标头与 IP 数据包有效负载中的各种其他标头结合使用,以确定发出请求的连接并相应地采取行动,例如,如果传递消息的套接字与套接字的套接字不同,会话对应的远程地址,然后可以允许使用新套接字更新会话以进行处理、拒绝消息或根据应用程序执行各种其他操作。

Http 服务器也可以执行此操作或任何其他类型的服务器。

允许重用端口时要记住的关键一点是,您还必须考虑源 IP 地址。

相关内容