【问题标题】:Number of network connections possible可能的网络连接数
【发布时间】:2011-08-22 04:30:52
【问题描述】:

由于端口号限制为65536,连接数有限制吗?

每个连接有何不同?

如果是通过端口,那么同时连接数永远不会超过65536?

【问题讨论】:

    标签: sockets connection port


    【解决方案1】:

    有许多不同的作品在发挥作用。由于连接是由(Src IP, Src Port, Dest IP, Dest Port) 元组定义的,因此在任何给定时间,两个给定对等方之间允许有 65536 ^ 2 个连接:从 1 到 1、从 1 到 2、.. 从 1 到 65535 等等。这只是在两个对等点之间——当然,您可以同时向多个对等点打开多个连接。

    但是,大​​多数操作系统都会限制每个进程打开的文件描述符/句柄的数量。此限制在历史上较低 (20),但现在通常更高(我的系统上为 1024,ulimit -a 将在 bash(1) 中显示每个进程的限制)。

    除了 Unix 系统上的setrlimit(3) 限制外,还有系统范围的限制; Linux 系统上的/proc/sys/fs/file-max 将报告整个系统上允许打开的最大文件数。 (这是我系统上的 596118。)其他系统会有不同的限制。

    而且,中间的stateful firewall 可能会限制打开的连接数。由于每个状态都需要防火墙表中的内存,因此任何状态都可能会强制执行一些任意限制以避免内存不足。

    【讨论】:

    • 65536 ^ 2 指定的2个 IP之间的连接数,对吧?
    • 你不需要增加文件描述符的数量来使用很多端口,因为套接字在关闭后会一直存在。
    • @DriverBoy,是的,这是两个 IP 地址之间的理论最大值。在实践中,最大值可以更低。
    • @DriverBoy,正确,这是两个特定 IP 之间的限制。如果你的本地机器有更多的 IP,那么你可以加倍。如果远程对等方有更多 IP,那么您可以再次将其加倍。如果两个对等点都有两个 IP,那么您可以在这两台机器之间同时打开 262140 个 TCP 会话。
    • @DriverBoy,是的,可以获取整个元组:使用getpeername(2) 查找remote IP 和端口,使用getsockname(2) 查找本地 IP和端口。有关包含地址和端口号的struct sockaddr 的详细信息,请参阅ip(7)。 (和ntohs(3) 将端口从网络端转换为主机端。)
    【解决方案2】:

    TCP 连接实际上是由对等 IP 地址 + 对等端口 + 本地 IP 地址 + 本地端口来识别的,所以你实际上可以有超过 64k 的方式,但我不知道操作系统是否可以允许超过 64k每个本地 IP 地址。 Windows 没有。

    有趣的是,端口在关闭后可以保留一小段时间。 (这样做是为了避免新旧连接之间的意外或故意串扰。)通过简单地创建和关闭紧密循环上的连接,您实际上可以使您的机器耗尽端口。请参阅http://www.perlmonks.org/?node_id=897591 以了解将通过用完所有套接字来挂起套接字连接调用(在某些机器上)的 Perl 代码。

    UDP 也有端口,但 UDP 没有连接。因此,套接字仅由其本地 IP 地址 + 本地端口标识,因此每个本地 IP 地址最多可以有 64k UPD 端口。

    更新:添加了关于 UDP 的段落。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      • 1970-01-01
      相关资源
      最近更新 更多