一个TCP连接由一个四元组所确定

源IP源端口目的IP目的端口
任意一个元素改变,都代表一个新的连接,以Nginx为例,它的端口是固定使用80。另外服务器的IP也是固定的,那么理论上最多可以建立 2 ^ 32 (ip数)
× 2 ^ 16 (端口数) 个连接。

<>文件描述符限制

实际上,能建立的连接远小于这个数字。我们每打开一个连接都对应一个文件描述符fd(linux系统下一切皆文件)。出于安全角度的考虑,linux系统在多个位置都限制了可打开的文件描述符的数量,包括系统级、用户级、进程级。

* 系统级:当前系统可打开的最大数量,通过fs.file-max参数可修改
* 用户级:指定用户可打开的最大数量,修改/etc/security/limits.conf
* 进程级:单个进程可打开的最大数量,通过fs.nr_open参数可修改
<>内存限制

每一条TCP连接都有file、socket等内核对象,这样一个空TCP连接需要占用3.3KB内存,考虑到实际收发还要配置缓存区,这样内存占用更高了。

通过sysctl命令查看接收缓存区大小
$ sysctl -a | grep rmem net.ipv4.tcp_rmem = 4096 87380 8388608 net.core.
rmem_default = 212992 net.core.rmem_max = 8388608
tcp_rmem中的第一个值是TCP连接所需分配的最少字节数。该值默认是4K,最大为8MB。所以需要接收数据时,需要起码再分配4K内存。

通过sysctl命令查看发送缓存区大小
$ sysctl -a | grep wmem net.ipv4.tcp_wmem = 4096 65536 8388608 net.core.
wmem_default = 212992 net.core.wmem_max = 8388608
tcp_wmem中的第一个值是发送缓存区的最小值,默认也是4K。如果数据很大的话,该缓存区实际分配的也会比默认值大。

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信