IPv6 주소에 퍼센트 부호 '%'가있는 이유는 무엇입니까?


125

.NET Framework클래스를 사용하여 내 컴퓨터의 IP 주소를 가져옵니다.

Dns.GetHostAddresses(Dns.GetHostName())

IPv4 및 IPv6 주소를 모두 가진 VirtualBox 어댑터가 있습니다. .NET 코드를 사용하여 IPv6 주소를 다음과 같이 얻습니다.fe80::71a3:2b00:ddd3:753f%16

마지막에 % 16을 보시겠습니까?

WMI그러나을 사용하여 동일한 쿼리 를 수행하면 주소가 'fe80 :: 71a3 : 2b00 : ddd3 : 753f'로 표시됩니다.

그렇다면 % 16에 특별한 의미가 있습니까?

편집하다:

방금 이것에 대해 더 많은 관찰을했습니다. 그리고 그들은 Stephen Jennings가 그의 답변에서 말한 것과 아주 잘 어울립니다.

Vmware를 설치하여 발행 한 IPv6 주소를 확인했습니다. 주소는 : fe80 :: 3dd0 : 7f8e : 57b7 : 34d5 % 19

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

분명히 % 다음의 숫자는 16 진 표현이 아닙니다. Wmi를 사용하여 네트워크 어댑터에 사용할 수있는 모든 속성을 확인한 결과 각 네트워크 어댑터의 InterfaceIndex 속성과 숫자가 정확히 동일합니다. MSDN에 따라 각 네트워크 어댑터를 고유하게 식별하며이 속성은 Vista에 도입되었습니다.

여전히 나를 혼란스럽게 한 이유는 IPAddress 클래스를 사용하여 IP 주소가 유효하지 않은 경우 해당 형식으로 IP 주소를 만들 수 있었던 이유입니다. 답은 Stephen이 제공했습니다. 숫자는 범위 ID입니다. IPAddress에는 주소와 범위 ID를 허용하는 생성자가 있습니다.

아,이 세 가지 네트워크 어댑터는 모두 로컬 링크입니다. ipconfig를 통해 확인

시원한. 그것은 흥미 있었다!!


2
당신이 요청하기 전에 그것이 무엇인지 전혀 몰랐습니다. 나는 오늘 IPv6에 대해 깔끔한 것을 배웠다.
Stephen Jennings

@Stephen, 전에 ipv6로 작업 한 적이 있습니까? 나는 당신이 그것을 못 박았을 때 즉시 놀랐습니다. 여기에 질문을 게시하기 전에 꽤 오랫동안 구글을 검색했습니다. 잘 했어!
Amith George

"ipv6 address percent"를 검색하면 필자가 필요로하는 이름이 생겼으며, 거기에서 검색하고 혼란스러운 기술 문서를 이해하는 데 가장 많은 시간이 걸렸습니다. IPv6이 달성하려는 것을 얻었지만 연구와 이해에 대해 다루지 않은 새로운 개념이 많이 있습니다. 이것은 하나였으며 다른 사람에게 설명하는 것보다 더 나은 이해를 제공하는 것은 없습니다.
Stephen Jennings

다른 표기법은 fe80:10( 0x001016 살)입니다. 링크 로컬 IPv6 주소로 작업 할 때 브라우저에서이를 사용 하지만 이것이 표준에 따르는지는 100 % 확실하지 않습니다. (URL에서 백분율을 사용하는 것은 브라우저에서 지저분합니다. 실제로는 전혀 작동하지 않습니다.)
Arjan

답변:


134

'%'뒤의 숫자는 범위 ID입니다.

IPv6은 주소에 대해 최소한 세 가지 접근성 범위를 정의합니다.

  1. 전 세계적으로 다룰 수 있습니다. 이것은 ISP가 제공 한 IPv6 주소입니다. 공용 인터넷에서 사용할 수 있습니다.

  2. 로컬 링크. 이것은 169.254.XX 범위와 유사합니다. 로컬 통신을 용이하게하기 위해 컴퓨터가 할당하는 주소입니다. 이 주소는 전 세계적으로 고유하지 않기 때문에 공용 인터넷에서 라우팅되지 않습니다.

  3. 노드 로컬. 이것은 127.0.0.1과 유사한 로컬 인터페이스를 식별하는 주소입니다. 기본적으로이 주소는 :: 1입니다.

Microsoft는 IPv6 주소 지정에 대해 설명하는이 기사를 게시했습니다 . 이 기사는 주소에 범위 ID가 있으면 링크 로컬 주소 임을 의미합니다 . 주소가로 시작하기 때문에 링크 로컬임을 알 수 있습니다 fe80.

이 주제에 대한 명확하고 이해하기 쉬운 정보는 드문 것 같으므로 RFC 4007 에 대한 나의 이해 와 다른 정보를 바탕으로 나머지 정보를 정리하고 있습니다.

컴퓨터에는 각각 다른 범위를 가진 여러 개의 링크 로컬 주소가있을 수 있습니다. 범위 ID는 주소의 범위를 나타냅니다. 예를 들어, 두 개의 NIC가 있고 각각 다른 네트워크에 링크 로컬 주소가있는 컴퓨터의 시나리오를 상상해보십시오. fe80으로 시작하는 다른 주소로 무언가를 보내려고하면 컴퓨터에서 보낼 NIC를 어떻게 알 수 있습니까? 범위 ID가 이에 대한 해결책으로 보입니다.


감사! 답변을 기다리는 동안 관찰 한 추가 항목을 추가하도록 내 질문을 편집했습니다. 그리고 내가 그들을 게시 할 때, 나는 당신의 대답이 관찰을 확인하는 것을보고 놀랐습니다 :)
Amith George

좋은 대답입니다. 내가 완전히 이해했는지 보자. 따라서 두 개의 NIC가있는 장치는 두 개의 다른 라우터에 연결될 수 있으며 동일한 DHCP 주소가 할당 될 수 있습니다 fe80::42. 또한 라우터의 주소는 동일합니다 fe80::1. 이제는 fe80::1%X라우터를 구별하는 데 사용될 수 있지만 fe80::42%X클라이언트는 거의 사용하지 않습니까?
user123444555621

2
@ Pumbaa80 클라이언트는 fe80::1%1NIC # 1에 fe80::1%2연결된 라우터에 도달 하기 위해 메시지를 보내고 NIC # 2에 연결된 라우터에 메시지를 보냅니다 . 또한 로컬 링크 주소는 DHCP가 아닌 호스트 컴퓨터에 의해 자동으로 구성되므로 두 NIC에 동일한 IP를 할당하지 않을 수 있습니다. 또한 링크 로컬 주소는 라우팅 할 수 없으므로 일반적으로 라우터로 메시지를 보내지 않고 두 호스트간에 메시지를 보내 게됩니다.
Stephen Jennings

실험에 의해, %nn적어도 일부 명령, 예를 들어 ping, 후행 은 생략 될 수있는 것으로 보인다 tracert.
matt wilkie 5

아주 좋은 대답입니다. 범위 ID가 0이라는 것은 말할 것도없고, 해당 IP의 해당 범위와 인터페이스 목록에서 범위 ID를 선택하는 구현 특정 알고리즘을 나타내는 것으로 보입니다.
Arran Cudbard-Bell

21

접두사가 fe80 :: / 64 인 IPv6 주소는 해당 접두어를 네트워크 장치의 하드웨어 주소 71a3 : 2b00 : ddd3 : 753f와 결합하여 구성되는 링크 로컬 주소입니다. (IPv4의 아날로그는 169.254.0.0/16입니다.) 접두어는 시스템의 모든 링크 로컬 주소에 대해 동일하기 때문에 라우팅에서 참조하는 인터페이스를 알아야 할 수도 있습니다. 이것이 바로 영역 인덱스라고하는 퍼센트 뒤의 숫자가 지정하는 것입니다. 세부 사항은 운영 체제에 따라 다릅니다. Windows의 경우 %16인터페이스 번호는 16입니다. 예를 들어 Linux에서는 다음과 같은 것을 볼 수 있습니다 %eth0.

일부 도구 또는 API는이 영역 인덱스를 중요하지 않거나 목적에 따라 암시합니다. 예를 들어, Linux에서는 ifconfig주소가 속하는 인터페이스가 분명하기 때문에 도구에 표시되지 않습니다. 그러나 일반적으로 고려해야합니다.


18

% 뒤의 문자 (이 예에서는 숫자 임)는 인터페이스 식별자입니다. 이러한 문자는 사람들이 종종 "네트워크 카드"라고 부르는 "네트워크 인터페이스"를 식별하는 데 사용됩니다. 예를 들어, 패킷이 유선 이더넷 카드를 사용할지 무선 Wi-Fi 어댑터를 사용할지를 결정하는 데 도움이 될 수 있습니다.

Microsoft Windows를 사용하고 있다고 생각합니다. 인터페이스 식별자로 숫자를 사용합니다.

비교하자면, 유닉스 계열 시스템은 % 기호 뒤에 문자를 사용할 수 있습니다. 예 :fe80::71a3:2b00:ddd3:753f%eth0

이 경우 인터페이스 식별자 eth0는 네트워크 카드 이름과 일치합니다.

Microsoft Windows에서는 라우팅 테이블을 확인하는 명령 줄 중 하나를 사용하여 (숫자) 인터페이스 식별자 목록을 얻을 수 있습니다. netstat -nr다른 운영 체제에서도 작동하기 때문에 " "를 선호 하지만 Microsoft Windows에서도 " route print"를 지원합니다 . 보고되는 결과 출력은 화면이 길어질 수 있으므로 더 많이 파이프하지 않으면 뒤로 스크롤 할 수 있도록 준비하십시오.

예를 들어, 내 시스템에서 :

=========================================================================== 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 ===========================================================================

이 경우 fe80 :: 71a3 : 2b00 : ddd3 : 753ff14와 같은 주소는 내 Realtek PCIe GBE 제품군 컨트롤러를 나타냅니다. "GBE"는 기가비트 이더넷을 나타냅니다.

원격 주소를 핑하려면 원격 시스템의 IPv6 주소를 사용해야하지만 로컬 시스템의 인터페이스 식별자를 사용해야합니다. 예를 들어 컴퓨터 A를 사용하고 있고 인터페이스 번호 14에 로컬 IPv6 주소 fe80 :: 1이 있고 컴퓨터 B를 핑하고 로컬 IPv6 주소가 fe80 :: 2 인 경우 인터페이스 번호가 16이면 다음과 같이 사용합니다.

ping fe80::2%14

따라서이 ping명령은 ICMPv6 패킷을 원격 컴퓨터에 속하는 원격 IPv6 주소 (fd80 :: 2)로 보내고 식별자 14와의 인터페이스를 사용하여이를 수행합니다. 인터페이스 식별자 14는 원격 시스템이 아니라 사용중인 시스템의 번호입니다.

이제 이것이 왜 필요한지 살펴 보겠습니다.

Google의 IPv6 주소 (이 답변을 작성한 시점에 2607 : f8b0 : 400a : 802 :: 200e)를 핑하려면 라우팅 테이블에서 2607 : f8b0 : 400a로 시작하는 주소를 처리하는 네트워크 카드를 확인합니다. 802. 라우팅 테이블은 2607 : f8b0 : 400a : 802로 시작하는 주소를 사용하여 네트워크에 직접 연결된 네트워크 카드가 없음을 나타내므로 컴퓨터는 "게이트웨이"주소를 사용하게됩니다. 작업중인 조직의 일부인 다른 네트워크에 연결하는 경우 트래픽을 개인 네트워크로 라우팅하는 특수한 "게이트웨이"주소가있을 수 있습니다. 이 경우 더 구체적인 게이트웨이가 없으므로 IPv6 "기본 게이트웨이"를 사용합니다. 링크 로컬 주소를 제외하고 IPv6가 대부분 작동하는 방식입니다. 이것은 또한 IPv4가 대부분의 시간에 작동하는 방식입니다.

RFC 4291 섹션 2.8 에 따르면 IPv6을 사용하는 모든 컴퓨터는 모든 네트워크 인터페이스에 링크 로컬 주소를 할당해야합니다. RFC 4291 섹션 2.5.6 은 링크 로컬 주소로 시작해야하는 비트를 보여줍니다. 이로 인해 링크 로컬 주소가 "fe80 : 0000 : 0000 : 0000 :"으로 시작합니다 (많은 0은 이중 콜론으로 축소되지만) ). 이러한 주소가 "fe80 :"으로 시작한다는 사실은 RFC 4291 섹션 2.4에 설명되어 있습니다.

원격 시스템을 핑 (예 : "2607 : f8b0 : 400a : 802")하려는 경우 일반적인 프로세스는 일반적으로 주소가 속하는 네트워크 또는 서브넷을 파악하는 것입니다. 주소의 시작 부분에. 그런 다음 해당 비트는 트래픽 라우팅 방법을 결정하는 데 사용됩니다.

그러나 모든 단일 (작동, 활성) 네트워크 인터페이스에는 서브넷 접두사 / 크기 "/ 64 ". 랩톱을 사용하는 경우 이더넷 카드와 Wi-Fi 어댑터 모두에 이러한 IPv6 주소가 있어야합니다.

이제 ping을 fe80 :: 2로 보내면 컴퓨터에서 해당 네트워크 카드로 해당 패킷을 보내려고합니다. 유선 네트워크에 연결된 프린터가있는 경우 트래픽이 프린터로 전달되지 않는 네트워크 경로 / 경로를 사용하여 Wi-Fi 카드로 트래픽을 전송하고 싶지 않습니다. Wi-Fi 카드를 사용하여 무선 장치와 통신하려는 경우 트래픽이 이더넷 카드로 나가는 것을 원하지 않습니다.

해결책은 트래픽을 사용할 네트워크 장치를 지정하는 것입니다. 이것이 네트워크 식별자의 목적입니다.


2
좋아, Peter Eisentraut의 답변 을 다시 읽으면 기술적으로 올바른 것 같습니다. 내 세부 사항이 더 명확 해지기를 바랍니다. Stephen Jennings의 답변에 동의하지 않습니다. 그 답변이 "범위 ID"가 "링크 로컬"을 범위로 식별하는 것처럼 보이기 때문입니다. 그러나 두 개의 서로 다른 네트워크 인터페이스는 모두 "로컬 링크"일 수 있지만 동일한 "범위"를 사용하지는 않습니다 (번호 목록에 표시된 예에 따라). 대신, 그 숫자는 네트워크 "인터페이스"를 식별한다고 말합니다.
TOOGAM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.