借助查问题又重新复习了一下mpls协议,首先复习一下它的报文格式:
+0---------------19-------22---23------------31
| Label value | Exp | Bos | TTL |
+-----------------|---------|-------|-------------|
字段意义:
Label value 20比特 标签值字段,用来标识一个FEC。
EXP 3比特 用于扩展。现在通常用做CoS(Class of Service),其作用与Ethernet802.1p的作用类似。
Bos 1比特 MPLS支持多重标签。值为1时表示为最底层标签。
TTL 8比特 和IP分组中的TTL意义相同,可以用来防止环路。
出现问题的拓扑图是下面这样的:
流量是从N1->N2->N3,在这所有节点上配置了很多其他的服务或协议(其实我也不太懂那些服务和协议的),而且还创建的rsvp-te tunnel。问题是:从N1 向 N3 发流时,在N2上发现有丢包现象。
结果等老外那边复现的时候,直接艾特领导,领导一看就说是标签没匹配的问题,接下来让我确认一下标签信息。现在第一步是领导查看到的:
1, 登录 R2, 抓包查看接收的报文格式,报文格式可以参考 这里
00: 00218f1e b8080020 8f5acc8f 8100000c 88478000 00fd8000 11fd4500 004e0000
20: 00003f3d 295c140a 0b02140a 1f029349 380e3af9 51984978 6960e000 00001011
40: 121356f1 a7de001e 1a1b1c1d 1e1f2021 22232425 26272829 2a2b2c2d 2e2f3031
60: 32333435 36375c1f 00000000 00000000 00000000 00000000 00000000 00000000
从报文上可以看到 8847(表示MPLS协议)后紧跟着 8000 00fd8000 11fd 两个MPLS标签,第2个是栈底标签。因为其中8000 00fd 的Bos位为0,表示非栈底,而800011fd 的Bos位为1,表示栈底。到这里第二步就应该查看N1上有没有对应的出标签(因为流是从N1->N2,所以N1的出标签,即为N2的入标签,现在入标签已经有了,所以要看出标签。)。
2,在R2上看配置是否存在 0x80000(524288) 的入标签
登录上设备指定的端口可以查看配置,用命令list + grep 命令过滤入标签值为 52488(十六进制0x80000),结果没有
3,在R1上看配置是否存在 0x80000(524288) 的出标签
登录上设备指定的端口可以查看配置,用命令list + grep 命令过滤出标签值为 52488(十六进制0x80000),结果有此标签值,类似:
{RsvpTeTunnelOidx:1073774593}/Lsp{LspIndex:0}/SegOuts/segout[0x00000000]/OutLabel 524288
最后的结论是R2的入标签不对,导致MPLS转发失败。接着转交相关同事去查了。