小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
- 源端口数量限制:
- 理论上最多能创建 65535 个 TCP 连接,因为端口号是 16 位的。但是 Linux 对端口号数量是有限制的,具体通过如下命令查看:
cat /proc/sys/net/ipv4/ip_local_port_range- 默认限制为 1024~65000,所以只有 63977 个端口可用
- 可以通过如下命令进行修改:
vim /etc/sysctl.confnet.ipv4.ip_local_port_range = 60000 60009sysctl -p /etc/sysctl.conf保存生效
- 建立连接后 Linux 会返回一个文件描述符 fd,Linux 下一切皆文件。当我们进行 TCP 通信时,对着这个 fd 读写就可以了。
- 理论上最多能创建 65535 个 TCP 连接,因为端口号是 16 位的。但是 Linux 对端口号数量是有限制的,具体通过如下命令查看:
- 目标端口数量限制:
- 当我们只对一个同一个目标 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
- 操作系统对文件描述符有一定的限制,每建立一个 TCP 连接,Linux 就得分配一个文件描述符,Linux 对可打开的文件描述符的数量分别作了三方面的限制:
- 线程限制:
- 传统的多线程并发模型,上下文切换会耗费大量资源;
- 可以使用 IO 多路复用方式。
- 内存限制:
- 每个 TCP 连接,以及这个连接所用到的缓冲区,都是需要占用一定内存的。内存是有大小限制的。
- CPU 限制:
-
同内存一样,CPU 也有限制。
-