Introdução
O Ping MPLS LSP é uma ferramenta básica usada para validar a integridade do LSP (Label Switched Path, caminho comutado por rótulo) entre a entrada e a saída. Este documento tem como objetivo explicar a interação de informações de vários caminhos entre o iniciador e o respondente no rastreamento de árvore LSP. Para obter as opções detalhadas disponíveis para esta ferramenta, seria útil consultar este documento.
Informações de Apoio
Essa implementação do recurso MPLS EM—MPLS LSP Multipath Tree Trace é baseada em RFC 4379, Detecção de Falhas do Plano de Dados de Multi-Protocol Label Switched (MPLS).
Definindo o endereço IP de destino do pacote de teste como endereço de loopback (127.x.x.x), o rastreamento de árvore LSP pode ser usado para detectar falhas no LSP, evitando que o pacote seja roteado pelo IP. Portanto, sempre que houver um problema de conectividade fim-a-fim, será útil usar o Ping LSP como a primeira etapa para eliminar qualquer falha de LSP.
No caso de cenários de vários caminhos, o ping LSP nem sempre pode ajudar a identificar todas as falhas de LSP. Como pode ser observado, qualquer Label Switch Router (LSR) ao receber um pacote rotulado que pode ser enviado para várias interfaces de saída, usa certas chaves do pacote e entrada para algoritmo de hash para decidir a interface de saída. Dependendo do fornecedor, hardware, etc., qualquer uma das opções abaixo pode ser considerada para hash:
- Pilha de rótulos de entrada sozinha.
- Pilha de rótulos de entrada e detalhes do cabeçalho IP (se o payload for IP).
- Pilha de rótulos de entrada, cabeçalho IP e detalhes do cabeçalho de transporte.
Normalmente, os roteadores Cisco consideram uma combinação de pilha de rótulos e cabeçalho IP se a pilha tiver um tamanho menor ou igual a 3 (com IP como payload).
Suponha a seguinte topologia.
R1-R7 são roteadores. Na topologia acima, há 3 rotas de vários caminhos de mesmo custo (ECMP) de R1 para R5, conforme mostrado abaixo.
CAMINHO1: R1-R2-R3-R4-R5
CAMINHO2: R1-R2-R6-R4-R5
CAMINHO3: R1-R2-R6-R7-R5
Suponha que haja um problema entre R6 e R7 (como LDP (Protocolo de Distribuição de Rótulo) quebrado ou má programação de rótulo, etc.) fazendo com que o tráfego de R1 para R5 via PATH3 caia. Se o Ping LSP de R1 usar PATH1 ou PATH2, você poderá concluir que o caminho entre R1 e R5 está bom.
O ping LSP permite definir o endereço IP de destino como qualquer um no intervalo 127.0.0.0/8. Embora uma opção simples seja tentar enviar manualmente vários pacotes de ping com endereços de destino diferentes, não há garantia de que todos os caminhos ECMP possíveis serão validados. Você precisa de uma maneira que consulte e valide todos os caminhos possíveis entre a origem e o destino. O rastreamento de árvore multicaminho LSP aproveita a "Codificação de Informações de Multicaminho" definida na Seção 3.3.1 do RFC4379 e ajuda a validar todos os caminhos ECMP.
Rastreamento de árvore LSP - Como funciona
Um ping MPLS regular ou traceroute pode indicar que não há falha, dependendo de como os roteadores de trânsito compartilham a carga dos pacotes por ECMP, no entanto, o rastreamento de árvore LSP fornece um método melhor para validar que todos os caminhos estão realmente funcionando.
No rastreamento de árvore LSP, o roteador iniciador envia a solicitação de eco MPLS a cada salto definindo o TTL no rótulo superior de maneira incremental (começando em 1). A solicitação de eco transportará o TLV de informações de multipath que transporta um intervalo de endereço IP (dentro do intervalo 127.0.0.0/8) ou intervalo de rótulo de entropia. Atualmente, os dispositivos da Cisco suportam a opção de destino IP e, portanto, nosso exemplo será detalhado com o intervalo de endereços IP.
Cada LSR de trânsito ao receber o pacote de solicitação responderá com todas as interfaces de saída ECMP e associará um intervalo de endereço IP (ou rótulo de entropia) da solicitação para cada interface.
Rastreamento de árvore LSP - Exemplo detalhado
Considere a topologia a seguir, por exemplo, abaixo.
Para simplificar, este exemplo usa o intervalo de endereços de 127.0.0.0 a 127.0.0.200. Estes são os detalhes das etapas em um rastreamento de árvore LSP.
1) O iniciador (R1) envia a solicitação de eco com os detalhes abaixo:
- destino IP como 127.0.0.0
- TLV de informações de multipath transportando o intervalo de endereços de 127.0.0.0 a 127.0.0.200.
- O TTL do rótulo superior será definido como 1.
2) R2 ao receber o mesmo vai responder com Informações de vários caminhos para cada interface de saída. Neste exemplo, ele responderá da seguinte forma:
- Se o destino IP estiver entre 127.0.0.0 e 127.0.0.100, o pacote será enviado para R3.
- Se o destino IP estiver entre 127.0.0.101 e 127.0.0.200, o pacote será enviado para R6.
3) R1 percebe que há 2 caminhos ECMP possíveis e, portanto, precisa enviar 2 Echo Request com TTL definido como 2. A partir de vários testes, observou-se que o iniciador sempre termina com 1 caminho antes de ir para o próximo. (Mas isso pode ser verdadeiro para uma implementação específica).
4) R1 agora envia a solicitação de eco com os detalhes abaixo:
- destino IP como 127.0.0.0
- TLV de informações de multipath transportando o intervalo de endereços de 127.0.0.0 a 127.0.0.100.
- O TTL do rótulo superior será definido como 2.
5) R2 encaminhará o pacote para R3 (como o endereço destino é 127.0.0.0). R3, ao receber o mesmo, responderá com as mesmas informações de multipath, pois há apenas uma interface de saída.
O mesmo vale até chegar a R5.
6) Quando o rastreamento de PATH1 estiver concluído (após receber a resposta da saída), o Iniciador agora consultará PATH2. Isso é feito enviando-se a solicitação de eco com os detalhes abaixo:
- destino IP como 127.0.0.101
- TLV de informações de multipath transportando o intervalo de endereços como 127.0.0.101 a 127.0.0.200
- O TTL do rótulo superior definido como 2.
7) R2 encaminhará o pacote para R6 (como o endereço destino é 127.0.0.101). R6 ao receber o mesmo irá responder de volta com informações de multipath como abaixo:
- Se o destino IP estiver entre 127.0.0.101 e 127.0.0.150, o pacote será enviado para R4.
- Se o destino IP estiver entre 127.0.0.151 e 127.0.0.200, o pacote será enviado para R7.
8) R1 percebe que há mais um caminho ECMP tornando o total de caminhos possíveis como 3. R1 continua a consultar PATH2 enviando a próxima solicitação de eco com os detalhes abaixo:
- destino IP como 127.0.0.101
- TLV de informações de multipath transportando o intervalo de endereços como 127.0.0.101 a 127.0.0.150
- O TTL do rótulo superior definido como 3.
9) R2 encaminhará o pacote para R6 (como o destino é 127.0.0.101) e R6 o encaminhará para R4 (como o destino é 127.0.0.101). R4 não tem nenhum caminho ECMP e, portanto, responderá com as mesmas informações de multipath. O próximo pacote alcançará a saída R5.
10) Como o rastreamento de PATH2 está concluído, R1 continuará a consulta para PATH3. Isso é feito enviando-se a solicitação de eco com os detalhes abaixo:
- destino IP como 127.0.0.151
- TLV de informações de multipath transportando o intervalo de endereços como 127.0.0.151 a 127.0.0.200
- O TTL do rótulo superior definido como 3.
11) R2 encaminhará o pacote para R6, que, por sua vez, o encaminhará para R7. R7 responderá com o mesmo TLV de informações de multipath. O próximo pacote alcança o roteador de saída R5.
Após concluir essas etapas, R1 terá os detalhes abaixo:
Usando o endereço de destino dentro de 127.0.0.0 e 127.0.0.100, o encaminhamento de pacotes será influenciado sobre PATH1, enquanto o uso do endereço de outros intervalos influenciará o encaminhamento do pacote sobre os respectivos caminhos.
12) Agora, o Iniciador enviará 3 pacotes de echo request com TTL definido como 255 e selecionará o endereço de cada intervalo para que todos os caminhos sejam validados fim-a-fim.
O comando a ser usado para o rastreamento ECMP é traceroute mpls multipath ipv4 <prefix> <mask>. Veja a seguir um exemplo de saída.
R1#traceroute mpls multipath ipv4 10.1.5.5 255.255.255.255
Starting LSP Multipath Traceroute for 10.1.5.5/32
Codes: '!' - success, 'Q' - request not sent, '.' - timeout,
'L' - labeled output interface, 'B' - unlabeled output interface,
'D' - DS Map mismatch, 'F' - no FEC mapping, 'f' - FEC mismatch,
'M' - malformed request, 'm' - unsupported tlvs, 'N' - no label entry,
'P' - no rx intf label prot, 'p' - premature termination of LSP,
'R' - transit router, 'I' - unknown upstream index,
'l' - Label switched with FEC change, 'd' - see DDMAP for return code,
'X' - unknown return code, 'x' - return code 0
Type escape sequence to abort.
LLL!
Path 0 found,
output interface Et0/0.12 nexthop 10.1.12.2
source 10.1.12.1 destination 127.0.0.4
LL!
Path 1 found,
output interface Et0/0.12 nexthop 10.1.12.2
source 10.1.12.1 destination 127.0.0.2
L!
Path 2 found,
output interface Et0/0.12 nexthop 10.1.12.2
source 10.1.12.1 destination 127.0.0.0
Paths (found/broken/unexplored) (3/0/0)
Echo Request (sent/fail) (9/0)
Echo Reply (received/timeout) (9/0)
Total Time Elapsed 27 ms
Observe que a saída acima mostra que há 3 caminhos e todos os caminhos estão funcionando bem. O uso do comando verbose knob in above listará todos os saltos como abaixo:
R1#traceroute mpls multipath ipv4 10.1.5.5 255.255.255.255 verbose
Starting LSP Multipath Traceroute for 10.1.5.5/32
Codes: '!' - success, 'Q' - request not sent, '.' - timeout,
'L' - labeled output interface, 'B' - unlabeled output interface,
'D' - DS Map mismatch, 'F' - no FEC mapping, 'f' - FEC mismatch,
'M' - malformed request, 'm' - unsupported tlvs, 'N' - no label entry,
'P' - no rx intf label prot, 'p' - premature termination of LSP,
'R' - transit router, 'I' - unknown upstream index,
'l' - Label switched with FEC change, 'd' - see DDMAP for return code,
'X' - unknown return code, 'x' - return code 0
Type escape sequence to abort.
LLL!
Path 0 found,
output interface Et0/0.12 nexthop 10.1.12.2
source 10.1.12.1 destination 127.0.0.4
0 10.1.12.1 10.1.12.2 MRU 1500 [Labels: 22 Exp: 0] multipaths 0
L 1 10.1.12.2 10.1.23.3 MRU 1500 [Labels: 23 Exp: 0] ret code 8 multipaths 2
L 2 10.1.23.3 10.1.34.4 MRU 1500 [Labels: 22 Exp: 0] ret code 8 multipaths 1
L 3 10.1.34.4 10.1.45.5 MRU 1500 [Labels: implicit-null Exp: 0] ret code 8 multipaths 1
! 4 10.1.45.5, ret code 3 multipaths 0
LL!
Path 1 found,
output interface Et0/0.12 nexthop 10.1.12.2
source 10.1.12.1 destination 127.0.0.2
0 10.1.12.1 10.1.12.2 MRU 1500 [Labels: 22 Exp: 0] multipaths 0
L 1 10.1.12.2 10.1.26.6 MRU 1500 [Labels: 16 Exp: 0] ret code 8 multipaths 2
L 2 10.1.26.6 10.1.46.4 MRU 1500 [Labels: 22 Exp: 0] ret code 8 multipaths 2
L 3 10.1.46.4 10.1.45.5 MRU 1500 [Labels: implicit-null Exp: 0] ret code 8 multipaths 1
! 4 10.1.45.5, ret code 3 multipaths 0
L!
Path 2 found,
output interface Et0/0.12 nexthop 10.1.12.2
source 10.1.12.1 destination 127.0.0.0
0 10.1.12.1 10.1.12.2 MRU 1500 [Labels: 22 Exp: 0] multipaths 0
L 1 10.1.12.2 10.1.26.6 MRU 1500 [Labels: 16 Exp: 0] ret code 8 multipaths 2
L 2 10.1.26.6 10.1.67.7 MRU 1500 [Labels: 17 Exp: 0] ret code 8 multipaths 2
L 3 10.1.67.7 10.1.57.5 MRU 1500 [Labels: implicit-null Exp: 0] ret code 8 multipaths 1
! 4 10.1.57.5, ret code 3 multipaths 0
Paths (found/broken/unexplored) (3/0/0)
Echo Request (sent/fail) (9/0)
Echo Reply (received/timeout) (9/0)
Total Time Elapsed 29 ms