Por que existe um sinal de porcentagem '%' no endereço IPv6?

125

Estou usando as .NET Frameworkclasses para obter os endereços IP da minha máquina.

Dns.GetHostAddresses(Dns.GetHostName())

Eu tenho um adaptador VirtualBox que possui um endereço IPv4 e IPv6. Usando o código .NET, estou obtendo o endereço IPv6 comofe80::71a3:2b00:ddd3:753f%16

Observe a% 16 no final?

No entanto, se eu consultar o mesmo usando WMI, estou recebendo o endereço como 'fe80 :: 71a3: 2b00: ddd3: 753f'

Então, o% 16 tem algum significado especial?

Editar:

Eu só tive mais algumas observações sobre isso. E eles combinam muito bem com o que Stephen Jennings disse em sua resposta.

Instalei o Vmware para ver qual endereço IPv6 foi emitido. Os endereços foram: fe80 :: 3dd0: 7f8e: 57b7: 34d5% 19

fe80 :: b059: 65f4: e877: c40% 20

Claramente, os números após% não são uma representação hexadecimal. Verifiquei todas as propriedades disponíveis para um adaptador de rede usando Wmi e descobri que os números são exatamente os mesmos que a propriedade InterfaceIndex de cada adaptador de rede. Conforme o MSDN , ele identifica exclusivamente cada adaptador de rede e essa propriedade foi introduzida no Vista.

O que ainda me confundiu foi por que a classe IPAddress permitiria criar um endereço IP nesse formato, a menos que fosse válido. A resposta foi dada por Stephen. O número é o ID do escopo. IPAddress possui um construtor que aceita o endereço E uma identificação de escopo.

Ah, e todos esses três adaptadores de rede eram locais de link. Confirmado via ipconfig

Legal. Isso foi interessante !!

Amith George
fonte
2
Eu não tinha ideia do que era antes de você perguntar. Também aprendi algo interessante sobre o IPv6 hoje (que nerds somos).
Stephen Jennings
@ Stephen, então você já trabalhou com o ipv6 antes? Fiquei surpreso com o quão rápido você acertou em cheio. Eu pesquisei no Google por algum tempo antes de postar a pergunta aqui. Bom trabalho!
Amith George
A pesquisa de "porcentagem de endereços ipv6" me deu o nome que eu precisava e, a partir daí, pesquisar e tentar entender a documentação técnica confusa levou mais tempo. Entendo o que o IPv6 está tentando realizar, mas há muitos conceitos novos que ainda não tive a oportunidade de pesquisar e entender. Este foi um, e nada lhe dá uma melhor compreensão do que tentar explicar para outra pessoa.
Stephen Jennings
Uma notação alternativa pode ser fe80:10( 0x0010sendo 16). Eu uso isso no meu navegador ao trabalhar com endereços IPv6 locais de link, mas não tenho 100% de certeza de que isso está de acordo com os padrões. (Usando a cento em URLs é confuso em navegadores, na verdade eu não poderia chegar a esse trabalho em tudo.)
Arjan

Respostas:

134

O número após o '%' é o ID do escopo.

O IPv6 define pelo menos três escopos de acessibilidade para endereços:

  1. Globalmente endereçável. Este é um endereço IPv6 fornecido pelo seu ISP. Está disponível para uso na Internet pública.

  2. Link-local. Isso é semelhante ao intervalo 169.254.XX. É um endereço designado por um computador para facilitar as comunicações locais. Esses endereços não são roteados na Internet pública porque não são globalmente exclusivos.

  3. Nó local. Este é um endereço que identifica a interface local, semelhante a 127.0.0.1. Basicamente, este é o endereço :: 1.

A Microsoft publicou este artigo descrevendo o endereçamento IPv6 , que é o artigo menos confuso que encontrei. O artigo indica que a presença de uma identificação de escopo no seu endereço significa que é um endereço local do link . Você também pode dizer que é link-local porque o endereço começa com fe80.

Informações claras e simplesmente entendidas sobre esse tópico parecem ser raras, por isso estou reunindo o restante com base no meu melhor entendimento da RFC 4007 e de outras informações disponíveis.

Um computador pode ter vários endereços locais de link, cada um com um escopo diferente. O ID do escopo indica para qual escopo o endereço se destina. Por exemplo, imagine o cenário de um computador com duas NICs, cada uma com um endereço local de link em redes diferentes. Se você tentar enviar algo para outro endereço começando com fe80, como o computador saberá em qual NIC enviar? O ID do escopo parece ser a solução para isso.

Stephen Jennings
fonte
Obrigado! Editei minha pergunta para adicionar o material extra que observei enquanto esperava uma resposta. E quando eu vim para publicá-las, fiquei surpreso ao ver a sua resposta confirmando as observações :)
Amith George
Boa resposta. Deixe-me ver se eu entendi completamente isso. Portanto, um dispositivo com duas NICs pode se conectar a dois roteadores diferentes e receber o mesmo endereço DHCP fe80::42. Além disso, os roteadores têm o mesmo endereço fe80::1. Agora, isso fe80::1%Xpode ser usado para diferenciar os roteadores, mas fe80::42%Xé de pouca utilidade para o cliente, certo?
user123444555621
2
@ Pumbaa80 O cliente enviava mensagens para fe80::1%1alcançar o roteador conectado à NIC # 1 e enviava mensagens fe80::1%2para alcançar o roteador conectado à NIC # 2. Além disso, os endereços locais de link são configurados automaticamente pelo computador host, não via DHCP, portanto, provavelmente não atribuiria as duas NICs ao mesmo IP. Lembre-se também de que os endereços locais de link não são roteáveis; portanto, normalmente você não envia mensagens para um roteador, envia mensagens entre dois hosts.
Stephen Jennings
por experimentação, parece que o arrasto %nnpode ser omitida no caso de pelo menos alguns comandos, por exemplo ping, tracert.
Matt Wilkie
Resposta muito boa. Apenas mencionar que o ID do escopo é zero é especial e parece indicar que um algoritmo específico de implementação para escolher um ID de escopo na lista de interfaces com esse escopo desse IP.
Arran Cudbard-Bell 7/11
21

Os endereços IPv6 com o prefixo fe80 :: / 64 são endereços locais de link que são construídos combinando esse prefixo com o endereço de hardware do dispositivo de rede, 71a3: 2b00: ddd3: 753f no seu exemplo. (O analógico no IPv4 é 169.254.0.0/16.) Como o prefixo é o mesmo para todos os endereços locais de link em uma máquina, às vezes o roteamento precisa saber a qual interface você está se referindo. E é isso que o número após o percentual, chamado índice de zona, especifica. Os detalhes dependem do sistema operacional: No Windows, %16é o número da interface 16; no Linux, por exemplo, você pode ver algo como %eth0.

Algumas ferramentas ou APIs considerarão esse índice de zona sem importância ou implícito para seus propósitos. Por exemplo, no Linux, a ifconfigferramenta não mostra porque é óbvio a qual interface um endereço pertence. Mas, em geral, isso deve ser levado em consideração.

Peter Eisentraut
fonte
18

Os caracteres após o% (que são números no seu exemplo) são o Identificador da interface. Esses caracteres são usados ​​para identificar uma "interface de rede", que as pessoas costumam chamar de "placa de rede". Por exemplo, pode ajudar a determinar se um pacote estará usando uma placa Ethernet com fio ou um adaptador Wi-Fi sem fio.

Suponho que você esteja usando o Microsoft Windows. Ele usa números como identificadores de interface.

Como ponto de comparação, sistemas tipo Unix podem usar letras após o sinal de%. por exemplo:fe80::71a3:2b00:ddd3:753f%eth0

Nesse caso, o identificador de interface,, eth0corresponde ao nome da placa de rede.

No Microsoft Windows, você pode obter uma lista dos identificadores de interface (numéricos) usando uma das linhas de comando que verificam a tabela de roteamento. Eu prefiro " netstat -nr", pois isso também funciona em outros sistemas operacionais, mas o Microsoft Windows também suporta " route print". A saída resultante, que é relatada, provavelmente terá uma tela inteira, portanto, esteja preparado para voltar, a menos que você canalize mais.

por exemplo, no meu sistema:

=========================================================================== Interface List 14...5c f9 dd 6d 98 b8 ......Realtek PCIe GBE Family Controller 12...e0 06 e6 7e fc 4e ......Bluetooth Device (Personal Area Network) 1...........................Software Loopback Interface 1 13...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter 15...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #2 ===========================================================================

Nesse caso, um endereço como fe80 :: 71a3: 2b00: ddd3: 753f% 14 se referiria ao meu controlador de família Realtek PCIe GBE. O "GBE" refere-se à Gigabit Ethernet.

Agora, aqui está a parte complicada: se você deseja executar ping em um endereço remoto, pode ser necessário usar o endereço IPv6 do sistema remoto, mas o Identificador da interface do sistema local. Assim, por exemplo, se eu estiver usando o Computador A e tiver um endereço IPv6 local do fe80 :: 1 conectado ao número da Interface 14, e desejar executar ping no Computador B e ele tiver um endereço IPv6 local do fe80 :: 2 conectado ao sua interface número 16, então é isso que eu usaria:

ping fe80::2%14

Portanto, o pingcomando enviará o pacote ICMPv6 para o endereço IPv6 remoto (fd80 :: 2), que pertence ao computador remoto, e usará a Interface com o Identificador 14 para fazer isso. O Identificador de interface 14 é um número do sistema que estou usando, não do sistema remoto.

Agora, vejamos por que isso pode ser necessário.

Se eu quiser executar ping no endereço IPv6 do Google (que é 2607: f8b0: 400a: 802 :: 200e no momento em que escrevi esta resposta), a tabela de roteamento verificará qual placa de rede lida com os endereços que começam com 2607: f8b0: 400a: 802. A tabela de roteamento indicará que nenhuma das minhas placas de rede está conectada diretamente a uma rede usando endereços que começam com 2607: f8b0: 400a: 802; portanto, meu computador acabará usando um endereço de "gateway". Se eu estava me conectando a outra rede que faz parte da organização em que estou trabalhando, talvez eu tenha um endereço de "gateway" especial que direcione o tráfego para uma rede privada. Nesse caso, como não tenho um gateway mais específico, utilizarei o "gateway padrão" do IPv6. É assim que o IPv6 funciona na maioria das vezes, exceto para endereços locais de link. Também é assim que o IPv4 funciona na maioria das vezes.

De acordo com a RFC 4291, seção 2.8 , todo computador que usa o IPv6 deve atribuir um endereço local de link a todas as interfaces de rede. A seção 2.5.6 da RFC 4291 mostra os bits nos quais os endereços locais de link devem começar, o que faz com que os endereços locais de link iniciem com "fe80: 0000: 0000: 0000:" (embora muitos desses zeros sejam recolhidos em dois pontos duplos) ) O fato de esses endereços começarem com "fe80:" também é descrito na seção 2.4 da RFC 4291 .

Se você tentar executar ping em um sistema remoto (por exemplo, "2607: f8b0: 400a: 802"), o processo geral geralmente é descobrir uma rede ou sub-rede da qual o endereço faz parte, o que é feito observando os bits no início do endereço. Em seguida, esses bits são usados ​​para determinar como rotear o tráfego.

No entanto, esse processo não funciona para um endereço local de link IPv6, porque toda interface de rede (operacional, ativa) possui um endereço local de link começando com "fe80:" em uma sub-rede usando o prefixo / tamanho da sub-rede "/ 64 ". Se você estiver em um laptop, provavelmente descobrirá que sua placa Ethernet e seu adaptador Wi-Fi devem ter esse endereço IPv6.

Agora, quando você envia seu ping para fe80 :: 2, deseja que seu computador envie esse pacote para a placa de rede correta. Se você possui uma impressora conectada a uma rede com fio, não deseja enviar o tráfego para o seu cartão Wi-Fi, usando um caminho / rota de rede que não resultará no tráfego que chega à impressora. E se você está tentando se comunicar com um dispositivo sem fio usando sua placa Wi-Fi, não quer que seu tráfego saia da placa Ethernet.

A solução é especificar o dispositivo de rede que você deseja que o tráfego use. Então, esse é o objetivo do identificador de rede.

TOOGAM
fonte
2
Ok, ao reler a resposta de Peter Eisentraut , parece que ele está tecnicamente correto. Espero que meus detalhes forneçam mais clareza. Não concordo com a resposta de Stephen Jennings , porque essa resposta faz com que pareça que o "ID do escopo" identifica "link local" como o escopo. No entanto, duas interfaces de rede diferentes podem ser "link local", mas não usarão o mesmo "escopo" (conforme os exemplos mostrados em sua lista numerada). Em vez disso, digo que esses números identificam a "interface" da rede.
TOOGAM