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