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


125

Sto usando le .NET Frameworkclassi 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 comefe80::71a3:2b00:ddd3:753f%16

Notare% 16 alla fine?

Tuttavia, se WMIeseguo una query con lo stesso utilizzo , ottengo l'indirizzo come 'fe80 :: 71a3: 2b00: ddd3: 753f'

Quindi,% 16 ha qualche significato speciale?

Modificare:

Ho appena avuto qualche altra osservazione al riguardo. E si abbinano abbastanza bene con quello che ha detto Stephen Jennings 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 verificato tutte le proprietà disponibili per una scheda di rete utilizzando Wmi e ho scoperto che i numeri sono esattamente gli stessi della proprietà InterfaceIndex di ciascuna scheda di rete. Secondo MSDN , identifica in modo univoco ogni scheda di rete e questa proprietà è stata introdotta in Vista.

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

Oh, e tutte e tre queste schede di rete erano link locali. Confermato tramite ipconfig

Freddo. È stato interessante !!


2
Non avevo idea di cosa fosse neanche prima che tu me lo chiedessi. Ho imparato qualcosa di buono anche su IPv6 oggi (che secchioni siamo).
Stephen Jennings,

@Stephen, quindi hai già lavorato con ipv6? Sono stato sorpreso di averlo inchiodato in fretta. Ho cercato su Google per un bel po 'di tempo prima di pubblicare la domanda qui. Bel lavoro!
Amith George,

Cercare "percento dell'indirizzo ipv6" mi ha dato il nome di cui avevo bisogno, e da lì la ricerca e il tentativo di dare un senso alla confusa documentazione tecnica hanno richiesto più tempo. Ho capito cosa IPv6 sta cercando di realizzare, ma ci sono molti nuovi concetti che non ho avuto modo di cercare e comprendere. Questo era uno, e niente ti dà una comprensione migliore del cercare di spiegare a qualcun altro.
Stephen Jennings,

Una notazione alternativa potrebbe essere fe80:10(l' 0x0010essere 16). Lo uso nel mio browser quando lavoro con indirizzi IPv6 link-local, ma non sono sicuro al 100% che ciò sia conforme agli standard. (L'uso della percentuale negli URL è disordinato nei browser; in effetti non sono riuscito a farlo funzionare affatto.)
Arjan

Risposte:


134

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

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

  1. Indirizzabile a livello globale. Questo è un indirizzo IPv6 fornito dal tuo ISP. È disponibile per l'uso su Internet pubblico.

  2. Link-locale. Questo è simile alla gamma 169.254.XX. È un indirizzo che un computer si assegna per facilitare le comunicazioni locali. Questi indirizzi non vengono instradati su Internet pubblico perché non sono univoci a livello globale.

  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 indica che si tratta di un indirizzo di collegamento locale . Puoi anche dire che è link-local perché l'indirizzo inizia con fe80.

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

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


Grazie! Ho modificato la mia domanda per aggiungere le cose extra che mi è capitato di osservare mentre aspettavo una risposta. E quando sono venuto a pubblicarli, sono stato sorpreso di vedere la tua risposta che conferma le osservazioni :)
Amith George,

Bella risposta. Fammi vedere se l'ho capito appieno. Quindi un dispositivo con due schede NIC può connettersi a due router diversi e ottenere lo stesso indirizzo DHCP fe80::42. Inoltre, i router hanno lo stesso indirizzo fe80::1. Ora fe80::1%Xpuò essere usato per distinguere tra i router, ma fe80::42%Xè di minore utilità per il client, giusto?
user123444555621

2
@ Pumbaa80 Il client invierebbe messaggi per fe80::1%1raggiungere il router collegato a NIC # 1 e invierebbe messaggi fe80::1%2per raggiungere il router collegato a NIC # 2. A parte questo, gli indirizzi Link-local sono configurati automaticamente dal computer host, non tramite DHCP, quindi probabilmente non assegnerebbe alle sue due NIC lo stesso IP. Inoltre, tieni presente che gli indirizzi link-local non sono instradabili, quindi di solito non invierai messaggi a un router, ma invierai messaggi tra due host.
Stephen Jennings,

sperimentalmente, sembra che il finale %nnpuò essere omesso per almeno alcuni comandi, ad esempio ping, tracert.
matt wilkie,

Ottima risposta Solo menzionare che l'ID ambito è zero è speciale e sembra indicare che un algoritmo specifico dell'implementazione per scegliere un ID ambito dall'elenco di interfacce con quell'ambito di quell'IP.
Arran Cudbard-Bell,

21

Gli indirizzi IPv6 con il prefisso fe80 :: / 64 sono indirizzi link-local che vengono costruiti combinando quel prefisso con l'indirizzo hardware del dispositivo di rete, 71a3: 2b00: ddd3: 753f nel tuo esempio. (L'analogo in IPv4 è 169.254.0.0/16). Poiché il prefisso è lo stesso per tutti gli indirizzi link-local su una macchina, a volte potrebbe essere necessario conoscere il routing a cui fare riferimento. Ed è quello che specifica il numero dopo la percentuale, chiamato indice di zona. Le specifiche dipendono dal sistema operativo: su Windows, %16è l'interfaccia numero 16; su Linux ad esempio potresti vedere qualcosa del genere %eth0.

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


18

I caratteri dopo% (che sono i numeri nel tuo esempio) sono l'identificatore di interfaccia. Questi caratteri vengono utilizzati 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 utilizzando Microsoft Windows. Usa i numeri come identificatori di interfaccia.

Come punto di confronto, i sistemi simili a Unix possono usare le lettere dopo il segno%. per esempio:fe80::71a3:2b00:ddd3:753f%eth0

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

In Microsoft Windows, è possibile ottenere un elenco degli identificativi (numerici) dell'interfaccia utilizzando una delle righe di comando che controllano la tabella di routing. Preferisco " netstat -nr" poiché funziona anche su altri sistemi operativi, ma Microsoft Windows supporta anche " route print". L'output risultante, che viene segnalato, sarà probabilmente lungo uno schermo, quindi preparatevi a scorrere indietro, a meno che non vi dirigiate verso di più.

ad es. 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 si riferirebbe al mio controller di famiglia Realek 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 il Computer A e ho un indirizzo IPv6 locale di fe80 :: 1 collegato all'interfaccia numero 14, e voglio fare un ping al Computer B e ha un indirizzo IPv6 locale di fe80 :: 2 collegato a la sua interfaccia numero 16, quindi questo è quello che vorrei usare:

ping fe80::2%14

Quindi il pingcomando 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. Interface Identifier 14 è un numero del sistema che sto usando, non del sistema remoto.

Ora, vediamo perché questo potrebbe essere necessario.

Se voglio eseguire il ping dell'indirizzo IPv6 di Google (che è 2607: f8b0: 400a: 802 :: 200e al momento in cui ho scritto questa risposta), la tabella di routing controllerà quale scheda di rete 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 indirizzi che iniziano con 2607: f8b0: 400a: 802, quindi il mio computer finirà per utilizzare un indirizzo "gateway". Se mi connettessi a un'altra rete che fa parte dell'organizzazione per cui lavoro, potrei avere un indirizzo "gateway" speciale che instrada il traffico verso una rete privata. In questo caso, non ho un gateway più specifico, quindi userò il "gateway predefinito" IPv6. Ecco come funziona IPv6 per la maggior parte del tempo, ad eccezione degli indirizzi link-local. Questo è anche il modo in cui IPv4 ha funzionato la maggior parte delle volte.

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 link-local, che fanno sì che gli indirizzi link-local inizino con "fe80: 0000: 0000: 0000:" (anche se molti di questi zeri vengono compressi in due punti ). Il fatto che questi indirizzi inizino con "fe80:" è anche descritto da RFC 4291 sezione 2.4 .

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

Tuttavia, tale processo non funziona per un indirizzo di collegamento locale IPv6, poiché ogni singola interfaccia di rete (operativa, attiva) ha un indirizzo di collegamento locale che inizia con "fe80:" su una sottorete che utilizza il prefisso / dimensione della sottorete / / 64" . Se utilizzi un laptop, è probabile che sia la tua scheda Ethernet che l'adattatore Wi-Fi dispongano di un indirizzo IPv6.

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

La soluzione consiste nel specificare quale dispositivo di rete si desidera venga utilizzato dal traffico. Quindi, questo è lo scopo dell'identificatore di rete.


2
Ok, rileggendo la risposta di Peter Eisentraut , sembra che la sua sia tecnicamente corretta. Spero che i miei dettagli forniscano maggiore chiarezza. Non sono d'accordo con la risposta di Stephen Jennings , perché quella risposta fa sembrare che "ID ambito" identifichi "collegamento locale" come ambito. Tuttavia, due diverse interfacce di rete possono essere entrambe "link local" ma non useranno lo stesso "scope" (per gli esempi mostrati nel suo elenco numerato). Invece, dico che quei numeri identificano l '"interfaccia" di rete.
TOOGAM
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.