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


50

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

显然,正在使用端口,因此由于这些原因不可能实现,因此可以将其视为理论上的尝试,以试图了解TCP在执行此类操作时会受到哪些限制。


11
这个问题的动机是什么?为什么要让那么多守护进程监听?
沃伦·杨

1
此外,您将很难开始那么多流程。(我假设您的意思是每个守护进程一个进程。)
沃伦·扬

13
虽然没有任何正式限制您一次穿65条裤子的方法,但是尝试这种做法很实际。如果您可以向我展示一台可以同时有效处理10'000 TCP端口的计算机,那么这可能是一个有趣的抽象问题。
msw

13
此Q的性质完全是理论上的,除了解TCP和端口号的限制外没有其他目的。
slm

1
事实是,您用某种方式将其表述为与64k +守护进程所需的RAM空间等各种实际问题相关的方式。您现在或未来十年左右可能拥有的任何计算机,在达到侦听器限制之前都会耗尽RAM。如果您将问题改写为仅谈论TCP 侦听器,而完全不讨论守护程序,那么该问题就消失了。例如,您可以通过为每个单线程事件驱动的守护程序分配一千个套接字来分摊堆栈空间。
沃伦·杨

Answers:


84

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

    SS#1

IPv6会改善吗?

否。即使IPv6将为我们提供更大的IP地址空间(32位和128位),也没有尝试改善端口号的16位TCP数据包限制。有趣的是,针对IPv6的RFC:Internet协议版本6(IPv6)规范,需要扩展IP字段。

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

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

                 SS#2

那么如何获得更多端口?

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

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

$ 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之后的生活

参考文献


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

7

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

不。

目的是在给定的系统上侦听超过65k守护程序。

然后,您需要:

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

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

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

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


我对此表示反对,因为您说不可能,然后继续解释如何使用多个IP和负载平衡来做到这一点,尽管这种方式非常令人困惑。
suprjami 2014年

2
在单个系统上不可能有超过64K的端口。可能有超过64K的侦听器,但是您必须具有代理或前端侦听器,这些代理或前端侦听器会将传入的连接“拆分”到正确的实际“后端”侦听器。例如,您可以对多个内部IP地址进行疯狂的操作,例如内部NAT。
LawrenceC

2
错误。人们已经设法在单个系统上获得了500万个并发连接。是的,需要多个IP和负载平衡器(不一定在同一系统上),但是如果操作正确,则单个系统可以打开超过64k端口,甚至可以打开超过64k侦听器。
suprjami 2014年

2

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

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

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

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

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

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

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

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

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


-2

是的你可以 !

它是在例如Edgehill加密服务器之前完成的,该服务器在线运行的恶意软件数量超过25.000.000。


9
考虑扩展您的答案,以包括有关OP如何完成此操作的一些指导,支持您答案的文档或相关说明。
HalosGhost

您可以提供此声明的参考吗?快速搜索使我相信无论它分布在很多机器上是什么。
Thomas Guyot-Sionnest '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.