【发布时间】:2011-08-22 04:30:52
【问题描述】:
由于端口号限制为65536,连接数有限制吗?
每个连接有何不同?
如果是通过端口,那么同时连接数永远不会超过65536?
【问题讨论】:
标签: sockets connection port
由于端口号限制为65536,连接数有限制吗?
每个连接有何不同?
如果是通过端口,那么同时连接数永远不会超过65536?
【问题讨论】:
标签: sockets connection port
有许多不同的作品在发挥作用。由于连接是由(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之间的连接数,对吧?
getpeername(2) 查找remote IP 和端口,使用getsockname(2) 查找本地 IP和端口。有关包含地址和端口号的struct sockaddr 的详细信息,请参阅ip(7)。 (和ntohs(3) 将端口从网络端转换为主机端。)
TCP 连接实际上是由对等 IP 地址 + 对等端口 + 本地 IP 地址 + 本地端口来识别的,所以你实际上可以有超过 64k 的方式,但我不知道操作系统是否可以允许超过 64k每个本地 IP 地址。 Windows 没有。
有趣的是,端口在关闭后可以保留一小段时间。 (这样做是为了避免新旧连接之间的意外或故意串扰。)通过简单地创建和关闭紧密循环上的连接,您实际上可以使您的机器耗尽端口。请参阅http://www.perlmonks.org/?node_id=897591 以了解将通过用完所有套接字来挂起套接字连接调用(在某些机器上)的 Perl 代码。
UDP 也有端口,但 UDP 没有连接。因此,套接字仅由其本地 IP 地址 + 本地端口标识,因此每个本地 IP 地址最多可以有 64k UPD 端口。
更新:添加了关于 UDP 的段落。
【讨论】: