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

113

Estou usando as classes .NET Framework 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 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 uma 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. De acordo com o MSDN , ele identifica exclusivamente cada adaptador de rede e essa propriedade foi introduzido 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. Confirmei via ipconfig

Legal. Isso foi interessante !!

    
por Amith George 23.01.2010 / 22:42

3 respostas

120

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

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

  1. Endereçável globalmente. 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 exclusivos em todo o mundo.

  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 eu encontrado. O artigo indica que a presença de um ID de escopo no seu endereço significa que ele é um endereço de link 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 no meu melhor entendimento de RFC 4007 e outras informações por aí.

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.

    
por 23.01.2010 / 23:26
19

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. Detalhes específicos 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 objetivos. Por exemplo, no Linux, a ferramenta ifconfig não a mostra porque é óbvia a qual interface um endereço pertence. Mas, em geral, deve ser levado em conta.

    
por 24.01.2010 / 00:30
14

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.

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

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

Nesse caso, o identificador da 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 " pois isso também funciona em outros sistemas operacionais, mas o Microsoft Windows também suporta " route print ". 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ê canalize 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 ===========================================================================

Neste 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

Portanto, o comando ping 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 por que 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 estava 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 a seção 2.8 da RFC 4291 , todos os computadores que usam o IPv6 devem atribuir um endereço local de link para cada interface de rede. A seção 2.5.6 da RFC 4291 mostra os bits com os quais os endereços locais de link devem começar, o que causa os endereços locais de link para começar com "fe80: 0000: 0000: 0000:" (embora muitos desses zeros sejam reduzidos a dois pontos duplos). O fato de que esses endereços começam com "fe80:" também é descrito pela 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, que é feito procurando nos bits no início do endereço. Então, esses bits são usados para determinar como direcionar o tráfego.

No entanto, esse processo não funciona para um endereço IPv6 local de link, 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 de "/ 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, você quer que seu computador envie o pacote pela 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 seu tráfego saia da placa Ethernet.

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

    
por 24.04.2016 / 06:22

Tags