TCP 最多能创建多少个连接?

710 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

  • 源端口数量限制
    • 理论上最多能创建 65535 个 TCP 连接,因为端口号是 16 位的。但是 Linux 对端口号数量是有限制的,具体通过如下命令查看:
      • cat /proc/sys/net/ipv4/ip_local_port_range
      • 默认限制为 1024~65000,所以只有 63977 个端口可用
      • 可以通过如下命令进行修改:
        • vim /etc/sysctl.conf
        • net.ipv4.ip_local_port_range = 60000 60009
        • sysctl -p /etc/sysctl.conf 保存生效
    • 建立连接后 Linux 会返回一个文件描述符 fd,Linux 下一切皆文件。当我们进行 TCP 通信时,对着这个 fd 读写就可以了。
  • 目标端口数量限制
    • 当我们只对一个同一个目标 IP 端口号访问时,有端口号数量限制,那么如果我们变换了目标 IP 和端口,其实就不会有 socket 四元组限制了。理论上,可以无限建立连接。
  • 文件描述符限制
    • 操作系统对文件描述符有一定的限制,每建立一个 TCP 连接,Linux 就得分配一个文件描述符,Linux 对可打开的文件描述符的数量分别作了三方面的限制:
      • 系统级:当前系统可打开的最大数量,通过 cat /proc/sys/fs/file-max 查看
      • 用户级:指定用户可打开的最大数量,通过 cat /etc/security/limits.conf 查看
      • 进程级:单个进程可打开的最大数量,通过 cat /proc/sys/fs/nr_open 查看
    • 默认是 100000
    • 修改方式,例如:
      • echo 100 > /proc/sys/fs/nr_open
  • 线程限制
    • 传统的多线程并发模型,上下文切换会耗费大量资源;
    • 可以使用 IO 多路复用方式。
  • 内存限制
    • 每个 TCP 连接,以及这个连接所用到的缓冲区,都是需要占用一定内存的。内存是有大小限制的。
  • CPU 限制
    • 同内存一样,CPU 也有限制。

参考文档