pppoe拨号链路接口为何mtu设置为1492?

admin 2026-07-02 05:12:25 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文解析了PPPoE拨号接口MTU设为1492的底层原理。Linux系统中PPPoE虚拟接口MTU由物理接口MTU减去8字节PPPoE头部开销得出。当1500字节数据包经过1492MTU接口时会触发IP分片,降低转发性能。最佳解决方案是将底层物理接口MTU设为1508,使PPPoE接口MTU恢复为1500,从而无CPU开销地彻底避免分片。相比仅对TCP有效的MSS篡改方案,调整物理接口MTU是更优的配置实践。 综合评分: 90 文章分类: 网络安全


cover_image

pppoe拨号链路接口为何mtu设置为1492?

原创

车小胖谈网络 车小胖谈网络

车小胖谈网络

2026年7月1日 14:21 上海

在小说阅读器读本章

去阅读

突然发现有些搞不明白了

拨号链路接口会有6byte PPPoE_SESSION+2byte PPP_HEADER开销,当拨号路由器转发最大payload时,出接口会有1508字节要发送。

  • 如果执行mtu计算会加上8字节pppoe开销,则出接口会分片,那么常见的设置wan口mtu1492的目的是什么?1500和1492都会进行分片,1492的分片会更有效率?
  • 如果执行mtu计算不会加上8字节pppoe开销,则wan口还是按没超mtu算,不分进行片,发送1508+以太网封装字段,那这又为何要通常将pppoe接口mtu设置为1492?不减少不是能一次发送更多字节吗,是否是会对后续设备有影响?

假设PPPoE拨号客户端运行在光猫上,光猫的光纤接口(eth0)连接运营商上游网络。

在linux上,eth0在软件层面上有一个net_device实例,eth0为指向该实例的指针,完成初始化之后,eth0->mtu = 1500,标准的MTU 1500大小。

当PPPoE客户端成功拨号,动态生成一个用于描述PPPoE虚拟软件接口的net_device实例,pppoe为指向该实例的指针。

pppoe->mtu = ?

难道不应该是标准的MTU 1500大小?

并不是,系统通过这个

pppoe->priv.channels.chan->ppp_channel.private.proto.pppoe_opt.dev

这一坨什么东东?

指向eth0实例的指针,换句话说:

pppoe->priv.channels.chan->ppp_channel.private.proto.pppoe_opt.dev == eth0

PPPoE客户端读取自己依赖的硬件接口eth0的mtu,然后减去8(PPPoE头部),即可得到pppoe->mtu,对吗?

来计算一下:

pppoe->mtu = pppoe->priv.channels.chan->ppp_channel.private.proto.pppoe_opt.dev->mtu -8 =eth0->mtu – 8 = 1500 – 8 = 1492

读者可能会问,既然pppoe依赖于eth0,为何不直接计算?

pppoe->mtu = eth0->mtu – 8 = 1500 – 8 = 1492

而用上面一坨计算呢?

这是上帝的视角,系统不知道自己依赖于eth0,而是通过上面长长的一坨追踪到的。

当从局域网packet(size =1500)到达光猫,查询路由,需要从pppoe接口exit。

packet size(1500) > pppoe->mtu(1492)

需要IP分片。如果硬件网卡不支持fragment offload,则IP分片将由CPU处理,这将大大降低光猫的IP forwarding的性能。

有什么好的解决方案,可以完全避免上文的IP分片?

最好的方法,是光猫出厂或者运营商将eth0的mtu 设置为1508

运营商的交换机MTU,考虑到可能还有VLAN tag,QINQ,MPLS Label,PPPoE,将所有可能性都叠加上去,QINQ(8)+ 2 MPLS label(8)+PPPoE(8) =24,则MTU设置最小为= 标准MTU + 24 = 1500 +24 = 1524

那么pppoe->mtu = pppoe->priv.channels.chan->ppp_channel.private.proto.pppoe_opt.dev->mtu -8 =eth0->mtu – 8 =1508 – 8 = 1500

转发MTU=1500任何packet的时候,都无需IP分片!

当packet添加了8字节的pppoe头部,变成了1508,运营商可能还会添加VLAN信息、GPON头信息,只要保证最后的packet ≤ 交换机的MTU即可保证一路畅通!

其他的方法,诸如篡改TCP握手的MSS为1452,使得添加的20byte IP头+ 20byte TCP头,变成1492,途径pppoe->mtu(1492),也无需IP分片。

可是上述方法仅仅对TCP有效,对于UDP是无效的。另外篡改TCP握手的MSS本身,是需要CPU代价的,上文修改eth0= 1508是无需CPU额外代价的。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:车小胖谈网络 车小胖谈网络 车小胖谈网络《pppoe拨号链路接口为何mtu设置为1492?》

评论:0   参与:  0