ทำไมถึงมีเครื่องหมายเปอร์เซ็นต์ '%' ในที่อยู่ IPv6


125

ฉันใช้.NET Frameworkคลาสเพื่อรับที่อยู่ IP สำหรับเครื่องของฉัน

Dns.GetHostAddresses(Dns.GetHostName())

ฉันมีอะแดปเตอร์ VirtualBox ซึ่งมีทั้งที่อยู่ IPv4 และ IPv6 การใช้รหัส. NET ฉันได้รับที่อยู่ IPv6 เป็นfe80::71a3:2b00:ddd3:753f%16

สังเกตุที่% 16 ในตอนท้าย?

อย่างไรก็ตามหากฉันใช้แบบสอบถามเดียวกันWMIฉันได้รับที่อยู่เป็น 'fe80 :: 71a3: 2b00: ddd3: 753f'

ดังนั้น% 16 มีความสำคัญเป็นพิเศษหรือไม่

แก้ไข:

ฉันเพิ่งสังเกตเพิ่มเติมเกี่ยวกับเรื่องนี้ และพวกเขาก็เข้ากันได้ดีกับสิ่งที่สตีเฟ่นเจนนิงส์พูดในคำตอบของเขา

ฉันติดตั้ง Vmware เพื่อดูที่อยู่ IPv6 ที่ออก ที่อยู่คือ: fe80 :: 3dd0: 7f8e: 57b7: 34d5% 19

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

เห็นได้ชัดว่าตัวเลขหลัง% ไม่ใช่การแสดงเลขฐานสิบหก ฉันตรวจสอบคุณสมบัติทั้งหมดที่มีสำหรับอะแดปเตอร์เครือข่ายโดยใช้ Wmi และพบว่าหมายเลขนั้นตรงกับคุณสมบัติ InterfaceIndex ของอะแดปเตอร์เครือข่ายแต่ละตัว ตามMSDNจะระบุอะแดปเตอร์เครือข่ายแต่ละตัวโดยไม่ซ้ำกันและคุณสมบัตินี้ถูกนำมาใช้ใน Vista

สิ่งที่ทำให้ฉันสับสนคือเหตุผลว่าทำไมคลาส IPAddress จะอนุญาตให้คุณสร้างที่อยู่ IP ในรูปแบบนั้นเว้นแต่ว่าถูกต้อง คำตอบนั้นมาจากสตีเฟ่น หมายเลขคือรหัสขอบเขต IPAddress มีนวกรรมิกที่ยอมรับที่อยู่และรหัสขอบเขต

โอ้และอะแดปเตอร์เครือข่ายทั้งสามนี้เป็นลิงค์ในเครื่อง ยืนยันผ่าน ipconfig

เย็น. นั่นเป็นเรื่องที่น่าสนใจ !!


2
ฉันไม่รู้ว่ามันเป็นอะไรก่อนที่คุณจะถาม ฉันได้เรียนรู้บางสิ่งบางอย่างที่เรียบร้อยเกี่ยวกับ IPv6 ในวันนี้เช่นกัน
สตีเฟ่นเจนนิงส์

@ สตีเฟ่นคุณเคยทำงานกับ ipv6 มาก่อนหรือไม่ ฉันประหลาดใจอย่างรวดเร็วคุณตอกมัน ฉันใช้ Google ซักพักซักพักก่อนโพสต์คำถามที่นี่ เยี่ยมมาก!
Amith George

การค้นหา "ที่อยู่ ipv6 เปอร์เซ็นต์" ทำให้ฉันมีชื่อที่ฉันต้องการและจากที่นั่นการค้นหาไปรอบ ๆ และพยายามทำความเข้าใจกับเอกสารทางเทคนิคที่สับสนใช้เวลามากที่สุด ฉันได้รับสิ่งที่ IPv6 พยายามทำ แต่มีแนวคิดใหม่มากมายที่ทำให้ฉันไม่ได้ทำการค้นคว้าและทำความเข้าใจ นี่คือสิ่งหนึ่งและไม่มีอะไรที่จะช่วยให้คุณเข้าใจดีไปกว่าการพยายามอธิบายให้คนอื่นฟัง
สตีเฟ่นเจนนิงส์

สัญกรณ์ทางเลือกอาจเป็นfe80:10( 0x0010กำลัง 16) ฉันใช้สิ่งนี้ในเบราว์เซอร์ของฉันเมื่อทำงานกับที่อยู่ IPv6 ของ link-local แต่ฉันไม่แน่ใจ 100% นี่เป็นไปตามมาตรฐาน (การใช้เปอร์เซ็นใน URL นั้นยุ่งในเบราว์เซอร์จริงๆแล้วฉันไม่สามารถใช้งานได้เลย)
Arjan

คำตอบ:


134

หมายเลขหลัง '%' คือ ID ขอบเขต

IPv6 กำหนดขอบเขตการเข้าถึงอย่างน้อยสามขอบเขตสำหรับที่อยู่:

  1. แอดเดรสทั่วโลก นี่คือที่อยู่ IPv6 ที่ ISP ของคุณมอบให้คุณ สามารถใช้งานได้บนอินเทอร์เน็ตสาธารณะ

  2. ลิงค์ท้องถิ่น สิ่งนี้คล้ายกับช่วง 169.254.XX เป็นที่อยู่ที่คอมพิวเตอร์กำหนดให้เพื่ออำนวยความสะดวกในการติดต่อสื่อสารในท้องถิ่น ที่อยู่เหล่านี้จะไม่ถูกส่งผ่านทางอินเทอร์เน็ตสาธารณะเพราะที่อยู่เหล่านี้ไม่เหมือนกันทั่วโลก

  3. โหนดท้องถิ่น นี่คือที่อยู่ที่ระบุส่วนต่อประสานในท้องถิ่นซึ่งคล้ายกับ 127.0.0.1 โดยทั่วไปนี่คือที่อยู่ :: 1

Microsoft ได้เผยแพร่บทความนี้อธิบายการกำหนดที่อยู่ IPv6ซึ่งเป็นบทความที่สับสนน้อยที่สุดที่ฉันพบ บทความแสดงให้เห็นว่าการปรากฏตัวของ ID ขอบเขตในที่อยู่ของคุณหมายความว่ามันเป็นที่อยู่ลิงค์ท้องถิ่น fe80นอกจากนี้คุณยังสามารถบอกได้ว่ามันคือการเชื่อมโยงท้องถิ่นเนื่องจากที่อยู่เริ่มต้นด้วย

ข้อมูลที่ชัดเจนและเข้าใจง่ายในหัวข้อนี้ดูเหมือนจะไม่ค่อยเกิดขึ้นดังนั้นฉันจึงนำส่วนที่เหลือนี้มารวมกันตามความเข้าใจที่ดีที่สุดของRFC 4007และข้อมูลอื่น ๆ

คอมพิวเตอร์สามารถมีที่อยู่ link-local หลายแห่งแต่ละแห่งมีขอบเขตที่แตกต่างกัน ID ขอบเขตบ่งชี้ขอบเขตที่อยู่สำหรับ ตัวอย่างเช่นลองนึกภาพสถานการณ์ของคอมพิวเตอร์ที่มี NIC สองเครื่องโดยแต่ละอันมีที่อยู่ link-local ในเครือข่ายที่แตกต่างกัน หากคุณพยายามส่งบางสิ่งไปยังที่อยู่อื่นที่เริ่มต้นด้วย fe80 คอมพิวเตอร์จะทราบได้อย่างไรว่า NIC จะส่งออกไปยังที่ใด ID ขอบเขตดูเหมือนจะเป็นคำตอบสำหรับสิ่งนี้


ขอบคุณ! แก้ไขคำถามของฉันเพื่อเพิ่มสิ่งพิเศษที่ฉันเกิดขึ้นเพื่อสังเกตในขณะที่รอคำตอบ และเมื่อผมมาโพสต์ให้ฉันรู้สึกประหลาดใจที่จะเห็นคำตอบของคุณยืนยันสังเกต :)
Amith จอร์จ

คำตอบที่ดี ให้ฉันดูว่าฉันเข้าใจอย่างเต็มที่หรือไม่ fe80::42ดังนั้นอุปกรณ์ที่มีสองนิคส์อาจเชื่อมต่อกับสองเราเตอร์ที่แตกต่างกันและได้รับมอบหมายอยู่ DHCP เดียวกันมาก fe80::1นอกจากนี้เราเตอร์มีที่อยู่เดียวกัน ตอนนี้fe80::1%Xอาจใช้เพื่อแยกความแตกต่างระหว่างเราเตอร์ แต่fe80::42%Xมีการใช้เล็กน้อยกับลูกค้าใช่ไหม?
user123444555621

2
@ Pumbaa80 ไคลเอ็นต์จะส่งข้อความไปfe80::1%1ถึงเราเตอร์ที่เชื่อมต่อกับ NIC # 1 และจะส่งข้อความfe80::1%2ไปถึงเราเตอร์ที่เชื่อมต่อกับ NIC # 2 นอกเหนือจากที่อยู่ Link-local จะถูกกำหนดค่าโดยอัตโนมัติโดยโฮสต์คอมพิวเตอร์ไม่ใช่ผ่าน DHCP ดังนั้นจึงอาจไม่ได้กำหนด NIC สองตัวให้เป็น IP เดียวกัน โปรดทราบว่าที่อยู่ link-local ไม่สามารถกำหนดเส้นทางได้ดังนั้นโดยปกติคุณจะไม่ส่งข้อความไปยังเราเตอร์คุณจะส่งข้อความระหว่างสองโฮสต์
Stephen Jennings

โดยการทดลองดูเหมือนว่าต่อท้าย%nnสามารถละเว้นสำหรับคำสั่งอย่างน้อยบางส่วนเช่น,ping tracert
แมตต์วิลคี

คำตอบที่ดีมาก เพียงกล่าวถึง ID ของขอบเขตเป็นศูนย์นั้นพิเศษและดูเหมือนว่าจะระบุว่าอัลกอริทึมเฉพาะการใช้งานเพื่อเลือก ID ขอบเขตจากรายการอินเตอร์เฟสที่มีขอบเขตนั้นของ IP นั้น
Arran Cudbard-Bell

21

ที่อยู่ IPv6 ที่มีคำนำหน้า fe80 :: / 64 เป็นที่อยู่ link-local ที่สร้างขึ้นโดยการรวมคำนำหน้านั้นกับที่อยู่ฮาร์ดแวร์ของอุปกรณ์เครือข่าย 71a3: 2b00: ddd3: 753f ในตัวอย่างของคุณ (อะนาล็อกใน IPv4 คือ 169.254.0.0/16) เนื่องจากคำนำหน้าเหมือนกันสำหรับที่อยู่ link-local ทั้งหมดบนเครื่องการกำหนดเส้นทางอาจจำเป็นต้องทราบว่าคุณหมายถึงอินเทอร์เฟซใด และนั่นคือจำนวนที่อยู่หลังเปอร์เซ็นต์ซึ่งเรียกว่าดัชนีโซน ข้อมูลเฉพาะขึ้นอยู่กับระบบปฏิบัติการ: บน Windows %16คือหมายเลขอินเตอร์เฟส 16; บน Linux %eth0ตัวอย่างเช่นคุณอาจเห็นบางสิ่งบางอย่างเช่น

เครื่องมือหรือ API บางอย่างจะพิจารณาดัชนีโซนนี้ไม่สำคัญหรือโดยนัยสำหรับวัตถุประสงค์ของพวกเขา ตัวอย่างเช่นบน Linux ifconfigเครื่องมือจะไม่แสดงเพราะเห็นได้ชัดว่าเป็นที่อยู่ของส่วนต่อประสานใด แต่โดยทั่วไปควรคำนึงถึง


18

อักขระหลัง% (ซึ่งเกิดขึ้นเป็นตัวเลขในตัวอย่างของคุณ) คือ Interface Identifier อักขระเหล่านั้นใช้เพื่อระบุ "อินเทอร์เฟซเครือข่าย" ซึ่งผู้คนมักเรียกว่า "การ์ดเครือข่าย" ตัวอย่างเช่นมันสามารถช่วยในการตรวจสอบว่าแพ็คเก็ตจะใช้การ์ดอีเธอร์เน็ตแบบมีสายหรืออะแดปเตอร์ไร้สาย Wi-Fi

ฉันเดาว่าคุณใช้ Microsoft Windows มันใช้ตัวเลขเป็นตัวระบุส่วนต่อประสาน

ในการเปรียบเทียบระบบที่คล้าย Unix อาจใช้ตัวอักษรหลังเครื่องหมาย% เช่น: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: 753f% 14 จะอ้างถึง Realtek PCIe GBE Family Controller ของฉัน "GBE" หมายถึง Gigabit Ethernet

ตอนนี้ต่อไปนี้เป็นส่วนที่ยุ่งยาก: หากคุณต้องการ ping ที่อยู่ระยะไกลคุณอาจต้องใช้ที่อยู่ IPv6 ของระบบระยะไกล แต่เป็น Interface Identifier ของระบบโลคัล ตัวอย่างเช่นถ้าฉันใช้คอมพิวเตอร์ A และฉันมีที่อยู่ IPv6 ท้องถิ่นของ fe80 :: 1 แนบกับหมายเลขอินเตอร์เฟส 14 และฉันต้องการ ping คอมพิวเตอร์ B และมีที่อยู่ IPv6 ท้องถิ่นของ fe80 :: 2 ที่เชื่อมต่อกับ หมายเลขอินเตอร์เฟสของ 16 แล้วนี่คือสิ่งที่ฉันจะใช้:

ping fe80::2%14

ดังนั้นpingคำสั่งจะส่งแพ็คเก็ต ICMPv6 ไปยังที่อยู่ IPv6 ระยะไกล (fd80 :: 2) ซึ่งเป็นของคอมพิวเตอร์ระยะไกลและจะใช้ส่วนต่อประสานกับตัวระบุ 14 เพื่อทำ Interface Identifier 14 เป็นตัวเลขจากระบบที่ฉันใช้ไม่ใช่ระบบระยะไกล

ทีนี้มาดูสาเหตุที่อาจจำเป็น

หากฉันต้องการ ping ที่อยู่ IPv6 ของ Google (ซึ่งคือ 2607: f8b0: 400a: 802 :: 200e ในขณะที่ฉันเขียนคำตอบนี้) ตารางการกำหนดเส้นทางจะตรวจสอบว่าการ์ดเครือข่ายจัดการที่อยู่ที่ขึ้นต้นด้วย 2607: f8b0: 400a: 802 ตารางเส้นทางจะระบุว่าไม่มีการ์ดเครือข่ายของฉันเชื่อมต่อโดยตรงกับเครือข่ายโดยใช้ที่อยู่ที่ขึ้นต้นด้วย 2607: f8b0: 400a: 802 ดังนั้นคอมพิวเตอร์ของฉันจะจบลงด้วยการใช้ที่อยู่ "เกตเวย์" หากฉันเชื่อมต่อกับเครือข่ายอื่นที่เป็นส่วนหนึ่งขององค์กรที่ฉันทำงานอยู่ฉันอาจมีที่อยู่ "เกตเวย์" พิเศษที่กำหนดเส้นทางการรับส่งข้อมูลไปยังเครือข่ายส่วนตัว ในกรณีนี้ฉันไม่มีเกตเวย์เฉพาะเจาะจงดังนั้นฉันจะใช้ IPv6 "เกตเวย์เริ่มต้น" นั่นคือวิธีที่ IPv6 ทำงานได้เกือบตลอดเวลายกเว้นที่อยู่ลิงก์ท้องถิ่น นี่เป็นวิธีที่ IPv4 ทำงานเกือบตลอดเวลา

ตามRFC 4291 ส่วน 2.8คอมพิวเตอร์ทุกเครื่องที่ใช้ IPv6 ควรกำหนดที่อยู่ link-local ให้กับทุกเครือข่ายอินเทอร์เฟซ RFC 4291 ส่วน 2.5.6แสดงบิตที่ link-local address ต้องขึ้นต้นด้วยซึ่งทำให้ link-local address เริ่มต้นด้วย "fe80: 0000: 0000: 0000: 0000" (แม้ว่าเลขศูนย์เหล่านั้นจะยุบลงในลำไส้ใหญ่) ) ความจริงที่ว่าที่อยู่เหล่านั้นเริ่มต้นด้วย "fe80:" นอกจากนี้ยังมีการอธิบายโดยRFC 4291 ส่วน 2.4

หากคุณพยายาม ping ระบบระยะไกล (เช่น "2607: f8b0: 400a: 802") กระบวนการทั่วไปมักจะคิดออกเครือข่ายหรือเครือข่ายย่อยที่อยู่เป็นส่วนหนึ่งของซึ่งจะทำโดยดูที่บิต ที่จุดเริ่มต้นของที่อยู่ จากนั้นบิตเหล่านั้นจะถูกใช้เพื่อกำหนดวิธีกำหนดเส้นทางการรับส่งข้อมูล

อย่างไรก็ตามกระบวนการนั้นไม่สามารถใช้ได้กับ IPv6 link-local address เนื่องจากทุก ๆ อินเตอร์เฟสเครือข่าย (ปฏิบัติงานใช้งานได้) จะมีที่อยู่ link-local เริ่มต้นด้วย "fe80:" บนซับเน็ตโดยใช้คำนำหน้าซับเน็ต / ขนาด "/ 64" หากคุณใช้แล็ปท็อปคุณจะพบว่าทั้งการ์ด Ethernet และอแด็ปเตอร์ Wi-Fi ของคุณคาดว่าจะมีที่อยู่ IPv6 เช่นนั้น

ตอนนี้เมื่อคุณส่ง ping ของคุณไปยัง fe80 :: 2 คุณต้องการให้คอมพิวเตอร์ของคุณส่งแพ็คเก็ตนั้นออกจากการ์ดเครือข่ายที่เหมาะสม หากคุณมีเครื่องพิมพ์ที่เชื่อมต่อกับเครือข่ายแบบใช้สายคุณไม่ต้องการส่งทราฟฟิกออกจากการ์ด Wi-Fi ของคุณโดยใช้เส้นทาง / เส้นทางเครือข่ายที่จะไม่ส่งผลให้ทราฟฟิกส่งไปยังเครื่องพิมพ์ และหากคุณพยายามสื่อสารกับอุปกรณ์ไร้สายโดยใช้การ์ด Wi-Fi คุณไม่ต้องการให้ทราฟฟิกของคุณออกการ์ดอีเทอร์เน็ต

วิธีแก้ไขคือให้คุณระบุอุปกรณ์เครือข่ายที่คุณต้องการใช้ทราฟฟิก ดังนั้นนั่นคือจุดประสงค์ของตัวระบุเครือข่าย


2
โอเคเมื่ออ่านคำตอบของ Peter Eisentrautอีกครั้งดูเหมือนว่าเขาจะถูกต้องทางเทคนิค หวังว่ารายละเอียดของฉันจะให้ความกระจ่างมากขึ้น ฉันไม่เห็นด้วยกับคำตอบของ Stephen Jenningsเพราะคำตอบนั้นทำให้ดูเหมือนว่า "scope ID" ระบุ "link local" เป็นขอบเขต อย่างไรก็ตามอินเทอร์เฟซเครือข่ายที่ต่างกันสองแบบสามารถเป็น "ลิงก์ภายใน" แต่จะไม่ใช้ "ขอบเขต" เดียวกัน (ตามตัวอย่างที่แสดงในรายการหมายเลขของเขา) แต่ฉันว่าตัวเลขเหล่านั้นระบุ "อินเตอร์เฟซ" ของเครือข่าย
TOOGAM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.