前言(可以跳过不看)
从使用软路由第一天起,就是自己装 linux 做路由器,所以一直不会用 openwrt 。随着宽带速度越来越高,对于硬件的要求也越来越大,同时软件优化的压力也变得更高起来。
自从安装电信宽带,我一直用的是 Linux pppoe 拨号的模式,记得刚升级 500m 宽带的时候,碰到过怎么也跑不满带宽的现象,后来发现是自己的 pppoe 拨号没有调用 rp-pppoe 的 kernel 加速模块,造成 cpu 利用率过高无法满速。
后来安装了千兆宽带,上的是 SDN ,刚装好想办法让师傅开成了桥接模式,但是某一天突然就变成了路由模式,后来一想,SDN 如果普及下来,以后可能很难变桥接了,于是调整了路由器的结构,适配了路由模式。 去年把宽带升级到了 2000m ,发现电信提供的华为光猫没有 2.5G LAN 口,就淘了一个中兴的 4607 回来,当时也没有改桥接,继续使用路由模式。
正文
昨天,觉得自己家里的网关出去的数据包,经过光猫后,无法抓包到 NAT 后包的 port ,对于自己做一些网络通讯的程序调试不便,所以想试一下改成桥接模式,用 linux 拨号。
改起来很简单,改完之后貌似一切正常。但是用各种工具测速,发现原来随便都能测到 2000mbps 的,现在有时候只能测到 1000m 不到,有时候才 300m 。然而,奇怪的是,当我在软路由上跑 superspeed ( speedtest 脚本)的时候,却又能正常跑到 2000m 。
这时候,我发现 ppp0 的 mtu 是 1442 ,不是一般理解的 1492 , 于是上网查了,发现是精品网的特点。抓包一下,发现有很多 ip-proto-6 的奇怪包,后来一想,是 mss 问题,我改成 ppp 拨号的时候,忘记 iptables 加 clampmss 了,于是加上后,发现基本每次测速都能达到 1000m 出头了。于是问题还是没有解决。
我首先怀疑的是我的软路由硬件性能问题。 因为为了硬件升级方便,我把软路由做成了 kvm 镜像,随便一个硬件装个 linux 启动 kvm 就可以运行软路由。而最近用的硬件是 n5105cpu ,属于能力比较弱的。
我试了一下,去除所有防火墙策略和 ip rule ,并不能明显提高网速。 然后在主机上直接跑 pppoe 和 nat ,不通过 kvm 虚拟化,明显性能提高了很多,但是还是不怎么稳定。
最后,我又恢复到了路由模式下,轻松测速 2200mbps 。 我想,只能升级硬件了。 但是为什么桥接模式下速度要比路由模式慢呢,这个问题还是没有解决。 以前有人说是光猫的问题, 我这个实验完全可以排除光猫问题,因为软路由上测速是满速的。
我还是不死心,路由模式下,在软路由链接光猫的接口下,跑了 tcpdump ,这次发现,每次抓到的 tcp 数据包大小居然不再是 1390 ( mtu1442 下),而是几千几万了。 原来这时候,网卡 offload 开始工作了,网卡可以把 tcp 分段的数据包整合起来丢给内核,于是内核处理数据包的量级一下子减低了很多,这就是路由模式和桥接模式最大的区别。
总结
光猫采用路由模式时,tcp 数据包通过网卡到达软路由时,网卡将 tcp 分段数据包整合成一个,使得 linux 内核处理数据包的压力低了很多。
而光猫采用桥接模式时,tcp 数据包通过 ppp0 接口到达 linux 内核,一个数据包的大小只有 1400 不到,与路由模式下动则上万的数据包大小相差了近十倍,因此内核路由和防火墙模块的压力都要比路由模式下大了近十倍。
这种现象对于 openwrt 这种基于 linux 没有硬件 ppp 加速的软路由,应该也是一样的。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.