MTU 指链路中能通过最大数据包的大小,通常指 ip 包,比如以太网能最大传输 1500 字节 ip 包,pppoe 因为 ppp 协议占掉 8 字节,所以最大能传输 1492 字节 ip 包
通常,ipv4 协议头 20 字节、ipv6 协议头 40 字节,tcp 协议头 20 字节,WireGuard 协议头 40 字节,此网站可以查阅
wireguard 隧道的默认 MTU = 1500 - 40(最大 ip 头)- 40(wg 协议) = 1420 ,pppoe 下再 -8 = 1412
TCP MSS 指链路中能传输的 tcp 有效载荷的大小,1500 - 20/40(ip 头) - 20(tcp 头) = 1460(ipv4) 或 1440(ipv6),pppoe 下 1452(ipv4) 或 1432(ipv6)
ipv6 不支持数据包切片,且现阶段路由器基本都没有对 ipv6 默认加上 mss 钳制,所以在 pppoe 下需要手动加上 mss 钳制,一般按照 1432 设置就可以,也有人建议避免潜在麻烦直接设置到RFC 规范限制的最小 ipv6 包 1280 ,mss = 1280 - 60 = 1220 (有些人说设置到 1280 并不正确)
mss clamping 原理:tcp 握手阶段,双边主机会在 syn 包中携带它所在链路能传输的最大 tcp 载荷信息,即 tcp-mss 信息,握手后用两边更小的那个 mss 来封装数据包。当双边主机都给出错误的 mss 信息时,通信就无法顺畅进行。例如常见的,假如双边主机都认为自己的链路 mtu 是 1500 ,当遇到遇到链路中间有 pppoe 或者其他隧道 mtu 更小的隧道时,通信就无法正常进行。mss clamping 就是修改握手数据包把双边通告的 tcp-mss 调整到能通过路由器的正确的大小。理论上只要一边是对的,就能正常通信。只需要单边 clamping
因此除了 mss clamping ,我觉得更好的方式是修改路由器 ra 宣告 的 mtu 值到 1492 (默认 1500 ),让内网的主机知道正确的链路 mtu 。我已经抓包证实,ra mtu 改到 1492 后,内网发出的所有 syn 包的 tcp-mss 全部都是 1432 。
然而,我在默认 1420 下用的一点毛病也没有 连日本 aws 能跑到 100M ,几乎没有断流的现象。所以这个点让我有点困惑,不知道需不需要调整,还是说 routeros 对 wireguard 是有处理的?
如果修改的话,需要客户端和服务端一起修改,如果只改客户端(在路由器上)不加 mss clamping 反而会出现连通性问题。原因应该是路由器下的主机不知道有 wg 的存在发起 syn 还是基于 1492 的 mtu ,wg 服务端因为隧道就在主机上,他会用 1420mtu 握手,最终取小的 1420 进行通信。如果路由器客户端修改到了 1412 。他们协商的 1420 将无法通过路由器的接口。必须 clamping
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.