实验环境:
操作系统:Windows 10(1607,14393.351,当时最新测试版),模拟器:GNS3 IOU for Windows 1.5.2(当时最新正式版)
注:当然,只要有思科模拟器都可以做这个实验

实验需求:
- IOU1、IOU2和IOU3是一个互联网服务提供商(ISP),IOU4、IOU5和IOU6是另一个互联网服务提供商(ISP);
- IOU7和IOU8分别通过802.1Q封装连接各自的互联网服务提供商(ISP),IOU7和IOU8之间要实现MPLS L2VPN通信;
- IOU9通过PPP封装连接自己的互联网服务提供商(ISP),IOU10通过Ethernet封装连接自己的互联网服务提供商(ISP),IOU9和IOU10之间要实现MPLS L2VPN通信;
- IOU3和IOU4之间(两个互联网服务提供商的边界)通过option B/option 2(End to End)的方式进行MPLS L2VPN的互连;
- IOU3和IOU4上的BGP路由不允许泄露到IGP。
实验步骤:
1、先配置两个互联网服务提供商(ISP)上的IP地址、IGP(OSPF)和MPLS:
IOU1:
conf t int e 0/2 router ospf 123 int r e 0/2 , l 0 ip cef int e 0/2 |
IOU2:
conf t int e 0/2 int e 0/3 router ospf 123 int r e 0/2-3 , l 0 ip cef int r e 0/2-3 |
IOU3:
conf t int e 0/3 router ospf 123 int r e 0/3 , l 0 ip cef int e 0/3 |
IOU4:
conf t int e 0/2 router ospf 456 int r e 0/2 , l 0 ip cef int e 0/2 |
IOU5:
conf t int e 0/2 int e 0/3 router ospf 456 int r e 0/2-3 , l 0 ip cef int r e 0/2-3 |
IOU6:
conf t int e 0/3 router ospf 456 int r e 0/3 , l 0 ip cef int e 0/3 |
2、再配置IOU7、IOU8、IOU9和IOU10上的IP地址:
IOU7:
conf t |
IOU8:
conf t |
IOU9:
conf t |
IOU10:
conf t |
3、配置IOU3和IOU4之间的EBGP,再配置IOU1和IOU6上的IBGP,让IOU1和IOU6之间实现通信:
IOU3:
int e 0/0 router bgp 123 nei 1.1.1.1 remot 123 |
IOU4:
int e 0/0 router bgp 456 nei 6.6.6.6 remot 456 |
IOU1:
router bgp 123 |
IOU6:
router bgp 456 |
IOU1#p 6.6.6.6 so l 0 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 6.6.6.6, timeout is 2 seconds: Packet sent with a source address of 1.1.1.1 !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/2 ms
4、在IOU1上配置IOU7和IOU9的MPLS L2VPN连接:
IOU1: int e 0/0 no sh int e 0/0.7 en do 7 xconnect 6.6.6.6 78 en mpls pseudowire-class T910 encapsulation mpls interworking ip int s 2/0 en ppp xconnect 6.6.6.6 910 pw-class T910 no sh
5、在IOU6上配置IOU8和IOU10的MPLS L2VPN连接:
IOU6: int e 0/0 no sh int e 0/0.8 en do 8 xconnect 1.1.1.1 78 en mpls pseudowire-class T910 encapsulation mpls interworking ip int e 0/1 no sh xconnect 1.1.1.1 910 pw-class T910
这个时候你会发现,IOU1和IOU6上都收到了对方为伪线分配的MPLS标签(如下图所示):
IOU1#sh mpls l2transport binding Destination Address: 6.6.6.6,VC ID: 78 Local Label: 1003 Cbit: 1, VC Type: Ethernet, GroupID: 0 MTU: 1500, Interface Desc: n/a VCCV: CC Type: CW [1], RA [2] CV Type: LSPV [2] // 注意,IOU6为VC ID等于78的伪线分配的MPLS标签确实 Remote Label: 6003 // 是6003,后面要用到这个数字。 Cbit: 1, VC Type: Ethernet, GroupID: 0 MTU: 1500, Interface Desc: n/a VCCV: CC Type: CW [1], RA [2] CV Type: LSPV [2] Destination Address: 6.6.6.6,VC ID: 910 Local Label: 1004 Cbit: 1, VC Type: IP, GroupID: 0 MTU: 1500, Interface Desc: n/a VCCV: CC Type: CW [1], RA [2] CV Type: LSPV [2] Remote Label: 6004 Cbit: 1, VC Type: IP, GroupID: 0 MTU: 1500, Interface Desc: n/a VCCV: CC Type: CW [1], RA [2] CV Type: LSPV [2] IOU6#sh mpls l2transport binding Destination Address: 1.1.1.1,VC ID: 78 Local Label: 6003 Cbit: 1, VC Type: Ethernet, GroupID: 0 MTU: 1500, Interface Desc: n/a VCCV: CC Type: CW [1], RA [2] CV Type: LSPV [2] Remote Label: 1003 Cbit: 1, VC Type: Ethernet, GroupID: 0 MTU: 1500, Interface Desc: n/a VCCV: CC Type: CW [1], RA [2] CV Type: LSPV [2] Destination Address: 1.1.1.1,VC ID: 910 Local Label: 6004 Cbit: 1, VC Type: IP, GroupID: 0 MTU: 1500, Interface Desc: n/a VCCV: CC Type: CW [1], RA [2] CV Type: LSPV [2] Remote Label: 1004 Cbit: 1, VC Type: IP, GroupID: 0 MTU: 1500, Interface Desc: n/a VCCV: CC Type: CW [1], RA [2] CV Type: LSPV [2]
注意:如果你在IOU1上sh mpls l2transport binding,你发现Remote Label显示的是unassigned,那么你就先到IOU6上sh mpls l2transport binding,然后再回IOU1看,Remote Label就有MPLS标签了。这估计是IOU的一个bug,详情请看:《【实验】域间MPLS L2VPN实验 —— Inter-AS option A/option 1(Back to Back)》,该篇文章关于这个bug有详细的阐述,这里不再赘述。
但是LFIB中却显示出接口是drop(如下图所示):
IOU1#sh mpls forwarding-table Local Outgoing Prefix Bytes Label Outgoing Next Hop Label Label or Tunnel Id Switched interface 1000 Pop Label 2.2.2.2/32 0 Et0/2 12.1.1.2 1001 Pop Label 23.1.1.0/24 0 Et0/2 12.1.1.2 1002 2001 3.3.3.3/32 0 Et0/2 12.1.1.2 1003 No Label l2ckt() 0 drop 1004 No Label l2ckt() 0 drop IOU6#sh mpls forwarding-table Local Outgoing Prefix Bytes Label Outgoing Next Hop Label Label or Tunnel Id Switched interface 6000 Pop Label 5.5.5.5/32 0 Et0/3 56.1.1.5 6001 5000 4.4.4.4/32 0 Et0/3 56.1.1.5 6002 Pop Label 45.1.1.0/24 0 Et0/3 56.1.1.5 6003 No Label l2ckt() 0 drop 6004 No Label l2ckt() 0 drop
为什么出接口是drop?我们在IOU1上traceroute IOU6看一下:
IOU1#traceroute 6.6.6.6 so l 0 Type escape sequence to abort. Tracing the route to 6.6.6.6 VRF info: (vrf in name/id, vrf out name/id) 1 12.1.1.2 [MPLS: Label 2001 Exp 0] 1 msec 0 msec 1 msec 2 23.1.1.3 0 msec 1 msec 1 msec 3 34.1.1.4 [MPLS: Label 4003 Exp 0] 2 msec 2 msec 1 msec 4 * * * 5 56.1.1.6 2 msec 2 msec 1 msec
会看到第二跳(也就是数据包在23.1.1.3这一跳的时候)是没有MPLS标签的。
现在假设IOU1的LFIB里是有MPLS L2VPN的出标签的,然后在IOU7上ping IOU8,当数据包从IOU1转发给IOU2的时候,数据包将会打两层MPLS标签。内层打的是IOU6发给IOU1的MPLS L2VPN标签,外层打的是去往3.3.3.3的MPLS标签。如下图所示:
┏━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓ ┃ ICMP ┃ D : 78.1.1.8 ┃ S : 78.1.1.7 ┃ Label : 6003 ┃ Label : 2001 ┃ ┗━━━━━━┻━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━┛ (注:上面的图是拿字符画的,手机上一自动换行就乱了,如果出现了变形,请在电脑上观看,下同)
当数据包到了IOU2上的时候,IOU2会查LFIB:
IOU2#sh mpls forwarding-table Local Outgoing Prefix Bytes Label Outgoing Next Hop Label Label or Tunnel Id Switched interface 2000 Pop Label 1.1.1.1/32 29226 Et0/2 12.1.1.1 2001 Pop Label 3.3.3.3/32 29087 Et0/3 23.1.1.3
然后根据LFIB的指示,IOU2会Pop掉一层MPLS标签,然后再将数据包转发给IOU3:
┏━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓ ┃ ICMP ┃ D : 78.1.1.8 ┃ S : 78.1.1.7 ┃ Label : 6003 ┃ ┗━━━━━━┻━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━┛
IOU3收到这个带有MPLS标签的数据包后,同样也会先查LFIB:
IOU3#sh mpls forwarding-table
Local Outgoing Prefix Bytes Label Outgoing Next Hop
Label Label or Tunnel Id Switched interface
3000 Pop Label 2.2.2.2/32 0 Et0/3 23.1.1.2
3001 2000 1.1.1.1/32 26344 Et0/3 23.1.1.2
3002 Pop Label 12.1.1.0/24 0 Et0/3 23.1.1.2
3003 Pop Label 34.1.1.4/32 0 Et0/0 34.1.1.4
但是,IOU3在它的LFIB里找不到任何关于编号为6003的MPLS标签的信息。
其实IOU3找不到也不难理解:
- 因为6.6.6.6/32的路由在IOU3上是以BGP IPv4路由的形式存在的,MPLS默认只给BGP路由的下一跳IP地址分配MPLS标签,不会为每条BGP路由分配MPLS标签。而《【实验】域间MPLS L2VPN实验 —— Inter-AS option B/option 2(End to End)BGP路由重分布到IGP》中是把BGP路由重分布到了IGP中,IGP上自然是每条IGP路由分配一个MPLS标签,所以不存在这个问题。
- 同时,IOU1和IOU6之间跨了很多台路由器(包括IOU3)去建立LDP邻居关系,然后IOU1和IOU6为伪线分配的MPLS标签也只发给对方, 不发给其他路由器,IOU3自然也收不到这些MPLS L2VPN标签。
所以,这个时候伪线是不可能通的,而IOU1和IOU6的LFIB中显示出接口是drop也是这个原因。那如何让伪线连通起来呢?
根据MPLS一直以来的特性,如果一层MPLS标签解决不了的事情,那就用两层MPLS标签;如果两层MPLS标签还解决不了,那就再加一层MPLS标签。
我们先在IOU1上看一下,IOU1去往6.6.6.6只打了一层MPLS标签:
IOU1#sh ip cef 6.6.6.6 6.6.6.6/32 nexthop 12.1.1.2 Ethernet0/2 label 2001
6、现在我们在IOU1/3/4/6的BGP上配置,让BGP为BGP IPv4路由分配一层MPLS标签:
IOU1:
router bgp 123 |
IOU3:
router bgp 123 |
IOU4:
router bgp 456 |
IOU6:
router bgp 456 |
现在再在IOU1上看一下,IOU1去往6.6.6.6又打了一层MPLS标签:
IOU1#sh ip cef 6.6.6.6 6.6.6.6/32 nexthop 12.1.1.2 Ethernet0/2 label 2001 3004
2001显然是IOU2分配的,3004显然是IOU3分配的,如果再加上IOU6为IOU1分配的MPLS L2VPN标签,那么在伪线中传递的数据包将会出现三层MPLS标签的情况。
现在我们在IOU1上traceroute一下IOU6:
IOU1#traceroute 6.6.6.6 so l 0
Type escape sequence to abort.
Tracing the route to 6.6.6.6
VRF info: (vrf in name/id, vrf out name/id)
1 12.1.1.2 [MPLS: Labels 2001/3004 Exp 0] 2 msec 1 msec 2 msec
2 23.1.1.3 [MPLS: Label 3004 Exp 0] 1 msec 2 msec 1 msec
3 34.1.1.4 [MPLS: Label 4003 Exp 0] 2 msec 2 msec 1 msec
4 * * *
5 56.1.1.6 1 msec 1 msec 2 msec
没错,在IOU1上去往6.6.6.6的数据包打上了两层MPLS标签。如果是伪线里的数据包,还会多一层MPLS L2VPN标签(关于数据包报头结构的分析,请看下面的 “ 数据包的报头结构追踪 ” 部分)。
测试:

在IOU1和IOU6上sh mpls forwarding-table可以看到,MPLS L2VPN的MPLS标签都已经分配好了,出接口也有了:
IOU1#sh mpls forwarding-table Local Outgoing Prefix Bytes Label Outgoing Next Hop Label Label or Tunnel Id Switched interface 1000 Pop Label 2.2.2.2/32 0 Et0/2 12.1.1.2 1001 Pop Label 23.1.1.0/24 0 Et0/2 12.1.1.2 1002 2001 3.3.3.3/32 0 Et0/2 12.1.1.2 1003 No Label l2ckt(78) 0 Et0/0.7 point2point 1004 No Label l2ckt(910) 0 Se2/0 point2point IOU6#sh mpls forwarding-table Local Outgoing Prefix Bytes Label Outgoing Next Hop Label Label or Tunnel Id Switched interface 6000 Pop Label 5.5.5.5/32 0 Et0/3 56.1.1.5 6001 5000 4.4.4.4/32 0 Et0/3 56.1.1.5 6002 Pop Label 45.1.1.0/24 0 Et0/3 56.1.1.5 6003 No Label l2ckt(78) 0 Et0/0.8 point2point 6004 No Label l2ckt(910) 0 Et0/1 point2point
现在我们用IOU7去ping IOU8,然后traceroute一下:
IOU7#p 78.1.1.8
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 78.1.1.8, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 2/2/3 ms
IOU7#traceroute 78.1.1.8
Type escape sequence to abort.
Tracing the route to 78.1.1.8
VRF info: (vrf in name/id, vrf out name/id)
1 78.1.1.8 3 msec 2 msec 2 msec
通了!通过traceroute可以看到IOU7显示它跟IOU8是直连的。
接着我们用IOU9去ping IOU10,然后traceroute一下:
IOU9#p 10.9.1.10 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 10.9.1.10, timeout is 2 seconds: ..... Success rate is 0 percent (0/5)
不通……
但是没关系,我们去IOU10上ping IOU9,然后traceroute一下:
IOU10#p 10.9.1.9
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.9.1.9, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 8/10/12 ms
IOU10#traceroute 10.9.1.9
Type escape sequence to abort.
Tracing the route to 10.9.1.9
VRF info: (vrf in name/id, vrf out name/id)
1 10.9.1.9 13 msec 9 msec 11 msec
通了!通过traceroute可以看到IOU10显示它跟IOU9是直连的。
再去IOU9上ping IOU10,然后traceroute一下:
IOU9#p 10.9.1.10
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.9.1.10, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 11/11/13 ms
IOU9#traceroute 10.9.1.10
Type escape sequence to abort.
Tracing the route to 10.9.1.10
VRF info: (vrf in name/id, vrf out name/id)
1 10.9.1.10 12 msec 11 msec 11 msec
也通了!通过traceroute可以看到IOU9显示它跟IOU10也是直连的。
不知道为什么IOU9先ping IOU10是通不了的,不知道是不是IOU的bug,如果有知道的朋友可以在下方留言,大家互相交流一下。
数据包的报头结构追踪:

我们先追踪IOU7和IOU8之间的数据包,Ricky会在IOU1的e 0/0口、IOU1的e 0/2口、IOU4的e 0/0口、IOU6的e 0/3口和IOU6的e 0/0口用Wireshark抓取数据包,然后在IOU7上ping 78.1.1.8。
1、在IOU7上ping 78.1.1.8时,IOU1的e 0/0口上的抓包:

如上图所示,这是IOU7给IOU1发送的数据包的报头结构。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | 802.1Q | Ethernet |
2、在IOU7上ping 78.1.1.8时,IOU1的e 0/2口上的抓包:

如上图所示,这是IOU1给IOU2发送的数据包的报头结构。IOU1会抹去802.1Q数据帧(VLAN ID = 7),同时打上三层MPLS标签和一个伪线控制字段,再打上最外层的Ethernet二层头部(因为IOU1/2/3/4/5/6之间的链路都是Ethernet,所以在这之间传递的数据包总会有一个最外层的Ethernet二层头部,关于最外层的这一层Ethernet二层头部下面不再赘述),然后将数据包发送给IOU2。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | Ethernet | 伪线控制字段 | Label | Label | Label | Ethernet |
IOU2收到这个数据包后,会Pop Label(弹出一层MPLS标签),然后将数据包转发给IOU3。如果在IOU2和IOU3之间的链路上抓取数据包,数据包的报头结构应该是这样的:
| FCS | ICMP | IP | Ethernet | 伪线控制字段 | Label | Label | Ethernet |
在IOU2上sh mpls forwarding-table,会发现IOU2将会为这个ping包执行Pop Label(弹出一层MPLS标签):
IOU2#sh mpls forwarding-table Local Outgoing Prefix Bytes Label Outgoing Next Hop Label Label or Tunnel Id Switched interface 2000 Pop Label 1.1.1.1/32 87479 Et0/2 12.1.1.1 2001 Pop Label 3.3.3.3/32 87805 Et0/3 23.1.1.3
3、在IOU7上ping 78.1.1.8时,IOU4的e 0/0口上的抓包:

如上图所示,这是IOU3给IOU4发送的数据包的报头结构。因为在IOU3上敲了一句命令:nei 34.1.1.4 send-label,所以IOU3会为BGP路由(包括6.6.6.6/32)分配MPLS标签。显然,这个ping包就是要通过MPLS标签穿越到IOU6(即6.6.6.6)上的,所以数据包到了IOU3上的时候IOU3还有MPLS标签,不会像Back to Back那样No Label。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | Ethernet | 伪线控制字段 | Label | Label | Ethernet |
在IOU3上sh mpls forwarding-table,会发现IOU3将会为这个ping包打上编号为4003的MPLS标签:
IOU3#sh mpls forwarding-table Local Outgoing Prefix Bytes Label Outgoing Next Hop Label Label or Tunnel Id Switched interface 3000 Pop Label 2.2.2.2/32 0 Et0/3 23.1.1.2 3001 2000 1.1.1.1/32 81490 Et0/3 23.1.1.2 3002 Pop Label 12.1.1.0/24 0 Et0/3 23.1.1.2 3003 Pop Label 34.1.1.4/32 0 Et0/0 34.1.1.4 3004 4003 6.6.6.6/32 34538 Et0/0 34.1.1.4
IOU4收到这个数据包后,会查LFIB,然后根据LFIB的指示将数据包转发给IOU5。如果在IOU4和IOU5之间的链路上抓取数据包,数据包的报头结构应该是这样的:
| FCS | ICMP | IP | Ethernet | 伪线控制字段 | Label | Label | Ethernet |
在IOU4上sh mpls forwarding-table,会发现IOU4将会为这个ping包打上编号为5001的MPLS标签:
IOU4#sh mpls forwarding-table Local Outgoing Prefix Bytes Label Outgoing Next Hop Label Label or Tunnel Id Switched interface 4000 Pop Label 5.5.5.5/32 0 Et0/2 45.1.1.5 4001 Pop Label 56.1.1.0/24 0 Et0/2 45.1.1.5 4002 Pop Label 34.1.1.3/32 0 Et0/0 34.1.1.3 4003 5001 6.6.6.6/32 82740 Et0/2 45.1.1.5 4004 3001 1.1.1.1/32 35596 Et0/0 34.1.1.3
4、在IOU7上ping 78.1.1.8时,IOU6的e 0/3口上的抓包:

如上图所示,IOU5收到这个数据包后,会Pop Label(弹出一层MPLS标签),然后将数据包转发给IOU6。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | Ethernet | 伪线控制字段 | Label | Ethernet |
在IOU5上sh mpls forwarding-table,会发现IOU5将会为这个ping包执行Pop Label(弹出一层MPLS标签):
IOU5#sh mpls forwarding-table Local Outgoing Prefix Bytes Label Outgoing Next Hop Label Label or Tunnel Id Switched interface 5000 Pop Label 4.4.4.4/32 159831 Et0/2 45.1.1.4 5001 Pop Label 6.6.6.6/32 156323 Et0/3 56.1.1.6
5、在IOU7上ping 78.1.1.8时,IOU6的e 0/0口上的抓包:

如上图所示,这是IOU6给IOU8发送的数据包的报头结构。因为IOU8是IOU6的客户路由器,所以IOU6收到这个数据包后,会剥离最外层的Ethernet二层头部,No Label(弹出所有MPLS标签),删除伪线控制字段,然后重新打上802.1Q数据帧(VLAN ID = 8),再转发给IOU8。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | 802.1Q | Ethernet |
这样,数据包就转发到目的地了。

接下来,我们追踪IOU9和IOU10之间的数据包,Ricky会在IOU1的s 2/0口、IOU1的e 0/2口、IOU4的e 0/0口、IOU6的e 0/3口和IOU6的e 0/1口用Wireshark抓取数据包,然后在IOU9上ping 10.9.1.10。
1、在IOU9上ping 10.9.1.10时,IOU1的s 2/0口上的抓包:

如上图所示,这是IOU9给IOU1发送的数据包的报头结构。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | PPP |
2、在IOU9上ping 10.9.1.10时,IOU1的e 0/2口上的抓包:

如上图所示,这是IOU1给IOU2发送的数据包的报头结构。IOU1会抹去PPP二层头部(因为在IOU1上,910这条伪线配置了参数:interworking ip,interworking ip的意思是除了IP三层头部以外,其他二层头部都要被抹去),同时打上三层MPLS标签和一个伪线控制字段,再打上最外层的Ethernet二层头部,然后将数据包发送给IOU2。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | 伪线控制字段 | Label | Label | Label | Ethernet |
这里需要注意的是,Wireshark把这个数据包识别错了,最内层不是Ethernet和Data,而是IP和ICMP。至于怎么判断Wireshark的识别是否出错,请看:《【实验】域间MPLS L2VPN实验 —— Inter-AS option A/option 1(Back to Back)》,该篇文章会有详细的解答,这里不再赘述。
IOU2收到这个数据包后,会Pop Label(弹出一层MPLS标签),然后将数据包转发给IOU3。如果在IOU2和IOU3之间的链路上抓取数据包,数据包的报头结构应该是这样的:
| FCS | ICMP | IP | 伪线控制字段 | Label | Label | Ethernet |
在IOU2上sh mpls forwarding-table,会发现IOU2将会为这个ping包执行Pop Label(弹出一层MPLS标签):
IOU2#sh mpls forwarding-table Local Outgoing Prefix Bytes Label Outgoing Next Hop Label Label or Tunnel Id Switched interface 2000 Pop Label 1.1.1.1/32 87479 Et0/2 12.1.1.1 2001 Pop Label 3.3.3.3/32 87805 Et0/3 23.1.1.3
3、在IOU9上ping 10.9.1.10时,IOU4的e 0/0口上的抓包:

如上图所示,这是IOU3给IOU4发送的数据包的报头结构。因为在IOU3上敲了一句命令:nei 34.1.1.4 send-label,所以IOU3会为BGP路由(包括6.6.6.6/32)分配MPLS标签。显然,这个ping包就是要通过MPLS标签穿越到IOU6(即6.6.6.6)上的,所以数据包到了IOU3上的时候IOU3还有MPLS标签,不会像Back to Back那样No Label。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | 伪线控制字段 | Label | Label | Ethernet |
在IOU3上sh mpls forwarding-table,会发现IOU3将会为这个ping包打上编号为4003的MPLS标签:
IOU3#sh mpls forwarding-table Local Outgoing Prefix Bytes Label Outgoing Next Hop Label Label or Tunnel Id Switched interface 3000 Pop Label 2.2.2.2/32 0 Et0/3 23.1.1.2 3001 2000 1.1.1.1/32 81490 Et0/3 23.1.1.2 3002 Pop Label 12.1.1.0/24 0 Et0/3 23.1.1.2 3003 Pop Label 34.1.1.4/32 0 Et0/0 34.1.1.4 3004 4003 6.6.6.6/32 34538 Et0/0 34.1.1.4
IOU4收到这个数据包后,会查LFIB,然后根据LFIB的指示将数据包转发给IOU5。如果在IOU4和IOU5之间的链路上抓取数据包,数据包的报头结构应该是这样的:
| FCS | ICMP | IP | 伪线控制字段 | Label | Label | Ethernet |
在IOU4上sh mpls forwarding-table,会发现IOU4将会为这个ping包打上编号为5001的MPLS标签:
IOU4#sh mpls forwarding-table Local Outgoing Prefix Bytes Label Outgoing Next Hop Label Label or Tunnel Id Switched interface 4000 Pop Label 5.5.5.5/32 0 Et0/2 45.1.1.5 4001 Pop Label 56.1.1.0/24 0 Et0/2 45.1.1.5 4002 Pop Label 34.1.1.3/32 0 Et0/0 34.1.1.3 4003 5001 6.6.6.6/32 82740 Et0/2 45.1.1.5 4004 3001 1.1.1.1/32 35596 Et0/0 34.1.1.3
4、在IOU9上ping 10.9.1.10时,IOU6的e 0/3口上的抓包:

如上图所示,IOU5收到这个数据包后,会Pop Label(弹出一层MPLS标签),然后将数据包转发给IOU6。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | 伪线控制字段 | Label | Ethernet |
在IOU5上sh mpls forwarding-table,会发现IOU5将会为这个ping包执行Pop Label(弹出一层MPLS标签):
IOU5#sh mpls forwarding-table Local Outgoing Prefix Bytes Label Outgoing Next Hop Label Label or Tunnel Id Switched interface 5000 Pop Label 4.4.4.4/32 159831 Et0/2 45.1.1.4 5001 Pop Label 6.6.6.6/32 156323 Et0/3 56.1.1.6
5、在IOU9上ping 10.9.1.10时,IOU6的e 0/1口上的抓包:

如上图所示,这是IOU6给IOU10发送的数据包的报头结构。因为IOU10是IOU6的客户路由器,所以IOU6收到这个数据包后,会剥离最外层的Ethernet二层头部,No Label(弹出所有MPLS标签),删除伪线控制字段,然后重新打上Ethernet二层头部(这里之所以打上了Ethernet二层头部,是因为在IOU6和IOU10之间的网络类型就是Ethernet),再转发给IOU10。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | Ethernet |
这样,数据包就转发到目的地了。
本文完。如有疑问,欢迎在下方留言;如本文有什么错误,欢迎在下方留言指正,谢谢。
其他相关文章:
- 【实验】域间MPLS L2VPN实验 —— Inter-AS option A/option 1(Back to Back)
- 【实验】域间MPLS L2VPN实验 —— Inter-AS option B/option 2(End to End)BGP路由重分布到IGP
- 【实验】域间MPLS L2VPN实验 —— Inter-AS option B/option 2(End to End)PE上均开启BGP
- 【实验】域间MPLS L2VPN实验 —— Inter-AS option 3(PseudoWire Stitching at ASBRs,伪线缝补)
- 关于域间MPLS L2VPN实验(共四个实验)的数据包报头结构小结
发表评论?