如何判断网络的最大传送单元大小?

网络通讯中,为了提高通讯效率,我们要求网络传输过程中,尽量减少分包的情况下使用最大的传输尺寸,但从我们的计算机到目标之间,要经过多个路由器,我们该怎么让程序自动检测这些值呢?

PMTU协议就是这么一种协议,我在这里简单介绍下具体的步骤:

1、创建一个RAW类型的Socket,推荐用ICMP或UDP协议,推荐ICMP协议吧。

2、设置DF标志位,禁止碎片整理,这是必需的步骤。

3、从大到小发送数据包,如果收到WSAEMSGSIZE错误,说明你的包太大了,降低到下一值。由于标准的最大传输单元相对固定,因此很快就可以达到目标。

具体的实现我这里就不提供了,实际实现并不复杂。补充下常见的传输单元尺寸:

1492 - 1520-20IP头(回环地址,不需要测试)
1480 - 1500-20IP头(以太网)
1472 - 1492-20IP头(PPPOE)
1460 - 1480-20IP头(PPPOE)
1440 - 1460-20IP头 (L2TP)
1432 - 1452-20IP头 (L2TP Over PPOE)
1424 - 1444-20IP头(PPTP)
1416 - 1436-20IP头 (PPTP Over PPPOE)
1384 - 1404-20IP头 (PPTP Over L2TP/L2TP Over PPTP)
1368 - 1388-20IP头 (PPTP Over PPTP)
546 - 576-20IP头 (PPP)

 

分享到: