Questão Por que há um sinal de porcentagem '%' no endereço IPv6?


Estou usando o .NET Framework classes para obter os endereços IP da minha máquina.

Dns.GetHostAddresses(Dns.GetHostName())

Eu tenho um adaptador VirtualBox que tem um endereço IPv4 e IPv6. Usando o código .NET estou recebendo o endereço IPv6 como fe80::71a3:2b00:ddd3:753f%16 

Observe o% 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.

Eu instalei o VMware para ver qual endereço IPv6 ele emitiu. 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 alguma representação hexadecimal. Eu verifiquei todas as propriedades disponíveis para um adaptador de rede usando Wmi e descobri que os números são exatamente iguais à propriedade InterfaceIndex de cada adaptador de rede. Conforme MSDN, identifica exclusivamente cada adaptador de rede e essa propriedade foi introduzida no Vista.

O que ainda me confundiu foi por que a classe IPAddress permite que você crie um endereço IP nesse formato, a menos que seja válido. A resposta foi fornecida por Stephen. O número é o id do escopo. IPAddress tem um construtor que aceita o endereço E um ID de escopo.

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

Legal. Isso foi interessante !!


109


origem


Eu não tinha ideia do que era antes de você perguntar. Aprendi também algo interessante sobre o IPv6 hoje (o que somos nerds). - Stephen Jennings
@Stephen, então você já trabalhou com o ipv6 antes? Eu estava surpreso com a rapidez com que você acertou. Eu pesquisei por algum tempo antes de postar a pergunta aqui. Bom trabalho! - Amith George
A pesquisa "ipv6 address percent" me deu o nome de que eu precisava e, a partir daí, pesquisando e tentando entender a confusa documentação técnica, demorou o máximo de tempo. Eu entendo o que o IPv6 está tentando realizar, mas há muitos novos conceitos que eu não consegui pesquisar e entender. Este foi um, e nada lhe dá uma melhor compreensão do que tentar explicar a outra pessoa. - Stephen Jennings
Uma notação alternativa pode ser fe80:10 (a 0x0010 sendo 16). Eu uso isso no meu navegador ao trabalhar com endereços IPv6 de link local, mas não tenho 100% de certeza de que isso está de acordo com os padrões. (Usar o percentual de URLs é confuso nos navegadores; na verdade, não consegui fazer isso funcionar). - Arjan


Respostas:


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 dado a você pelo seu ISP. Está disponível para uso na Internet pública.

  2. Link-local Isso é semelhante ao intervalo 169.254.X.X. É um endereço que um computador atribui 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 um ID de escopo em seu endereço significa que é um endereço de ligação local. Você também pode dizer que é link-local porque o endereço começa com fe80.

Informações claras e simples sobre esse tópico parecem ser raras, então estou juntando o resto com base na minha melhor compreensão de RFC 4007 e as outras informações lá fora.

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 é. Por exemplo, imagine o cenário de um computador com duas NICs, cada uma com um endereço de link local em redes diferentes. Se você tentar enviar algo para outro endereço que comece com fe80, como o computador saberá qual NIC enviar? O ID do escopo parece ser a solução para isso.


117



Obrigado! Editei minha pergunta para adicionar as coisas extras que eu observei enquanto esperava por uma resposta. E quando vim postá-los, fiquei surpreso ao ver sua resposta confirmando as observações :) - Amith George
Boa resposta. Deixe-me ver se entendi completamente isso. Assim, 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 o fe80::1%X pode ser usado para diferenciar entre os roteadores, mas fe80::42%X é de menor utilidade para o cliente, certo? - user123444555621
@ Pumbaa80 O cliente enviaria mensagens para fe80::1%1 para alcançar o roteador conectado ao NIC # 1, e enviaria mensagens para fe80::1%2 para alcançar o roteador conectado ao NIC # 2. Como um aparte, os endereços locais do Link são configurados automaticamente pelo computador host, não via DHCP, portanto, provavelmente não atribuiria seus dois NICs ao mesmo IP. Além disso, lembre-se de que os endereços locais de link não são roteáveis, então, normalmente, você não enviará mensagens para um roteador. Você enviará mensagens entre dois hosts. - Stephen Jennings
por experimentação, parece que o trailing %nn pode ser omitido por pelo menos alguns comandos, por ex. ping, tracert. - matt wilkie
Muito boa resposta. Só 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 da lista de interfaces com aquele escopo desse IP. - Arran Cudbard-Bell


Endereços IPv6 com o prefixo fe80 :: / 64 são endereços de link local que são construídos pela combinação desse 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, o roteamento pode precisar, algumas vezes, saber a qual interface você está se referindo. E é isso que o número após o percentual, chamado de índice de zona, especifica. Os detalhes dependem do sistema operacional: no Windows, %16 é o número de interface 16; no Linux, por exemplo, você pode ver algo como %eth0.

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


17





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

Eu estou supondo que você está usando o Microsoft Windows. Ele usa números como identificadores de interface.

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

Nesse caso, o identificador de interface, eth0, corresponde 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"desde que também funciona em outros sistemas operacionais, mas o Microsoft Windows também suporta"route printMsgstr "" "A saída resultante, que é informada, provavelmente estará sobre uma tela longa, então esteja preparado para rolar para trás, a menos que você envie para 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 Controlador da Família Realtek PCIe GBE. O "GBE" refere-se ao Gigabit Ethernet.

Agora, eis a parte complicada: se você quiser executar ping em um endereço remoto, talvez seja necessário usar o endereço IPv6 do sistema remoto, mas o identificador de interface do sistema local. Então, por exemplo, se eu estou usando o computador A e eu tenho um endereço IPv6 local de fe80 :: 1 anexado à interface número 14, e eu quero fazer ping no computador B e ele tem um endereço IPv6 local de fe80 :: 2 anexado ao sua interface número 16, então é isso que eu usaria:

ping fe80::2%14

Então o ping O comando 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 fazê-lo. O identificador de interface 14 é um número do sistema que estou usando, não o sistema remoto.

Agora, vamos ver porque isso pode ser necessário.

Se eu quiser pingar o endereço IPv6 do Google (que é 2607: f8b0: 400a: 802 :: 200e no momento em que escrevi essa resposta), a tabela de roteamento verificará qual placa de rede manipula 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 "gateway". Se eu estivesse me conectando a outra rede que faz parte da organização para a qual estou trabalhando, talvez eu tenha um endereço "gateway" especial que direcione o tráfego para uma rede privada. Neste caso, não tenho um gateway mais específico, por isso vou usar o "gateway padrão" do IPv6. É assim que o IPv6 funciona na maioria das vezes, com exceção dos endereços locais de conexão. É também assim que o IPv4 funcionou na maior parte do tempo. (Simplifiquei esse exemplo, assumindo um tamanho de sub-rede IPv6 de / 64, pois descrever todo o processo teria tornado essa descrição ainda mais longa).

De acordo com RFC 4291 seção 2.8, todos os computadores que usam o IPv6 devem atribuir um endereço de link local a todas as interfaces de rede. RFC 4291 seção 2.5.6 mostra os bits com os quais os endereços locais de link devem começar, o que faz com que os endereços locais de link comecem com "fe80: 0000: 0000: 0000:" (embora muitos desses zeros sejam recolhidos para dois-pontos duplos). O fato de que esses endereços começam com "fe80:" também é descrito por RFC 4291 seção 2.4.

Se você tentar efetuar 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. Então, esses bits são usados ​​para determinar como rotear o tráfego.

No entanto, esse processo não funciona para um endereço IPv6 de link local, porque cada interface de rede (operacional, ativa) tem um endereço de link local começando com "fe80:" em uma sub-rede usando o prefixo / tamanho de sub-rede "/ 64 ". Se você estiver em um laptop, é provável que você ache que tanto a placa Ethernet quanto o adaptador Wi-Fi devem ter esse endereço IPv6.

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

A solução é que você especifique qual dispositivo de rede deseja que o tráfego use. Então, essa é a finalidade do identificador de rede.


12



Ok, ao reler Peter Eisentraut's answer, parece que ele está tecnicamente correto. Espero que meus detalhes forneçam mais clareza. Eu discordo com Resposta de Stephen Jennings, porque essa resposta faz parecer 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" (de acordo com os exemplos mostrados em sua lista numerada). Em vez disso, digo que esses números identificam a "interface" da rede. - TOOGAM