我有一个UbuntuServer14.04安装,它是连接到互联网使用PPPoE。目前,我的ppp0接口有一个1492年的MTU,它主要工作。
我想把MTU提高到1500,这是我的ISP支持的。
到目前为止,我已经将底层以太网接口的MTU增加到1508,并尝试在/etc/ppp/peers/dsl-provider中添加以下行
mtu 1500
mru 1500但是我的ppp0接口仍然有一个1492年的MTU。我相信我添加的行的语法是正确的,因为使用低于1492的值确实像预期的那样工作。
手动将ppp0接口的MTU更改为1500个,但它只影响一个方向的数据包。这样,我就可以通过互联网发送1500个字节的数据包,它们将到达目的地,而不会被分割。但是传入的通信量仍然以1492字节碎片的形式发送给我。
通过在PPPoE连接中捕获以太网接口上的通信量,我可以看到,在我的UbuntuServer14.04机器发送给提供者的配置请求中,MRU被指定为1492。所以我知道问题就在我的连接上。
当配置文件显示1500时,为什么UbuntuServer14.04在配置请求中使用1492作为MRU?我怎么才能把它改成1500呢?
发布于 2016-09-18 14:59:26
我通过输入以下两个命令下载了ppp源代码:
sudo apt-get build-dep ppp
apt-get source ppp在头文件pppd/plugins/rp-pppoe/pppoe.h中,我发现了以下内容:
/* Header size of a PPPoE packet */
#define PPPOE_OVERHEAD 6 /* type, code, session, length */
#define HDR_SIZE (sizeof(struct ethhdr) + PPPOE_OVERHEAD)
#define MAX_PPPOE_PAYLOAD (ETH_DATA_LEN - PPPOE_OVERHEAD)
#define MAX_PPPOE_MTU (MAX_PPPOE_PAYLOAD - 2)ETH_DATA_LEN在/usr/include/linux/if_ether.h中定义
#define ETH_DATA_LEN 1500 /* Max. octets in payload */在pppd/plugins/rp-pppoe/plugin.c中,我发现了这个:
if (lcp_allowoptions[0].mru > MAX_PPPOE_MTU)
lcp_allowoptions[0].mru = MAX_PPPOE_MTU;
if (lcp_wantoptions[0].mru > MAX_PPPOE_MTU)
lcp_wantoptions[0].mru = MAX_PPPOE_MTU;所有这些都意味着rp-pppoe插件的硬编码限制为1492字节。而增加它的唯一途径是修改源代码,并以更高的限制重新构建插件。
通过从plugin.c删除上述四行并重新构建模块,我能够将MTU从1492年增加到1500个。这只有在已知的底层行支持更大的大小时才能工作,这恰好是我的连接上的情况。
为了检测底层行的能力,需要使用支持RFC 4638的较新的pppd版本。Ubuntu16.04有一个更新的pppd版本,因此应该能够为PPPoE使用更大的MTU大小,而无需重新编译任何代码。
发布于 2016-09-18 12:55:58
您可以通过strace和filter运行pppd,以显示“打开”请求,查看打开的文件从哪些文件获取其配置。
sudo strace -f -e open pppd在我的经验(英国宽带)所有的连接都是1492年,如果他们通过BT,有一个具体的原因,你需要另外8个八位数?
我的理解是,如果您与MRU不匹配,那么您的数据包最终会变成多个数据包,特别是如果您不允许8八进制开销进行封装的话。
https://askubuntu.com/questions/826525
复制相似问题