it-swarm-eu.dev

Perché c'è un segno di percentuale '%' nell'indirizzo IPv6?

Sto usando le classi .NET Framework per ottenere gli indirizzi IP per la mia macchina.

Dns.GetHostAddresses(Dns.GetHostName())

Ho un adattatore VirtualBox che ha sia un indirizzo IPv4 che IPv6. Usando il codice .NET sto ottenendo l'indirizzo IPv6 come fe80::71a3:2b00:ddd3:753f%16

Notare il% 16 alla fine?

Tuttavia, se interrogo lo stesso utilizzando WMI, sto ottenendo l'indirizzo come 'fe80 :: 71a3: 2b00: ddd3: 753f'

Quindi, il% 16 ha un significato speciale?

Modifica:

Ho appena avuto alcune osservazioni su questo. E corrispondono abbastanza bene a ciò che Stephen Jennings ha detto nella sua risposta.

Ho installato Vmware per vedere quale indirizzo IPv6 ha emesso. Gli indirizzi erano: fe80 :: 3dd0: 7f8e: 57b7: 34d5% 19

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

Chiaramente, i numeri dopo% non sono una rappresentazione esadecimale. Ho controllato tutte le proprietà disponibili per una scheda di rete usando Wmi e ho scoperto che i numeri sono esattamente gli stessi della proprietà InterfaceIndex di ogni scheda di rete. Come per MSDN , identifica in modo univoco ogni scheda di rete e questa proprietà è stata introdotta in Vista.

Ciò che ancora mi confondeva era il perché la classe IPAddress ti permettesse di creare un indirizzo IP in quel formato, a meno che non fosse valido. La risposta è stata fornita da Stephen. Il numero è l'ID dell'ambito. IPAddress ha un costruttore che accetta l'indirizzo AND un ID di ambito.

Oh, e tutti questi tre adattatori di rete erano link locali. Confermato tramite ipconfig

Freddo. E 'stato interessante !!

119
Amith George

Il numero dopo il '%' è l'ID dell'ambito.

IPv6 definisce almeno tre ambiti di raggiungibilità per gli indirizzi:

  1. Globalmente indirizzabile. Questo è un indirizzo IPv6 fornito dal tuo ISP. È disponibile per l'uso su Internet pubblica.

  2. Link-locale. Questo è simile all'intervallo 169.254.X.X. È un indirizzo che un computer assegna a sé stesso per facilitare le comunicazioni locali. Questi indirizzi non vengono instradati su Internet pubblica perché non sono globalmente unici.

  3. Node-locale. Questo è un indirizzo che identifica l'interfaccia locale, simile a 127.0.0.1. Fondamentalmente, questo è l'indirizzo :: 1.

Microsoft ha pubblicato questo articolo che descrive l'indirizzamento IPv6 , che è l'articolo meno confuso che ho trovato. L'articolo indica che la presenza di un ID ambito nel tuo indirizzo significa che è un indirizzo link-locale . Puoi anche dire che è link-local perché l'indirizzo inizia con fe80.

Le informazioni chiare e comprensibili su questo argomento sembrano essere rare, quindi sto mettendo insieme il resto di questo sulla base della mia migliore comprensione di RFC 4007 e delle altre informazioni là fuori.

Un computer può avere più indirizzi locali di collegamento, ognuno con un ambito diverso. L'ID dell'ambito indica a quale ambito è rivolto l'indirizzo. Ad esempio, immagina lo scenario di un computer con due schede NIC, ciascuna con un indirizzo locale di collegamento su reti diverse. Se provate a inviare qualcosa a un altro indirizzo che inizia con fe80, come farà il computer a sapere quale NIC inviare? L'ID dell'oscilloscopio sembra essere la soluzione per questo.

128
Stephen Jennings

Gli indirizzi IPv6 con il prefisso fe80 ::/64 sono indirizzi locali di collegamento che sono costruiti combinando tale prefisso con l'indirizzo hardware del dispositivo di rete, 71a3: 2b00: ddd3: 753f nell'esempio. (L'analogo in IPv4 è 169.254.0.0/16.) Poiché il prefisso è lo stesso per tutti gli indirizzi locali di collegamento su una macchina, a volte il routing deve sapere a quale interfaccia ci si sta riferendo. Ed è quello che specifica il numero dopo la percentuale, chiamato indice della zona. Le specifiche dipendono dal sistema operativo: Su Windows, %16 è l'interfaccia numero 16; su Linux, ad esempio, potresti vedere qualcosa come %eth0.

Alcuni strumenti o API considereranno questo indice di zona non importante o implicito per i loro scopi. Ad esempio, su Linux lo strumento ifconfig non lo mostra perché è ovvio a quale interfaccia appartiene un indirizzo. Ma in generale dovrebbe essere preso in considerazione.

20
Peter Eisentraut

I caratteri dopo la% (che capita di essere numeri nell'esempio) sono l'identificatore di interfaccia. Quei caratteri sono usati per identificare una "interfaccia di rete", che le persone spesso chiamano una "scheda di rete". Ad esempio, può aiutare a determinare se un pacchetto utilizzerà una scheda Ethernet cablata o un adattatore Wi-Fi wireless.

Immagino che tu stia usando Microsoft Windows. Usa numeri come identificatori di interfaccia.

A titolo di confronto, i sistemi di tipo Unix possono utilizzare le lettere dopo il segno%. ad esempio: fe80::71a3:2b00:ddd3:753f%eth0

In tal caso, l'identificatore di interfaccia, eth0, corrisponde al nome della scheda di rete.

In Microsoft Windows, è possibile ottenere un elenco degli identificatori di interfaccia (numerici) utilizzando una delle righe di comando che controllano la tabella di routing. Preferisco "netstat -nr" dato che funziona anche su altri sistemi operativi, ma Microsoft Windows supporta anche "route print". L'output risultante, che verrà segnalato, sarà probabilmente su uno schermo lungo, quindi preparatevi a tornare indietro, a meno che non ne abbiate altri.

ad esempio, sul mio 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 ===========================================================================

In questo caso, un indirizzo come fe80 :: 71a3: 2b00: ddd3: 753f% 14 farebbe riferimento al controller della mia famiglia Realtek PCIe GBE. "GBE" si riferisce a Gigabit Ethernet.

Ora, ecco la parte difficile: se si desidera eseguire il ping di un indirizzo remoto, potrebbe essere necessario utilizzare l'indirizzo IPv6 del sistema remoto, ma l'identificatore di interfaccia del sistema locale. Quindi, per esempio, se sto usando Computer A e ho un indirizzo IPv6 locale di fe80 :: 1 collegato a Interface numero 14, e voglio ping Computer B e ha un indirizzo IPv6 locale di fe80 :: 2 collegato a la sua interfaccia numero 16, quindi questo è quello che userei:

ping fe80::2%14

Quindi il comando ping invierà il pacchetto ICMPv6 all'indirizzo IPv6 remoto (fd80 :: 2), che appartiene al computer remoto, e utilizzerà l'interfaccia con l'identificatore 14 per farlo. L'Interface Identifier 14 è un numero dal sistema che sto usando, non dal sistema remoto.

Ora, vediamo perché questo potrebbe essere necessario.

Se voglio eseguire il ping sull'indirizzo IPv6 di Google (che è 2607: f8b0: 400a: 802 :: 200e al momento in cui ho scritto questa risposta), la tabella di routing controllerà la scheda di rete che gestisce gli indirizzi che iniziano con 2607: f8b0: 400a: 802. La tabella di routing indicherà che nessuna delle mie schede di rete è connessa direttamente a una rete utilizzando gli indirizzi che iniziano con 2607: f8b0: 400a: 802, quindi il mio computer finirà per utilizzare un indirizzo "gateway". Se mi collegassi a un'altra rete che fa parte dell'organizzazione per cui lavoro, potrei avere uno speciale indirizzo "gateway" che indirizza il traffico verso una rete privata. In questo caso, non ho un gateway più specifico, quindi userò il "gateway predefinito" IPv6. È così che IPv6 funziona la maggior parte del tempo, ad eccezione degli indirizzi locali di collegamento. Questo è anche il modo in cui IPv4 ha funzionato la maggior parte del tempo. (Ho semplificato questo esempio assumendo una dimensione di subnet IPv6 di/64, dal momento che descrivere l'intero processo avrebbe reso questa descrizione ancora più lunga.)

Secondo RFC 4291 sezione 2.8 , ogni computer che utilizza IPv6 dovrebbe assegnare un indirizzo locale di collegamento a ogni interfaccia di rete. RFC 4291 sezione 2.5.6 mostra i bit con cui devono iniziare gli indirizzi locali, il che fa sì che gli indirizzi locali del collegamento inizino con "fe80: 0000: 0000: 0000:" (sebbene molti di questi zeri vengano compressi a un doppio colon). Il fatto che questi indirizzi inizino con "fe80:" è anche descritto da RFC 4291 sezione 2.4 .

Se si tenta di eseguire il ping su un sistema remoto (ad esempio, "2607: f8b0: 400a: 802"), il processo generale è di solito di capire una rete o sottorete di cui fa parte l'indirizzo, che viene eseguita osservando i bit all'inizio dell'indirizzo. Quindi, questi bit vengono utilizzati per determinare come indirizzare il traffico.

Tuttavia, tale processo non funziona per un indirizzo IPv6 di collegamento locale, poiché ogni singola interfaccia di rete (operativa, attiva) ha un indirizzo locale di collegamento che inizia con "fe80:" su una sottorete usando il prefisso di sottorete/dimensione di "/ 64" . Se si è su un laptop, è probabile che si sia verificato che sia la propria scheda Ethernet che la scheda Wi-Fi abbiano un tale indirizzo IPv6.

Ora, quando si invia il ping a fe80 :: 2, si desidera che il computer invii il pacchetto alla scheda di rete corretta. Se si dispone di una stampante collegata a una rete cablata, non si desidera inviare il traffico alla scheda Wi-Fi, utilizzando un percorso/percorso di rete che non provochi il traffico verso la stampante. E se stai cercando di comunicare con un dispositivo wireless usando la tua scheda Wi-Fi, non vuoi che il tuo traffico esca dalla scheda Ethernet.

La soluzione è di specificare quale dispositivo di rete si desidera utilizzare. Quindi, questo è lo scopo dell'identificatore di rete.

15
TOOGAM