家里Wi-Fi一到晚上就卡,手机刷视频转圈,电脑打游戏掉帧。很多人第一反应是路由器不行,换个贵的试试。可换了还是没改善,问题可能不在硬件,而在你没注意的地方——协议栈占用资源大小。
协议栈不是“看不见”就没开销
操作系统处理网络通信时,协议栈是核心组件。它负责TCP/IP封包、连接管理、错误校验这些事。听着挺底层,但它确实要吃内存、占CPU。尤其是设备同时连几十个应用:微信后台同步、云盘上传、智能音箱心跳、网页自动刷新……每个连接都在协议栈里占个“工位”。
别小看这些“工位”。一个TCP连接在Linux内核里大约消耗4KB内存。100个连接就是400KB,看着不多?但嵌入式设备比如家用路由器,总内存可能就64MB,系统一跑起来,留给协议栈的空间其实很紧张。
小设备更容易“憋住”
公司用的千兆交换机当然扛得住高并发,但你家那个百元级无线路由器呢?它的CPU主频可能不到500MHz,内存也就32~128MB。一旦协议栈处理不过来,新连接建立慢,旧连接频繁重传,结果就是网页打不开,视频缓冲不停。
这种情况在IoT设备多的家庭特别明显。空调、灯泡、摄像头都联网,每个设备定时发心跳包,协议栈不断建连断连,CPU占用蹭蹭涨。哪怕带宽充足,体验也差。
怎么查协议栈是不是“太累”?
如果你能登录路由器后台或运行Linux的网关设备,可以看看当前连接数:
cat /proc/net/nf_conntrack | wc -l
这个命令统计当前NAT连接跟踪表里的条目数。超过2000条就得警惕了,尤其设备本身性能一般的话。也可以用:
top
观察内核进程如ksoftirqd或net_tx/net_rx的CPU占比,如果长期高于20%,说明网络处理压力大,协议栈可能成了瓶颈。
优化不是换设备才有效
减少协议栈负担,不一定非得花钱升级。几个实用办法:
关掉不用的远程管理功能,比如Telnet、UPnP,这些服务会常驻监听端口,增加攻击面也占资源。
调整TCP连接超时时间。默认空闲连接可能保持5分钟以上,改成90秒能快速释放资源:
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=90
限制单IP最大连接数,防某些设备“霸线”:
iptables -A FORWARD -p tcp --syn -m connlimit --connlimit-above 50 -j REJECT
这些设置在OpenWrt这类开源固件上都能操作。改完你会发现,半夜刷剧不再卡顿,设备响应也更灵敏。
协议栈虽小,影响不小。它不直接决定带宽,却决定了你能把带宽用得多顺畅。与其盲目追高配,不如先看看系统内部是不是已经“堵车”了。