|
本帖最后由 Matrix 于 2017-12-21 16:22 编辑
MTU(Maximum Transmission Unit,最大传输单元)。
MRU(Maximum Receive Unit,最大接收单元)。
MTU是以太网数据链路层概念,MRU是PPP链路数据链路层的概念.但是都是最大传输单元的意思
1.原理说明(这部分来自百度百科,也相当好理解)
因为协议数据单元的包头和包尾的长度是固定的,MTU越大,则一个协议数据单元的承载的有效数据就越长,通信效率也越高。MTU越大,传送相同的用户数据所需的数据包个数也越低。
MTU也不是越大越好,因为MTU越大, 传送一个数据包的延迟也越大;并且MTU越大,数据包中 bit位发生错误的概率也越大。
MTU越大,通信效率越高而传输延迟增大,所以要权衡通信效率和传输延迟选择合适的MTU。
以以太网传送IPv4报文为例。MTU表示的长度包含IP包头的长度,如果IP层以上的协议层发送的数据报文的长度超过了MTU,则在发送者的IP层将对数据报文进行分片,在接收者的IP层对接收到的分片进行重组。
这里举一个具体的例子说明IP包分片的原理。以太网的MTU值是1500 bytes,假设发送者的协议高层向IP层发送了长度为3008 bytes的数据报文,则该报文在添加20 bytes的IP包头后IP包的总长度是 3028 bytes,因为3028 > 1500,所以该数据报文将被分片,分片过程如下:
1. 首先计算最大的IP包中IP净荷的长度 =MTU-IP包头长度=1500-20= 1480 bytes。
2. 然后把3028 bytes按照1480 bytes的长度分片,将要分为3片,3028= 1480+1480+68。
3. 最后发送者将为3个分片分别添加IP包头,组成3个IP包后再发送,3个IP包的长度分别为1500 bytes、1500 bytes和 88 bytes。
在网络通讯中,需要尽量避免发生分片和重组,因为分片重组对网络性能影响较大。数据包发送时选择合适的MTU大小对提高通讯性能很有必要。MTU大小的选择有协议协商方式,通过全路径的MTU发现机制,找到整条路径的最小MTU(也就是路径MTU),然后报文发送式小于等于路径MTU,这就避免了数据传输过程中产生分片,从而提高数据转发性能。MTU的协议发现机制由于安全等方面的原因,并不能总是生效,这时候就需要根据网络的特性选择合理的MTU。如果在报文传送过程中分片是不可避免的,那么要想办法让重组尽量在终端进行,避免在转发路径中进行。
2.找出当前网络最佳MTU(以下以DHCP光纤为例)
运行cmd,执行以下PING命令(-l 是为了不拆分数据包)
ping -l 14xx -f www.qq.com (14xx是要测试的包大小)
可以用半分的方法找到最佳值。
例如测试1460-1500区间。
1.先ping -l 1500 -f www.qq.com 提示:需要拆分数据包但是设置DF
2.再次ping -l 1460 -f www.qq.com ,这是发现ping有正常的ECHO。
3.然后测试区间递进为(1500-1460)/2=20,也就是测试ping -l 1480,发现依旧是需要拆分数据包但是设置DF。
4.说明值在1460-1480之间,然后我们可以测试ping -l 1470 -f www.qq.com,发现正常ECHO,说明数值在1470-1480之间。
然后同样道理,测试1475,发现需要拆分。说明数值在1470-1475之间。然后测试1473,发现需要拆分。
说明在1470-1473之间,接下来可以分别测试1470 1471 1472。发现最大不拆分的MTU值为1472。
这个MTU就是最佳MTU?其实不是,也可以说是。为什么这么说?
说是的原因是,往往这个值就是最佳的MTU,只需要加上28字节的开销,也就是1472+28=1500。而PPPOE往往为1492。
但是有些情况下,这个只是能不拆分数据包最大通过的MTU,而不是网络性能最佳时候的MTU。
这时候需要在这个数值附近不断尝试,如果找到时延比这个更低的MTU,那个才是最佳的MTU。
3.深入理解MTU/MRU。(注:MSS(Max Segment Size),最大传输段,就是报文段的最大长度)
1 以太网最小包大小 = 512bit = 64 Byte
2 以太网最大包大小 = 1518 Byte
3 所以以太网IP的MTU = 1518 - 18 ( 6 SRCMAC+ 6 DSTMAC+ 2 TYPE+ 4 CRC) = 1500 B
4 所以TCP的MSS = 1500 - 40 ( 20 IP包头 + 20 TCP包头) = 1460 B
5 所以UDP协议的 MTU/MRU = 1500 - 28 ( 20 包头 + 8 UDP包头 ) = 1472 B
6 所以PPPoE MTU/MRU = 1500 - 8 ( 6 PPPoE会话开销 + 2 PPP包头 ) = 1492 B
7 所以经过PPPoE MSS的TCP MTU = 1492 ( PPPoE MTU/MRU ) - 40 ( 20 IP包头 + 20 TCP包头) = 1452
8 所以 PPTP MTU/MRU = 1500 - 56 ( 20 IP包头 + 20 TCP包头 + 12 GRE包头 + 4 PPP包头 ) = 1444 B
9 所以经过 PPTP MSS的TCP MTU = 1444 ( PPTP MTU/MRU ) - 40 ( 20 IP包头 + 20 TCP包头) = 1404
10 所以 L2TP MTU/MRU = 1500 - 40 ( 20 IP包头 +8 UDP包头 + 8 L2TP包头 + 4 PPP包头 ) = 1460 B
11 所以 TCP 经过 L2TP MSS = 1460 ( L2TP MTU/MRU ) - 40 ( 20 IP包头 + 20 TCP包头) = 1420 B
12 所以 PPTP 经过 PPPoE MTU/MRU = 1492 ( PPPoE MTU/MRU ) - 56 ( 20 IP包头 + 20 TCP包头 + 12 GRE包头 + 4 PPP包头 ) = 1436 B
13 所以 PPTP 经过 PPTP MTU/MRU = 1444 ( PPTP MTU/MRU ) - 56 ( 20 IP包头 + 20 TCP包头 + 12 GRE包头 + 4 PPP包头 ) = 1388 B
14 所以 PPTP 经过 L2TP MTU/MRU = 1460 ( L2TP MTU/MRU ) - 56 ( 20 IP包头 + 20 TCP包头 + 12 GRE包头 + 4 PPP包头 ) = 1404 B
15 所以 L2TP 经过 PPPoE MTU/MRU = 1492 ( PPPoE MTU/MRU ) - 40 ( 20 IP包头 +8 UDP包头 + 8 L2TP包头 + 4 PPP包头 ) = 1452 B
16 所以 L2TP 经过 PPTP MTU/MRU = 1444 ( PPTP MTU/MRU ) - 40 ( 20 IP包头 +8 UDP包头 + 8 L2TP包头 + 4 PPP包头 ) = 1404 B
17 所以 L2TP 经过 L2TP MTU/MRU = 1460 ( L2TP MTU/MRU ) - 40 ( 20 IP包头 +8 UDP包头 + 8 L2TP包头 + 4 PPP包头 ) = 1420 B
故而,在PPPOE线路上的准确MTU值是 1436,L2TP的准确MTU是1452。
如果你用 ADSL 上网,然后用 PPTP FQ,那么,你实际上是 PPP 协议跑在 TCP 协议上再跑在 IP 协议上再跑在 PPP 协议上再跑在 IP 协议上再跑在以太网上。1518 字节的以太网最大包大小,减来减去,就剩下 1436。同理L2TP跑在PPP链路上,减来减去也就只剩1452B了,如果网络异常,可能是把数据包全丢掉了。
如果明白了以上的表,那么考虑你用PPTP连公司的VPN,公司又PPPOE拨号(ADSL账号),然后你再 PPTP 來FQ,那么,你的 MTU 只能设为 1518-18-8-56-56=1380 字节。
|
|