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

实验需求:
- IOU1、IOU2和R3是一个互联网服务提供商(ISP),R4、IOU5和IOU6是另一个互联网服务提供商(ISP);
- IOU7和IOU8分别通过802.1Q封装连接各自的互联网服务提供商(ISP),IOU7和IOU8之间要实现MPLS L2VPN通信;
- IOU9通过PPP封装连接自己的互联网服务提供商(ISP),IOU10通过Ethernet封装连接自己的互联网服务提供商(ISP),IOU9和IOU10之间要实现MPLS L2VPN通信;
- R3和R4之间(两个互联网服务提供商的边界)通过option 3(PseudoWire Stitching at ASBRs,伪线缝补)的方式进行MPLS L2VPN的互连;
- 注意!IOU没法做伪线缝补,所以R3和R4 Ricky选择的是GNS3下的Router,版本号为15.2(4)M2的7200系列思科路由器:
R3#sh version Cisco IOS Software, 7200 Software (C7200-ADVENTERPRISEK9-M), Version 15.2(4) M2, RELEASE SOFTWARE (fc2) ......
实验步骤:
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 |
R3:
conf t int e 5/0 router ospf 123 int r e 5/0 , l 0 ip cef int e 5/0 |
R4:
conf t int e 5/0 router ospf 456 int r e 5/0 , l 0 ip cef int e 5/0 |
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、配置R3和R4之间的EBGP:
R3:
int f 0/0 router bgp 123 |
R4:
int f 0/0 router bgp 456 |
4、在IOU1上配置IOU7和IOU9的MPLS L2VPN连接:
IOU1:
int e 0/0
no sh
int e 0/0.7
en do 7
xconnect 3.3.3.3 78 en mpls
pseudowire-class T910
encapsulation mpls
interworking ip
int s 2/0
en ppp
xconnect 3.3.3.3 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 4.4.4.4 78 en mpls
pseudowire-class T910
encapsulation mpls
interworking ip
int e 0/1
no sh
xconnect 4.4.4.4 910 pw-class T910
6、在R3和R4上配置PseudoWire Stitching at ASBRs(伪线缝补):
伪线缝补的意思其实很好理解:因为R3和R4是两个互联网服务提供商(ISP)的边界,所以到了R3和R4这里MPLS标签就断开了,伪线自然也就断开了,然后现在有一种技术可以把伪线缝补起来,这种技术就叫做伪线缝补。
R3:
l2 vfi 78 point-to-point pseudowire-class T910 l2 vfi 910 point-to-point |
R4:
l2 vfi 78 point-to-point pseudowire-class T910 l2 vfi 910 point-to-point |
注意:R3和R4的伪线类不能设置成为:
pseudowire-class T910
encapsulation mpls
interworking ip
否则R3和R4上会报错:
R3(config-pw-class)#l2 vfi 910 point-to-point R3(config-vfi)#nei 1.1.1.1 910 pw-class T910 Interworking must not be set in pw-class T910 R3(config-vfi)#nei 4.4.4.4 910 pw-class T910 Interworking must not be set in pw-class T910 R4(config-pw-class)#l2 vfi 910 point-to-point R4(config-vfi)#nei 6.6.6.6 910 pw-class T910 Interworking must not be set in pw-class T910 R4(config-vfi)#nei 3.3.3.3 910 pw-class T910 Interworking must not be set in pw-class T910
测试:

在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
在R3和R4上sh mpls forwarding-table可以看到,R3和R4上也有相关伪线的MPLS标签:
R3#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 Et5/0 23.1.1.2 3001 2000 1.1.1.1/32 0 Et5/0 23.1.1.2 3002 Pop Label 12.1.1.0/24 0 Et5/0 23.1.1.2 3003 Pop Label 34.1.1.4/32 0 Fa0/0 34.1.1.4 3004 No Label l2ckt(78) 0 Et5/0 23.1.1.2 3005 No Label l2ckt(910) 0 Et5/0 23.1.1.2 3006 No Label l2ckt(78) 0 Fa0/0 34.1.1.4 3007 No Label l2ckt(910) 0 Fa0/0 34.1.1.4 R4#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 Et5/0 45.1.1.5 4001 Pop Label 56.1.1.0/24 0 Et5/0 45.1.1.5 4002 Pop Label 34.1.1.3/32 0 Fa0/0 34.1.1.3 4003 5001 6.6.6.6/32 0 Et5/0 45.1.1.5 4004 No Label l2ckt(78) 0 Et5/0 45.1.1.5 4005 No Label l2ckt(78) 0 Fa0/0 34.1.1.3 4006 No Label l2ckt(910) 0 Fa0/0 34.1.1.3 4007 No Label l2ckt(910) 0 Et5/0 45.1.1.5
现在我们用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 = 33/38/40 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 37 msec 39 msec 40 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 = 41/46/51 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 44 msec 49 msec 50 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 = 45/49/51 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 44 msec 40 msec 50 msec
也通了!通过traceroute可以看到IOU9显示它跟IOU10也是直连的。
不知道为什么IOU9先ping IOU10是通不了的,不知道是不是IOU的bug,如果有知道的朋友可以在下方留言,大家互相交流一下。
数据包的报头结构追踪:

我们先追踪IOU7和IOU8之间的数据包,Ricky会在IOU1的e 0/0口、IOU1的e 0/2口、IOU5的e 0/2口、IOU6的e 0/3口和IOU6的e 0/0口用Wireshark抓取数据包,然后在IOU7上ping 78.1.1.8。
注意:我在R4的f 0/0口上抓包,但是Wireshark起不来,所以就抓不到了,这很尴尬…… 但是依旧也可以通过sh mpls forwarding-table等命令来查看数据包的MPLS标签是如何变化的。
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 | 伪线控制字段 | 内层MPLS标签 | 外层MPLS标签 | Eth |
IOU2收到这个数据包后,会Pop Label(弹出一层MPLS标签),然后将数据包转发给R3。如果在IOU2和R3之间的链路上抓取数据包,数据包的报头结构应该是这样的:
| FCS | ICMP | IP | Ethernet | 伪线控制字段 | 内层MPLS标签 | 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 21709 Et0/2 12.1.1.1 2001 Pop Label 3.3.3.3/32 22642 Et0/3 23.1.1.3
R3收到这个数据包后,会剥离最外层的Ethernet二层头部,No Label(弹出所有MPLS标签),删除伪线控制字段:
| FCS | ICMP | IP | Ethernet |
在R3上sh mpls forwarding-table,会发现R3将会为这个ping包执行No Label(弹出所有MPLS标签):
R3#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 Et5/0 23.1.1.2 3001 2000 1.1.1.1/32 0 Et5/0 23.1.1.2 3002 Pop Label 12.1.1.0/24 0 Et5/0 23.1.1.2 3003 Pop Label 34.1.1.4/32 0 Fa0/0 34.1.1.4 3004 No Label l2ckt(78) 1634 Et5/0 23.1.1.2 3005 No Label l2ckt(910) 1596 Et5/0 23.1.1.2 3006 No Label l2ckt(78) 1552 Fa0/0 34.1.1.4 3007 No Label l2ckt(910) 2092 Fa0/0 34.1.1.4
数据包现在就会转发给R4了吗?显然还没有完,不要忘了我们在R3和R4之间做了伪线缝补。如下图所示,数据包在R3上从第一段伪线出来以后,紧接着就进入到了第二段伪线:

在R3上sh mpls l2transport binding 78,可以看到R4为编号为78的这条伪线分配的MPLS标签是4004:
R3#sh mpls l2transport binding 78 Destination Address: 1.1.1.1, VC ID: 78 Local Label: 3006 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: 4.4.4.4, VC ID: 78 Local Label: 3004 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: 4004 Cbit: 1, VC Type: Ethernet, GroupID: 0 MTU: 1500, Interface Desc: n/a VCCV: CC Type: CW [1], RA [2] CV Type: LSPV [2]
如果去往伪线的另一端(这里伪线的另一端是R4)还有MPLS标签的话,还会像IOU1一样再打上一层最外层的MPLS标签,由下图可知,在R3上去往R4是不打MPLS标签的:
R3#sh ip cef 4.4.4.4 4.4.4.4/32 nexthop 34.1.1.4 FastEthernet0/0
所以,最终数据包会在R3上打上一层编号为4004的MPLS标签和一个伪线控制字段,再打上最外层的Ethernet二层头部,然后将数据包转发给R4。如果在R3和R4之间的链路上抓取数据包,数据包的报头结构应该是这样的:
| FCS | ICMP | IP | Ethernet | 伪线控制字段 | 内层MPLS标签(4004) | Ethernet |
R4收到这个数据包后,会剥离最外层的Ethernet二层头部,No Label(弹出所有MPLS标签),删除伪线控制字段:
| FCS | ICMP | IP | Ethernet |
在R4上sh mpls forwarding-table,会发现R4将会为这个ping包执行No Label(弹出所有MPLS标签):
R4#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 Et5/0 45.1.1.5 4001 Pop Label 56.1.1.0/24 0 Et5/0 45.1.1.5 4002 5001 6.6.6.6/32 0 Et5/0 45.1.1.5 4003 Pop Label 34.1.1.3/32 0 Fa0/0 34.1.1.3 4004 No Label l2ckt(78) 646 Et5/0 45.1.1.5 4005 No Label l2ckt(78) 626 Fa0/0 34.1.1.3 4006 No Label l2ckt(910) 1332 Fa0/0 34.1.1.3 4007 No Label l2ckt(910) 1926 Et5/0 45.1.1.5
这个时候也还没有完,R4上也是做了伪线缝补的,所以数据包在R4上从第二段伪线出来以后,紧接着就进入到了第三段伪线。
在R4上sh mpls l2transport binding 78,可以看到R6为编号为78的这条伪线分配的MPLS标签是6003:
R4#sh mpls l2transport binding 78 Destination Address: 3.3.3.3, VC ID: 78 Local Label: 4004 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: 3004 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: 78 Local Label: 4005 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: 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]
在R4上去往伪线的另一端(这里伪线的另一端是R6)还有MPLS标签,所以还会再打上一层最外层的MPLS标签,由下图可知,在R4上去往R6打的MPLS标签是5001:
R4#sh ip cef 6.6.6.6
6.6.6.6/32
nexthop 45.1.1.5 Ethernet5/0 label 5001
所以,最终数据包会在R4上打上两层MPLS标签(内层6003,外层5001)和一个伪线控制字段,再打上最外层的Ethernet二层头部,然后将数据包发送给IOU5。如果在R4和IOU5之间的链路上抓取数据包,数据包的报头结构应该是这样的:
| FCS | ICMP | IP | Eth | 伪线控制字段 | 内层标签(6003) | 外层标签(5001) | Eth |
3、在IOU7上ping 78.1.1.8时,IOU5的e 0/2口上的抓包:

如上图所示,这是R4给IOU5发送的数据包的报头结构,该数据包外层MPLS标签是5001,内层MPLS标签是6003。虽然没法在R4的f 0/0口上抓包,但是这个截图足以证明我上面的描述。
4、在IOU7上ping 78.1.1.8时,IOU6的e 0/3口上的抓包:

如上图所示,IOU5收到这个数据包后,会Pop Label(弹出一层MPLS标签),然后将数据包转发给IOU6。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | Ethernet | 伪线控制字段 | 内层MPLS标签 | 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 46338 Et0/2 45.1.1.4 5001 Pop Label 6.6.6.6/32 46549 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口、IOU5的e 0/2口、IOU6的e 0/3口和IOU6的e 0/1口用Wireshark抓取数据包,然后在IOU9上ping 10.9.1.10。
注意:我在R4的f 0/0口上抓包,但是Wireshark起不来,所以就抓不到了,这很尴尬…… 但是依旧也可以通过sh mpls forwarding-table等命令来查看数据包的MPLS标签是如何变化的。
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 | 伪线控制字段 | 内层MPLS标签 | 外层MPLS标签 | Ethernet |
这里需要注意的是,Wireshark把这个数据包识别错了,最内层不是Ethernet和Data,而是IP和ICMP。至于怎么判断Wireshark的识别是否出错,请看:《【实验】域间MPLS L2VPN实验 —— Inter-AS option A/option 1(Back to Back)》,该篇文章会有详细的解答,这里不再赘述。
IOU2收到这个数据包后,会Pop Label(弹出一层MPLS标签),然后将数据包转发给R3。如果在IOU2和R3之间的链路上抓取数据包,数据包的报头结构应该是这样的:
| FCS | ICMP | IP | 伪线控制字段 | 内层MPLS标签 | 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 21709 Et0/2 12.1.1.1 2001 Pop Label 3.3.3.3/32 22642 Et0/3 23.1.1.3
R3收到这个数据包后,会剥离最外层的Ethernet二层头部,No Label(弹出所有MPLS标签),删除伪线控制字段:
| FCS | ICMP | IP |
在R3上sh mpls forwarding-table,会发现R3将会为这个ping包执行No Label(弹出所有MPLS标签):
R3#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 Et5/0 23.1.1.2 3001 2000 1.1.1.1/32 0 Et5/0 23.1.1.2 3002 Pop Label 12.1.1.0/24 0 Et5/0 23.1.1.2 3003 Pop Label 34.1.1.4/32 0 Fa0/0 34.1.1.4 3004 No Label l2ckt(78) 1634 Et5/0 23.1.1.2 3005 No Label l2ckt(910) 1596 Et5/0 23.1.1.2 3006 No Label l2ckt(78) 1552 Fa0/0 34.1.1.4 3007 No Label l2ckt(910) 2092 Fa0/0 34.1.1.4
数据包现在只要再打上Ethernet二层头部然后就会转发给R4了吗?显然还没有完,不要忘了我们在R3和R4之间做了伪线缝补。如下图所示,数据包在R3上从第一段伪线出来以后,紧接着就进入到了第二段伪线:

在R3上sh mpls l2transport binding 910,可以看到R4为编号为910的这条伪线分配的MPLS标签是4007:
R3#sh mpls l2transport binding 910 Destination Address: 1.1.1.1, VC ID: 910 Local Label: 3007 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] Destination Address: 4.4.4.4, VC ID: 910 Local Label: 3005 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: 4007 Cbit: 1, VC Type: IP, GroupID: 0 MTU: 1500, Interface Desc: n/a VCCV: CC Type: CW [1], RA [2] CV Type: LSPV [2]
如果去往伪线的另一端(这里伪线的另一端是R4)还有MPLS标签的话,还会像IOU1一样再打上一层最外层的MPLS标签,由下图可知,在R3上去往R4是不打MPLS标签的:
R3#sh ip cef 4.4.4.4 4.4.4.4/32 nexthop 34.1.1.4 FastEthernet0/0
所以,最终数据包会在R3上打上一层编号为4007的MPLS标签和一个伪线控制字段,再打上最外层的Ethernet二层头部,然后将数据包转发给R4。如果在R3和R4之间的链路上抓取数据包,数据包的报头结构应该是这样的:
| FCS | ICMP | IP | 伪线控制字段 | 内层MPLS标签(4007) | Ethernet |
R4收到这个数据包后,会剥离最外层的Ethernet二层头部,No Label(弹出所有MPLS标签),删除伪线控制字段:
| FCS | ICMP | IP |
在R4上sh mpls forwarding-table,会发现R4将会为这个ping包执行No Label(弹出所有MPLS标签):
R4#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 Et5/0 45.1.1.5 4001 Pop Label 56.1.1.0/24 0 Et5/0 45.1.1.5 4002 5001 6.6.6.6/32 0 Et5/0 45.1.1.5 4003 Pop Label 34.1.1.3/32 0 Fa0/0 34.1.1.3 4004 No Label l2ckt(78) 646 Et5/0 45.1.1.5 4005 No Label l2ckt(78) 626 Fa0/0 34.1.1.3 4006 No Label l2ckt(910) 1332 Fa0/0 34.1.1.3 4007 No Label l2ckt(910) 1926 Et5/0 45.1.1.5
这个时候也还没有完,R4上也是做了伪线缝补的,所以数据包在R4上从第二段伪线出来以后,紧接着就进入到了第三段伪线。
在R4上sh mpls l2transport binding 910,可以看到R6为编号为910的这条伪线分配的MPLS标签是6004:
R4#sh mpls l2transport binding 910 Destination Address: 3.3.3.3, VC ID: 910 Local Label: 4007 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: 3005 Cbit: 1, VC Type: IP, 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: 4006 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]
在R4上去往伪线的另一端(这里伪线的另一端是R6)还有MPLS标签,所以还会再打上一层最外层的MPLS标签,由下图可知,在R4上去往R6打的MPLS标签是5001:
R4#sh ip cef 6.6.6.6
6.6.6.6/32
nexthop 45.1.1.5 Ethernet5/0 label 5001
所以,最终数据包会在R4上会打上两层MPLS标签(内层6004,外层5001)和一个伪线控制字段,再打上最外层的Ethernet二层头部,然后将数据包发送给IOU5。如果在R4和IOU5之间的链路上抓取数据包,数据包的报头结构应该是这样的:
| FCS | ICMP | IP | 伪线控制字段 | 内层标签(6004) | 外层标签(5001) | Eth |
3、在IOU9上ping 10.9.1.10时,IOU5的e 0/2口上的抓包:

如上图所示,这是R4给IOU5发送的数据包的报头结构,该数据包外层MPLS标签是5001,内层MPLS标签是6004。虽然没法在R4的f 0/0口上抓包,但是这个截图足以证明我上面的描述。
4、在IOU9上ping 10.9.1.10时,IOU6的e 0/3口上的抓包:

如上图所示,IOU5收到这个数据包后,会Pop Label(弹出一层MPLS标签),然后将数据包转发给IOU6。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | 伪线控制字段 | 内层MPLS标签 | 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 46338 Et0/2 45.1.1.4 5001 Pop Label 6.6.6.6/32 46549 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实验(共四个实验)的数据包报头结构小结
发表评论?