Tại sao có một dấu phần trăm '%' trong địa chỉ IPv6?


125

Tôi đang sử dụng các .NET Frameworklớp để lấy địa chỉ IP cho máy của mình.

Dns.GetHostAddresses(Dns.GetHostName())

Tôi có bộ điều hợp VirtualBox có cả địa chỉ IPv4 và IPv6. Sử dụng mã .NET Tôi nhận được địa chỉ IPv6 làfe80::71a3:2b00:ddd3:753f%16

Chú ý% 16 ở cuối?

Tuy nhiên, nếu tôi truy vấn tương tự bằng cách sử dụng WMI, tôi sẽ nhận được địa chỉ là 'fe80 :: 71a3: 2b00: ddd3: 753f'

Vậy,% 16 có ý nghĩa đặc biệt nào không?

Biên tập:

Tôi chỉ có một số quan sát thêm về điều này. Và họ rất hợp với những gì Stephen Jennings đã nói trong câu trả lời của mình.

Tôi đã cài đặt Vmware để xem địa chỉ IPv6 được phát hành. Các địa chỉ là: fe80 :: 3dd0: 7f8e: 57b7: 34d5% 19

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

Rõ ràng, các số sau% không phải là một số đại diện hex. Tôi đã kiểm tra tất cả các thuộc tính có sẵn cho bộ điều hợp mạng bằng Wmi và thấy rằng các số này hoàn toàn giống với thuộc tính Interface Index của mỗi bộ điều hợp mạng. Theo MSDN , nó xác định duy nhất từng bộ điều hợp mạng và thuộc tính này được giới thiệu trong Vista.

Điều vẫn làm tôi bối rối là tại sao lớp IPAddress cho phép bạn tạo một địa chỉ IP theo định dạng đó trừ khi nó hợp lệ. Câu trả lời được cung cấp bởi Stephen. Số là id phạm vi. IPAddress có một hàm tạo chấp nhận địa chỉ VÀ id phạm vi.

Ồ, và cả ba bộ điều hợp mạng này đều được liên kết cục bộ. Xác nhận nó qua ipconfig

Mát mẻ. Điều đó thật thú vị !!


2
Tôi không biết nó là gì trước khi bạn hỏi. Hôm nay tôi cũng đã học được một vài điều thú vị về IPv6 (chúng tôi là những người mọt sách nào).
Stephen Jennings

@Stephen, vậy bạn đã từng làm việc với ipv6 chưa? Tôi đã ngạc nhiên khi nhanh chóng đóng đinh nó. Tôi đã googled khá lâu trước khi đăng câu hỏi ở đây. Công việc tốt đẹp!
Amith George

Tìm kiếm "phần trăm địa chỉ ipv6" đã cho tôi tên tôi cần, và từ đó tìm kiếm xung quanh và cố gắng hiểu ý nghĩa của tài liệu kỹ thuật khó hiểu mất nhiều thời gian nhất. Tôi hiểu những gì IPv6 đang cố gắng thực hiện, nhưng có rất nhiều khái niệm mới mà tôi không có được để nghiên cứu và tìm hiểu. Đây là một, và không có gì cho bạn hiểu rõ hơn là cố gắng giải thích với người khác.
Stephen Jennings

Một ký hiệu thay thế có thể là fe80:10(bản 0x001016). Tôi sử dụng nó trong trình duyệt của mình khi làm việc với các địa chỉ IPv6 liên kết cục bộ, nhưng tôi không chắc chắn 100% đây là theo tiêu chuẩn. (Sử dụng phần trăm trong URL là lộn xộn trong các trình duyệt, trong thực tế tôi không thể nhận được rằng để làm việc ở tất cả.)
Arjan

Câu trả lời:


134

Số sau '%' là ID phạm vi.

IPv6 xác định ít nhất ba phạm vi có thể truy cập cho các địa chỉ:

  1. Địa chỉ toàn cầu. Đây là một địa chỉ IPv6 được cung cấp cho bạn bởi ISP của bạn. Nó có sẵn để sử dụng trên Internet công cộng.

  2. Liên kết cục bộ. Điều này tương tự với phạm vi 169.254.XX. Đó là một địa chỉ mà một máy tính tự gán để tạo điều kiện cho giao tiếp địa phương. Các địa chỉ này không được định tuyến trên Internet công cộng vì chúng không phải là duy nhất trên toàn cầu.

  3. Nút-cục bộ. Đây là một địa chỉ xác định giao diện cục bộ, tương tự như 127.0.0.1. Về cơ bản, đây là địa chỉ :: 1.

Microsoft đã xuất bản bài viết này mô tả địa chỉ IPv6 , đây là bài viết ít gây nhầm lẫn nhất mà tôi tìm thấy. Bài viết chỉ ra rằng sự hiện diện của ID phạm vi trong địa chỉ của bạn có nghĩa là địa chỉ liên kết cục bộ . Bạn cũng có thể nói nó là link-local vì địa chỉ bắt đầu bằng fe80.

Thông tin rõ ràng, dễ hiểu về chủ đề này dường như rất hiếm, vì vậy tôi kết hợp phần còn lại của nó dựa trên sự hiểu biết tốt nhất của tôi về RFC 4007 và các thông tin khác ngoài kia.

Một máy tính có thể có nhiều địa chỉ liên kết cục bộ, mỗi địa chỉ có một phạm vi khác nhau. ID phạm vi cho biết phạm vi địa chỉ dành cho. Ví dụ, hãy tưởng tượng kịch bản của một máy tính có hai NIC, mỗi máy có một địa chỉ liên kết cục bộ trên các mạng khác nhau. Nếu bạn cố gắng gửi một cái gì đó đến một địa chỉ khác bắt đầu bằng fe80, làm thế nào máy tính sẽ biết được gửi NIC nào? ID phạm vi dường như là giải pháp cho việc này.


Cảm ơn! Chỉnh sửa câu hỏi của tôi để thêm các nội dung bổ sung mà tôi tình cờ quan sát trong khi chờ câu trả lời. Và khi tôi đến để đăng chúng, tôi rất ngạc nhiên khi thấy câu trả lời của bạn xác nhận các quan sát :)
Amith George

Câu trả lời tốt đẹp. Hãy để tôi xem nếu tôi hoàn toàn hiểu điều đó. Vì vậy, một thiết bị có hai NIC có thể kết nối với hai bộ định tuyến khác nhau và được gán cùng một địa chỉ DHCP fe80::42. Ngoài ra, các bộ định tuyến có cùng địa chỉ fe80::1. Bây giờ fe80::1%Xcó thể được sử dụng để phân biệt giữa các bộ định tuyến, nhưng fe80::42%Xđược sử dụng nhỏ cho máy khách, phải không?
dùng123444555621

2
@ Pumbaa80 Máy khách sẽ gửi tin nhắn đến fe80::1%1bộ định tuyến được kết nối với NIC # 1 và nó sẽ gửi tin nhắn đến fe80::1%2bộ định tuyến được kết nối với NIC # 2. Bên cạnh đó, các địa chỉ Liên kết cục bộ được cấu hình tự động bởi máy tính chủ, không thông qua DHCP, do đó có thể sẽ không gán hai NIC của nó cho cùng một IP. Ngoài ra, hãy nhớ rằng các địa chỉ liên kết cục bộ không thể định tuyến được, vì vậy thông thường bạn sẽ không gửi tin nhắn đến bộ định tuyến, bạn sẽ gửi tin nhắn giữa hai máy chủ.
Stephen Jennings

bằng cách thử nghiệm, có vẻ như các dấu %nncó thể được bỏ qua ít nhất một số lệnh, ví dụ như ping, tracert.
matt wilkie

Câu trả lời rất hay. Chỉ cần đề cập rằng ID phạm vi là 0 là đặc biệt và dường như chỉ ra rằng một thuật toán cụ thể triển khai để chọn ID phạm vi từ danh sách các giao diện có phạm vi của IP đó.
Arran Cudbard-Bell 7/11/2015

21

Các địa chỉ IPv6 có tiền tố fe80 :: / 64 là các địa chỉ liên kết cục bộ được xây dựng bằng cách kết hợp tiền tố đó với địa chỉ phần cứng của thiết bị mạng, 71a3: 2b00: ddd3: 753f trong ví dụ của bạn. (Tương tự trong IPv4 là 169.254.0.0/16.) Vì tiền tố giống nhau cho tất cả các địa chỉ liên kết cục bộ trên máy, việc định tuyến đôi khi có thể cần biết bạn đang đề cập đến giao diện nào. Và đó là những gì con số sau phần trăm, được gọi là chỉ số vùng, chỉ định. Cụ thể phụ thuộc vào hệ điều hành: Trên Windows, %16là giao diện số 16; trên Linux chẳng hạn, bạn có thể thấy một cái gì đó như %eth0.

Một số công cụ hoặc API sẽ coi chỉ số vùng này không quan trọng hoặc tiềm ẩn cho mục đích của chúng. Ví dụ, trên Linux, ifconfigcông cụ không hiển thị vì rõ ràng địa chỉ thuộc về giao diện nào. Nhưng nói chung nó nên được tính đến.


18

Các ký tự sau% (có thể là số trong ví dụ của bạn) là Mã định danh giao diện. Những ký tự này được sử dụng để xác định "giao diện mạng" mà mọi người thường gọi là "card mạng". Chẳng hạn, nó có thể giúp xác định xem một gói sẽ sử dụng thẻ Ethernet có dây hay bộ điều hợp Wi-Fi không dây.

Tôi đoán rằng bạn đang sử dụng Microsoft Windows. Nó sử dụng số làm định danh giao diện.

Để so sánh, các hệ thống giống Unix có thể sử dụng các chữ cái sau dấu%. ví dụ:fe80::71a3:2b00:ddd3:753f%eth0

Trong trường hợp đó, số nhận dạng Giao diện eth0, khớp với tên của card mạng.

Trong Microsoft Windows, bạn có thể nhận danh sách các số nhận dạng giao diện (số) bằng cách sử dụng một trong các dòng lệnh kiểm tra bảng định tuyến. Tôi thích " netstat -nr" vì nó cũng hoạt động trên các hệ điều hành khác, nhưng Microsoft Windows cũng hỗ trợ " route print". Đầu ra kết quả, được báo cáo, có thể sẽ dài trên một màn hình, vì vậy hãy chuẩn bị cuộn lại, trừ khi bạn chuyển sang nhiều hơn.

ví dụ: trên hệ thống của tôi:

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

Trong trường hợp này, một địa chỉ như fe80 :: 71a3: 2b00: ddd3: 753f% 14 sẽ đề cập đến Bộ điều khiển gia đình Realtek PCIe GBE của tôi. "GBE" dùng để chỉ Gigabit Ethernet.

Bây giờ, đây là phần khó khăn: Nếu bạn muốn ping một địa chỉ từ xa, bạn có thể cần sử dụng địa chỉ IPv6 của hệ thống từ xa, nhưng Định danh giao diện của hệ thống cục bộ. Vì vậy, ví dụ, nếu tôi đang sử dụng Máy tính A và tôi có địa chỉ IPv6 cục bộ là fe80 :: 1 được đính kèm với Giao diện số 14 và tôi muốn ping Máy tính B và nó có địa chỉ IPv6 cục bộ là fe80 :: 2 được đính kèm Giao diện số 16 của nó, đây là những gì tôi sẽ sử dụng:

ping fe80::2%14

Vì vậy, pinglệnh sẽ gửi gói ICMPv6 đến địa chỉ IPv6 từ xa (fd80 :: 2), thuộc về máy tính từ xa và sẽ sử dụng Giao diện với Mã định danh 14 để thực hiện. Mã định danh giao diện 14 là một số trong hệ thống tôi đang sử dụng, không phải hệ thống từ xa.

Bây giờ, hãy xem tại sao điều này có thể cần thiết.

Nếu tôi muốn ping địa chỉ IPv6 của Google (đó là 2607: f8b0: 400a: 802 :: 200e tại thời điểm tôi viết câu trả lời này), thì bảng định tuyến sẽ kiểm tra địa chỉ thẻ mạng nào xử lý các địa chỉ bắt đầu bằng 2607: f8b0: 400a: 802. Bảng định tuyến sẽ chỉ ra rằng không có thẻ mạng nào của tôi được kết nối trực tiếp với mạng bằng các địa chỉ bắt đầu bằng 2607: f8b0: 400a: 802, vì vậy máy tính của tôi sẽ kết thúc bằng địa chỉ "cổng". Nếu tôi đang kết nối với một mạng khác là một phần của tổ chức tôi đang làm việc, tôi có thể có một địa chỉ "cổng" đặc biệt định tuyến lưu lượng truy cập đến một mạng riêng. Trong trường hợp này, tôi không có cổng cụ thể hơn, vì vậy tôi sẽ sử dụng "cổng mặc định" IPv6. Đó là cách IPv6 hoạt động hầu hết thời gian, ngoại trừ các địa chỉ liên kết cục bộ. Đây cũng là cách mà IPv4 hoạt động hầu hết thời gian.

Theo RFC 4291, phần 2.8 , mọi máy tính sử dụng IPv6 nên gán địa chỉ liên kết cục bộ cho mọi giao diện mạng. RFC 4291, phần 2.5.6 cho thấy các bit mà các địa chỉ liên kết cục bộ phải bắt đầu bằng, điều này khiến các địa chỉ liên kết cục bộ bắt đầu bằng "fe80: 0000: 0000: 0000:" (mặc dù nhiều số không trong số đó bị thu gọn thành dấu hai chấm ). Thực tế là những địa chỉ đó bắt đầu bằng "fe80:" cũng được mô tả bởi RFC 4291 phần 2.4 .

Nếu bạn cố gắng ping một hệ thống từ xa (ví dụ: "2607: f8b0: 400a: 802"), quy trình chung thường là tìm ra một mạng hoặc mạng con mà địa chỉ là một phần của, được thực hiện bằng cách xem các bit ở đầu địa chỉ Sau đó, các bit đó được sử dụng để xác định cách định tuyến lưu lượng.

Tuy nhiên, quá trình đó không hoạt động đối với địa chỉ liên kết cục bộ IPv6, bởi vì mọi giao diện mạng (hoạt động, hoạt động) đều có một địa chỉ liên kết cục bộ bắt đầu bằng "fe80:" trên mạng con sử dụng tiền tố / kích thước của mạng con "/ 64 ". Nếu bạn đang sử dụng máy tính xách tay, bạn có thể thấy rằng cả thẻ Ethernet và bộ điều hợp Wi-Fi của bạn đều có một địa chỉ IPv6 như vậy.

Bây giờ, khi bạn gửi ping của mình tới fe80 :: 2, bạn muốn máy tính của mình gửi gói tin đó ra đúng card mạng. Nếu bạn có một máy in được kết nối với mạng có dây, bạn không muốn gửi lưu lượng ra khỏi thẻ Wi-Fi của mình, sử dụng đường dẫn / tuyến mạng sẽ không dẫn đến lưu lượng truy cập đến máy in. Và nếu bạn đang cố gắng liên lạc với thiết bị không dây bằng thẻ Wi-Fi của mình, bạn không muốn lưu lượng truy cập của mình đi ra ngoài thẻ Ethernet.

Giải pháp là yêu cầu bạn chỉ định thiết bị mạng nào bạn muốn lưu lượng sử dụng. Vì vậy, đó là mục đích của định danh mạng.


2
Được rồi, khi đọc lại câu trả lời của Peter Eisentraut , có vẻ như câu trả lời của ông là đúng về mặt kỹ thuật. Hy vọng chi tiết của tôi cung cấp một số rõ ràng hơn. Tôi không đồng ý với câu trả lời của Stephen Jennings , vì câu trả lời đó làm cho nó trông giống như "ID phạm vi" xác định "liên kết cục bộ" là phạm vi. Tuy nhiên, hai giao diện mạng khác nhau đều có thể là "liên kết cục bộ" nhưng chúng sẽ không sử dụng cùng một "phạm vi" (theo các ví dụ được hiển thị trong danh sách được đánh số của anh ấy). Thay vào đó, tôi nói những con số đó xác định "giao diện" mạng.
TUYỆT VỜI
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.