最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

MPLS MTU问题

IT圈 admin 107浏览 0评论

2024年8月29日发(作者:满山槐)

MPLS MTU问题

MPLS MTU每次想写的时候都觉得很麻烦,因为问题的原因只有一个,但是现象

千差万别,各个产品实现还不一样,即使同一个产品不同板卡也有区别。

【问题描述】

问题一:

问题二:

现象:如下网络结构,四个设备PE设备间,互为IBGP邻居。相互间

使用loopback口建立BGP peer。S9505与SR6608A之间的BGP邻居不

断UP/Down

经排查,发现更改IGP路由优先级,使S9505与SR6608A间数据流优

选NE40就不会出现问题,如果数据流优选SR8805就会出问题。查看

线路发现S8805的线路上还经过了两个交换机。如下图:S9505和

SR8805之间有一台3com S4500G全千兆交换机。S8805和SR6608A之

间有一台S3126T交换机。并且中间的报文为二层互通,带VLAN tag。

现象:宁波江北政务网为MPLS L3 VPN环境,AR46作为纯P设备,下

挂两台S85作为PE。

拓扑如下,一台S85下用户业务正常,另一台则邮件附件不能上传,

部分业务不能使用。两台S85配置基本相同

AR46

| |

| |

| |

S85B--------S85A(业务不正常)

经排查,发现业务正常S85接AR46主控板以太口,业务不正常S85

接AR46 2GE单板中的一个千兆口。

AR46

ERPU口 2GE口

| |

| |

| |

S85B--------S85A

问题三:

现象:SR6602A和C7509两个PE设备间IBGP邻居不断UP/Down。

经排查,发现SR6602A和C7509发现设备之间使用的使PPP MP进行的

互连。

问题四:

现象:三个PE设备AR46,AR46B下私网用户访问和AR46A,AR28互访

正常。AR46A和AR28之间的用户可以ping通,但无法互访。

经排查,发现AR46A到AR46B的数据,因为倒数第二跳的原因就一层

标签。而AR46A到AR28的数据有两层标签。

总结MPLS网络中这些不通的现象有一个共同点:能ping通,部分业务不通。其

实这些业务的共同点就是业务中几乎都是大报文。

如果ping小包都不通,那么去查线路吧,问题就和本文无关了。

【问题分析】

第一步:定位办法ping报文。这种情况一般都是ping小包通,ping –s 1500

的大包不通。逐步改小ping包的大小,找到临界值。

第二步:如果找到临界值,那么百分百肯定是线路上某一个节点的MTU的问题,

那么下一步就是确认是哪一个点MTU有问题。

问题一的分析过程:

ping1468的报文可以ping通,1469的报文无法ping通。

那么在线路上实际传输报文的长度。

目的mac+源mac+TAG+类型++MPLS+IP头+ICMP头+报文

6 6 4 2 4 20 8 1468=

1518

目的mac+源mac+TAG+类型++MPLS+IP头+ICMP头+报文

6 6 4 2 4 20 8 1469=

1519

而S4500的最大接收报文长度就是1518,所以导致1519的报文无法

接收而丢弃。

但是设备间不是有MTU协商吗,为什么S4500还会收到超过接收能力

的报文呢?

那么就要看什么是MTU。MTU最大传输单元,这个最大传输单元实际上

和链路层协议有着密切的关系,让我们先仔细回忆一下EthernetII

帧的结构DMAC+SMAC+Type+Data+CRC

由于以太网传输电气方面的限制,每个以太网帧都有最小的大小

64bytes最大不能超过1518bytes,对于小于或者大于这个限制的以太

网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃

这些数据帧。(注:小于64Bytes的数据帧一般是由于以太网冲突产

生的“碎片”或者线路干扰或者坏的以太网接口产生的,对于大于

1518Bytes的数据帧我们一般把它叫做Giant帧,这种一般是由于线

路干扰或者坏的以太网口产生)

由于以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网

帧的帧头(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址

48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分4Bytes

(这个部门有时候大家也把它叫做FCS),那么剩下承载上层协议的

地方也就是Data域最大就只能有1500Bytes这个值我们就把它称之为

MTU。这个就是网络层协议非常关心的地方,因为网络层协议比如IP

协议会根据这个值来决定是否把上层传下来的数据进行分片。

那么说我S4500的1518的最大接收报文长度-(目的mac+源mac+

TAG+类型)=1500

那么对端发送大于1500的报文就要分片,为什么我还收到了1519大

小的报文?

那就是因为对端发送的时候有MPLS标签。MPLS是一个二层三层之间

的概念。路由器在发送报文的时候,原始报文1469+(IP头+ICMP

头)=1497,不到1500没有分片。这样在封装MPLS头和以太头后,

就超过了对端的接收范围。

[解决办法]

1.V3上可以在MPLS视图添加mtu label-including把标签长度统计

进来,目前V5尚没有这个命令,目前正在开发。

2.NE上有更改MPLS MTU的命令规避该问题,这个实现和Cisco是一

样的。

[NE40-3-GigabitEthernet3/0/0]mpls mtu ?

<328-8000> MTU value

3.当然也可以从S4500上下手,在S4500上开启jumboframe enable,

让S4500可以接收大报文,也能解决这个问题。

问题二的分析过程:

也是一样ping1468字节可以通,1469字节不能通。

因S85发送报文MTU计算的时候是不计算MPLS头的。

S85A发出的1468字节的ping报文封装(ip+icmp)后8+20+1468=1496

因小于MTU=1500,发送。发送报文的大小为1496+4+4+14(两个标签+

以太头)=1518;1469ping报文,最后发出包大小为1519。

AR46上2GE使用Intel GE8254x芯片,最大接收报文长度为1518。所

以1468的ping报文能够通过。并且在AR46和S85A链接的端口上有

大量超大帧错包。

GigabitEthernet1/0/0 current state :UP

Last 300 seconds input rate 0.00 bytes/sec, 0 bits/sec, 0.00

packets/sec

Last 300 seconds output rate 0.00 bytes/sec, 0 bits/sec, 0.00

packets/sec

Input: 167736958 packets, 724939975 bytes, 167737023 buffers

3 broadcasts, 1222013 multicasts, 0 pauses

298998 errors, 0 runts, 298978 giants

0 crc, 0 align errors, 0 overruns

0 dribbles, 0 drops, 0 no buffers

但是和S85B连接的ERPU使用BCM1250芯片,最大接收报文长度为1700,

这样S85发出的报文因MTU为1500,1500+4+4+14<1700 所以能通过。

[解决办法]

1.参照上面的解决办法,因为S85使用的V5平台的版本,不支持mtu

label-including,那么在发送上只能将S85出口的MTU改为1496,

让S85不发出大于1518的大包。

2.在接收上,考虑到不同接口的接收能力不同,可以将S85都连在主

控板的接口上,幸好AR46 ERPU上自带3个combo口。

问题三的分析过程:

如果SR6602A发大包目的是SR6608A的环回口,会走MPLS转发,下一

跳是VT接口。当大包时,IP按照MTU分片为1500并加4个字节MPLS

标签送MP转发。MP将1504的报文分两片处理。CISCO收到这个报文

后会丢弃。分析原因是我们与CISCO做LCP协商时会把本地的

MRU=1500发给CISCO,而CISCO收到报文时会与该MRU做比较,如果

大于该MRU,认为报文非法,而丢弃。

用PING报文也可以验证这个问题,如果PING包为1469,+20字节IP

头+8字节ICMP头=1497。这时候走MPLS转发时为1501。VT口为两个

通道,分为2片。可以看到CISCO收到了2个分片:

01:32:32: Se4/1/5:0 MLP: I frag 80000A1E size 759 encsize 4

01:32:32: Se4/1/5:0 MLP: I data FF03 003D 8000 0A1E 0281 0019 11FF

4500

01:32:32: Se4/1/6:0 MLP: I frag 40000A1F size 760 encsize 4

01:32:32: Se4/1/6:0 MLP: I data FF03 003D 4000 0A1F C5C6 C7C8 C9CA

CBCC

对分片进行重组后发现大于接口MRU=1500,CISCO将包丢弃:

00:50:11: Mu1 MLP: I pkt len 1503 > MRRU 1500 in 'r*-HG-', discarding

//CISCO错误的多统计了0281这两个标志字节

00:50:11: Mu1 MLP: Unable to add to reassembled pkt in 'r*-HG-'

00:50:11: Mu1 MLP: Discard reassembled packet

C7507-8(config-if)#

这个问题几个因素导致,一个是CISCO判断过严,我们的MP其实在

1600字节以下都是可以接收的。二是SR66目前没有MPLS MTU的概念,

IP分片后又格外增加了标签,导致超过接口的MTU。

另:与CISCO的MP只有一个通道时,可以正常转发。看来CISCO只是

在重组分片后才做该检查。

01:27:44: Se4/1/6:0 MLP: I frag C0000976 size 1511 encsize 4

01:27:44: Se4/1/6:0 MLP: I data FF03 003D C000 0976 0281 0019 11FF

4500

[解决办法]

1.

参照上面的解决办法,因为S66使用的V5平台的版本,不支持

mtu label-including。而且这个问题更改MTU也没有用,那么在

发送端没有任何办法。

2.

接收端Cisco是因为双方协商为1500,但是收到1504的IP报文

而任务是错误报文导致。可以配置Cisco允许接收大于协商的MTU

来解决。

C7507(config-if)#ppp multilink mrru local ?

<128-16384> Our MRRU value

C7507(config-if)#ppp multilink mrru local 1504

问题四的分析过程:

问题四的分析过程和前面的类似,只不过要考虑一下相邻PE间有PHP

问题,只有一层标签。读者可以自己分析一下。

归结上面的问题的原因就是链路上有的端口的最大接收报文长度为1518或1522。

这样一个1500的报文+14个以太头+一两层MPLS头或者QinQ头就很容易超过

接收能力。

目前常见的MIM 2GE和下面四款FIC接口卡,因为最大接收长度为1518(不含

CRC),都存在这个问题。

【解决办法总结】

1.

在接收端,增强接收能力,开启jumboframe的能力,cisco上增大

MRRU。或者更换接收能力强的端口。

2.

在发送端,如果在接收端上面的操作都无法实施的时候,那么考虑发

送端更改MTU的计算方法mtu label-including;或者把发送端端口

的MTU值改小;对于能设置MPLS MTU的设备,更小这个设置。

3.

最终用户端,当然有的时候发送端不是H3C设备,或不允许更改的时

候,只有最后一个最土的办法,更改CE下面用户PC机的MTU。 

8062支持MIM 2GE,导致某些特别应用受限,如GRE多层封装,MPLS多标签等

等,需要配置对端为小MTU才可以。

V5平台正在开发支持MPLS MTU功能。2007年9月10日提交的需求,单号:

2

2024年8月29日发(作者:满山槐)

MPLS MTU问题

MPLS MTU每次想写的时候都觉得很麻烦,因为问题的原因只有一个,但是现象

千差万别,各个产品实现还不一样,即使同一个产品不同板卡也有区别。

【问题描述】

问题一:

问题二:

现象:如下网络结构,四个设备PE设备间,互为IBGP邻居。相互间

使用loopback口建立BGP peer。S9505与SR6608A之间的BGP邻居不

断UP/Down

经排查,发现更改IGP路由优先级,使S9505与SR6608A间数据流优

选NE40就不会出现问题,如果数据流优选SR8805就会出问题。查看

线路发现S8805的线路上还经过了两个交换机。如下图:S9505和

SR8805之间有一台3com S4500G全千兆交换机。S8805和SR6608A之

间有一台S3126T交换机。并且中间的报文为二层互通,带VLAN tag。

现象:宁波江北政务网为MPLS L3 VPN环境,AR46作为纯P设备,下

挂两台S85作为PE。

拓扑如下,一台S85下用户业务正常,另一台则邮件附件不能上传,

部分业务不能使用。两台S85配置基本相同

AR46

| |

| |

| |

S85B--------S85A(业务不正常)

经排查,发现业务正常S85接AR46主控板以太口,业务不正常S85

接AR46 2GE单板中的一个千兆口。

AR46

ERPU口 2GE口

| |

| |

| |

S85B--------S85A

问题三:

现象:SR6602A和C7509两个PE设备间IBGP邻居不断UP/Down。

经排查,发现SR6602A和C7509发现设备之间使用的使PPP MP进行的

互连。

问题四:

现象:三个PE设备AR46,AR46B下私网用户访问和AR46A,AR28互访

正常。AR46A和AR28之间的用户可以ping通,但无法互访。

经排查,发现AR46A到AR46B的数据,因为倒数第二跳的原因就一层

标签。而AR46A到AR28的数据有两层标签。

总结MPLS网络中这些不通的现象有一个共同点:能ping通,部分业务不通。其

实这些业务的共同点就是业务中几乎都是大报文。

如果ping小包都不通,那么去查线路吧,问题就和本文无关了。

【问题分析】

第一步:定位办法ping报文。这种情况一般都是ping小包通,ping –s 1500

的大包不通。逐步改小ping包的大小,找到临界值。

第二步:如果找到临界值,那么百分百肯定是线路上某一个节点的MTU的问题,

那么下一步就是确认是哪一个点MTU有问题。

问题一的分析过程:

ping1468的报文可以ping通,1469的报文无法ping通。

那么在线路上实际传输报文的长度。

目的mac+源mac+TAG+类型++MPLS+IP头+ICMP头+报文

6 6 4 2 4 20 8 1468=

1518

目的mac+源mac+TAG+类型++MPLS+IP头+ICMP头+报文

6 6 4 2 4 20 8 1469=

1519

而S4500的最大接收报文长度就是1518,所以导致1519的报文无法

接收而丢弃。

但是设备间不是有MTU协商吗,为什么S4500还会收到超过接收能力

的报文呢?

那么就要看什么是MTU。MTU最大传输单元,这个最大传输单元实际上

和链路层协议有着密切的关系,让我们先仔细回忆一下EthernetII

帧的结构DMAC+SMAC+Type+Data+CRC

由于以太网传输电气方面的限制,每个以太网帧都有最小的大小

64bytes最大不能超过1518bytes,对于小于或者大于这个限制的以太

网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃

这些数据帧。(注:小于64Bytes的数据帧一般是由于以太网冲突产

生的“碎片”或者线路干扰或者坏的以太网接口产生的,对于大于

1518Bytes的数据帧我们一般把它叫做Giant帧,这种一般是由于线

路干扰或者坏的以太网口产生)

由于以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网

帧的帧头(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址

48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分4Bytes

(这个部门有时候大家也把它叫做FCS),那么剩下承载上层协议的

地方也就是Data域最大就只能有1500Bytes这个值我们就把它称之为

MTU。这个就是网络层协议非常关心的地方,因为网络层协议比如IP

协议会根据这个值来决定是否把上层传下来的数据进行分片。

那么说我S4500的1518的最大接收报文长度-(目的mac+源mac+

TAG+类型)=1500

那么对端发送大于1500的报文就要分片,为什么我还收到了1519大

小的报文?

那就是因为对端发送的时候有MPLS标签。MPLS是一个二层三层之间

的概念。路由器在发送报文的时候,原始报文1469+(IP头+ICMP

头)=1497,不到1500没有分片。这样在封装MPLS头和以太头后,

就超过了对端的接收范围。

[解决办法]

1.V3上可以在MPLS视图添加mtu label-including把标签长度统计

进来,目前V5尚没有这个命令,目前正在开发。

2.NE上有更改MPLS MTU的命令规避该问题,这个实现和Cisco是一

样的。

[NE40-3-GigabitEthernet3/0/0]mpls mtu ?

<328-8000> MTU value

3.当然也可以从S4500上下手,在S4500上开启jumboframe enable,

让S4500可以接收大报文,也能解决这个问题。

问题二的分析过程:

也是一样ping1468字节可以通,1469字节不能通。

因S85发送报文MTU计算的时候是不计算MPLS头的。

S85A发出的1468字节的ping报文封装(ip+icmp)后8+20+1468=1496

因小于MTU=1500,发送。发送报文的大小为1496+4+4+14(两个标签+

以太头)=1518;1469ping报文,最后发出包大小为1519。

AR46上2GE使用Intel GE8254x芯片,最大接收报文长度为1518。所

以1468的ping报文能够通过。并且在AR46和S85A链接的端口上有

大量超大帧错包。

GigabitEthernet1/0/0 current state :UP

Last 300 seconds input rate 0.00 bytes/sec, 0 bits/sec, 0.00

packets/sec

Last 300 seconds output rate 0.00 bytes/sec, 0 bits/sec, 0.00

packets/sec

Input: 167736958 packets, 724939975 bytes, 167737023 buffers

3 broadcasts, 1222013 multicasts, 0 pauses

298998 errors, 0 runts, 298978 giants

0 crc, 0 align errors, 0 overruns

0 dribbles, 0 drops, 0 no buffers

但是和S85B连接的ERPU使用BCM1250芯片,最大接收报文长度为1700,

这样S85发出的报文因MTU为1500,1500+4+4+14<1700 所以能通过。

[解决办法]

1.参照上面的解决办法,因为S85使用的V5平台的版本,不支持mtu

label-including,那么在发送上只能将S85出口的MTU改为1496,

让S85不发出大于1518的大包。

2.在接收上,考虑到不同接口的接收能力不同,可以将S85都连在主

控板的接口上,幸好AR46 ERPU上自带3个combo口。

问题三的分析过程:

如果SR6602A发大包目的是SR6608A的环回口,会走MPLS转发,下一

跳是VT接口。当大包时,IP按照MTU分片为1500并加4个字节MPLS

标签送MP转发。MP将1504的报文分两片处理。CISCO收到这个报文

后会丢弃。分析原因是我们与CISCO做LCP协商时会把本地的

MRU=1500发给CISCO,而CISCO收到报文时会与该MRU做比较,如果

大于该MRU,认为报文非法,而丢弃。

用PING报文也可以验证这个问题,如果PING包为1469,+20字节IP

头+8字节ICMP头=1497。这时候走MPLS转发时为1501。VT口为两个

通道,分为2片。可以看到CISCO收到了2个分片:

01:32:32: Se4/1/5:0 MLP: I frag 80000A1E size 759 encsize 4

01:32:32: Se4/1/5:0 MLP: I data FF03 003D 8000 0A1E 0281 0019 11FF

4500

01:32:32: Se4/1/6:0 MLP: I frag 40000A1F size 760 encsize 4

01:32:32: Se4/1/6:0 MLP: I data FF03 003D 4000 0A1F C5C6 C7C8 C9CA

CBCC

对分片进行重组后发现大于接口MRU=1500,CISCO将包丢弃:

00:50:11: Mu1 MLP: I pkt len 1503 > MRRU 1500 in 'r*-HG-', discarding

//CISCO错误的多统计了0281这两个标志字节

00:50:11: Mu1 MLP: Unable to add to reassembled pkt in 'r*-HG-'

00:50:11: Mu1 MLP: Discard reassembled packet

C7507-8(config-if)#

这个问题几个因素导致,一个是CISCO判断过严,我们的MP其实在

1600字节以下都是可以接收的。二是SR66目前没有MPLS MTU的概念,

IP分片后又格外增加了标签,导致超过接口的MTU。

另:与CISCO的MP只有一个通道时,可以正常转发。看来CISCO只是

在重组分片后才做该检查。

01:27:44: Se4/1/6:0 MLP: I frag C0000976 size 1511 encsize 4

01:27:44: Se4/1/6:0 MLP: I data FF03 003D C000 0976 0281 0019 11FF

4500

[解决办法]

1.

参照上面的解决办法,因为S66使用的V5平台的版本,不支持

mtu label-including。而且这个问题更改MTU也没有用,那么在

发送端没有任何办法。

2.

接收端Cisco是因为双方协商为1500,但是收到1504的IP报文

而任务是错误报文导致。可以配置Cisco允许接收大于协商的MTU

来解决。

C7507(config-if)#ppp multilink mrru local ?

<128-16384> Our MRRU value

C7507(config-if)#ppp multilink mrru local 1504

问题四的分析过程:

问题四的分析过程和前面的类似,只不过要考虑一下相邻PE间有PHP

问题,只有一层标签。读者可以自己分析一下。

归结上面的问题的原因就是链路上有的端口的最大接收报文长度为1518或1522。

这样一个1500的报文+14个以太头+一两层MPLS头或者QinQ头就很容易超过

接收能力。

目前常见的MIM 2GE和下面四款FIC接口卡,因为最大接收长度为1518(不含

CRC),都存在这个问题。

【解决办法总结】

1.

在接收端,增强接收能力,开启jumboframe的能力,cisco上增大

MRRU。或者更换接收能力强的端口。

2.

在发送端,如果在接收端上面的操作都无法实施的时候,那么考虑发

送端更改MTU的计算方法mtu label-including;或者把发送端端口

的MTU值改小;对于能设置MPLS MTU的设备,更小这个设置。

3.

最终用户端,当然有的时候发送端不是H3C设备,或不允许更改的时

候,只有最后一个最土的办法,更改CE下面用户PC机的MTU。 

8062支持MIM 2GE,导致某些特别应用受限,如GRE多层封装,MPLS多标签等

等,需要配置对端为小MTU才可以。

V5平台正在开发支持MPLS MTU功能。2007年9月10日提交的需求,单号:

2

发布评论

评论列表 (0)

  1. 暂无评论