2011-02-04 30 views
10

Để giải trí, tôi muốn hiểu rõ hơn về các khối xây dựng hoặc các phần tử nằm trong địa chỉ IPv6.Hướng dẫn dứt khoát để hiểu cách xây dựng địa chỉ IPv6

Dưới đây là những điều cơ bản, từ hiểu biết của tôi:

  • địa chỉ IPv6 có 128 bit dài (viết như 8 khối, mỗi với 16 bit)
  • Mỗi khối được mã hóa như chữ số hex từ 0 đến 0xffff . Các số 0 có thể bị bỏ qua.
  • Người ta có thể nối thêm địa chỉ IPv4 có dấu chấm bốn chấm và nó sẽ chiếm 32 bit thấp hơn của địa chỉ IPv6. 1: 2: 3: 4: 5: 6: 200.201.202.203. (Các quy tắc cho IPv4 như mong đợi.)
  • Biểu diễn IPv4 chỉ có thể xuất hiện ở cuối.
  • Có thể sử dụng cú pháp dấu hai chấm để biểu diễn một hoặc nhiều khối bằng số không. 1: 2 :: 7: 8 tương đương với 1: 2: 0: 0: 0: 0: 7: 8.
  • Mỗi địa chỉ IPv6 chỉ có thể có một dấu hai chấm bên trong nó, nếu không nó sai cú pháp.
  • Dấu hai chấm có thể xuất hiện ở đầu, giữa hoặc cuối của ip6, nhưng không nằm trong địa chỉ IPv4 rải rác-quad.

Tất cả các điểm trên có chính xác không?

Vui lòng không cho tôi biết để đọc RFC. Có một vài vấn đề về vấn đề này, và không có gì thực sự đi kèm với một vài ví dụ đơn giản để mô tả các cơ chế mã hóa khác nhau. Tôi chắc rằng nhiều người sẽ đánh giá cao một danh sách đơn giản với các ví dụ.

công cụ kiểm tra trực tuyến Các công cụ trực tuyến gần nhất để giúp là http://www.dominicsayers.com/source/beta/is_email/test/ nhưng các thông điệp khó hiểu và nó không thực sự nói bằng tiếng Anh đơn giản những gì là đúng và sai và tại sao. Nó cũng thực sự được xây dựng cho các email mà tất nhiên có thể chứa địa chỉ IPv6, do đó, nó không chính xác lý tưởng.

+0

Các liên kết người dominicsayers đến chương trình is_email/test bị hỏng. –

+0

Trong địa chỉ IPv4, bạn có thể bỏ qua giữa số không-quad. Ví dụ: 10.0.0.248 có thể được viết 10.248. Tôi không chắc liệu bạn có thể làm điều đó ở cuối đuôi của địa chỉ IPv6 hay không, như 1: 2: 3: 4: 5: 6: 10.248. –

Trả lời

7

Nói chung, có, điểm của bạn là chính xác.

Bạn có chắc là bạn đã đọc RFC không? RFC 3513, section 2.2 có chính xác những gì bạn đang yêu cầu. Nó được viết rất tốt, cho một RFC. =) Tôi không thể không chỉ ra điều này vì nó có thể rất hữu ích cho những người tương lai đọc câu hỏi này.

+0

Tôi hy vọng tôi đọc RFC chính xác, vì có một số ít có liên quan. 2.2 không bao gồm một số mẫu nhưng nó không bao gồm bất kỳ ví dụ về dễ mắc lỗi ... Ví dụ nó không bao gồm một ip6 với hai trống :: khối với một lưu ý lý do tại sao điều này là sai ... –

+0

@mP, Vâng, nó nói 'The" :: "chỉ có thể xuất hiện một lần trong một address.', nhưng bạn nói đúng là nó không nói tại sao. Nếu bạn nghĩ về nó, nó không quá khó để tìm ra lý do tại sao. Hãy tưởng tượng một địa chỉ như ':: 1 ::', có thể mở rộng thành 6 địa chỉ duy nhất. Đó là mơ hồ để cho phép hai, và trong trường hợp nó sẽ không được mơ hồ, nó sẽ là vô dụng. – mpontillo

+1

[RFC 5952, Khuyến nghị cho đại diện văn bản địa chỉ IPv6] (https://tools.ietf.org/html/rfc5952) đã cập nhật tiêu chuẩn cho việc trình bày văn bản chuẩn cho địa chỉ IPv6. –

6

Rõ ràng chút đây là một lỗi đánh máy:

nó có thể sử dụng dấu hai chấm đôi cú pháp để đại diện cho một hoặc nhiều khối với zero. 1: 2 :: 6: 7 tương đương với 1: 2: 3: 4: 5: 6: 7: 8.

1:2::6:7 có nghĩa là 1:2:0:0:0:0:6:7.

tôi đã không nghe thấy điều này trước đây:

đôi ruột kết có thể [không xuất hiện] trong một ip4 rải rác địa chỉ.

Nhưng tôi đã thực hiện một chương trình thử nghiệm và dường như xác nhận nó.

$ ./testipv6 0:0:0:0:0:0:192.168.0.1 
0:0:0:0:0:0:192.168.0.1: OK 

$ ./testipv6 0:0:0:0:0:0:192.168::1 
0:0:0:0:0:0:192.168::1: ERROR 

Nếu không, tôi nghĩ mọi thứ bạn nói đều OK.


testipv6.c

#include <stdio.h> 
#include <stdlib.h> 
#include <arpa/inet.h> 
#include <netinet/in.h> 

int convert(const char *addr) 
{ 
    struct in6_addr dst; 

    return inet_pton(AF_INET6, addr, (void *)&dst); 
} 

int main(int argc, char **argv) 
{ 
    if (argc == 1) { 
     fprintf(stderr, "Usage: testipv6 <addr>\n"); 
     exit(2); 
    } 

    while (argc > 1) { 
     argc--, argv++; 
     const char *addr = argv[0]; 

     if (convert(addr)) { 
      printf("%s: OK\n", addr); 
     } else { 
      printf("%s: ERROR\n", addr); 
     } 
    } 
} 
+0

Cảm ơn bạn đã phát hiện lỗi đánh máy. Bản thân tôi không chắc chắn chính xác vì có rất nhiều ngoại lệ. Hãy nhìn vào những điều vô nghĩa mà có thể với các email - người ta có thể nhúng bình luận inthere .. Đó có thể là lỗi thời nhưng tại sao nó đã bao giờ được bao gồm là vượt ra ngoài tôi. Tôi đã cố gắng viết một chương trình nhưng loại thử nghiệm hộp đen này có thể bỏ qua một số trường hợp lạ mà tôi không biết :) –

+0

Tôi chỉ đưa ra các điểm cho mike vì anh ta tìm thấy một đoạn trong rfc chính thức. –

+0

+1 cho mã nguồn. Đôi khi cách tốt nhất để học một cái gì đó là trải nghiệm nó cho chính mình. =) Thêm vào đó, đây là phần giới thiệu tốt cho inet_pton() mà bất kỳ ai viết mã C cho IPv6 sẽ cần phải biết. – mpontillo

0

Địa chỉ IPv6 có ID vùng có ký hiệu duy nhất mặc dù nó không cụ thể với chính địa chỉ. Trong một hệ thống có nhiều giao diện cho phép IPv6, địa chỉ liên kết cục bộ phải được định hướng theo một cách nào đó. Nó được thực hiện bằng cách sử dụng ký hiệu "%".

FE80 :: AA% eth0 đề cập đến địa chỉ liên kết địa phương có thể truy cập thông qua giao diện eth0. Nó có thể là một chỉ số giao diện trong một số plaforms, FE80 :: AA% 10

Các vấn đề liên quan