2011-02-04 1 views
10

Для удовольствия я хотел бы лучше понять строительные блоки или элементы, которые находятся в адресе IPv6.Окончательное руководство по пониманию того, как сформулировать адрес IPv6

Вот основы, от моего понимания:

  • IPv6-адреса 128 бит длиной (записывается в виде 8 блоков, каждый из которых 16 бит)
  • Каждый блок кодируется в виде шестнадцатеричных цифр от 0 до 0xFFFF , Ведущие нули могут быть опущены.
  • Можно добавить IP-адрес с четырьмя адресами IPv4, и он будет занимать нижние 32 бита адреса IPv6. 1: 2: 3: 4: 5: 6: 200.201.202.203. (Правила для IPv4 как ожидалось.)
  • Представление IPv4 может появляться только в конце.
  • Можно использовать двойной синтаксис двоеточия для представления одного или нескольких блоков с нулями. (0: 0: 0: 0: 0: 7: 8).
  • Каждый адрес IPv6 может содержать только одну двойную двоеточие, в противном случае это синтаксически неправильно.
  • Двойной двоеточие может отображаться в начале, середине или конце ip6, но не в адресе IPv4 с точками.

Все ли вышесказанное верно?

Пожалуйста, не говорите мне, чтобы прочитать RFC. В этом есть несколько вопросов, и на самом деле никто не приходит с несколькими простыми примерами для описания различных механизмов кодирования. Я уверен, что многие оценят простой список с примерами.

Интернет инструмент тестирования Ближайший онлайн инструмент, чтобы помочь в http://www.dominicsayers.com/source/beta/is_email/test/ но сообщения запутаны, и это на самом деле не говорят на простом английском языке, что является правильным и неправильным, и почему. Он также фактически создан для писем, которые, конечно, могут содержать адреса IPv6, поэтому он не совсем идеален.

+0

К сожалению, ссылка на доминирующие ссылки на программу is_email/test сломана. –

+0

В адресе IPv4 вы можете опустить средние нулевые квадроциклы. Например, 10.0.0.248 можно написать 10.248. Я не уверен, что вы можете сделать это в конце адреса IPv6, хотя, например, 1: 2: 3: 4: 5: 6: 10.248. –

ответ

7

В общем, да, ваши очки правильно.

Вы уверены, что читаете RFC? RFC 3513, section 2.2 имеет именно то, о чем вы просите. Это очень хорошо написано для RFC. =) Я не могу не отметить это, так как это может быть очень полезно для будущих людей, читающих этот вопрос.

+0

Надеюсь, я прочитал правильный RFC, так как есть несколько, которые связаны. 2.2 содержит некоторые примеры, но в нем нет примеров простых ошибок. Например, он не включает ip6 с двумя пустым :: блоками с примечанием, почему это неправильно ... –

+0

@mP, ну, он говорит, что «The :: ::» может появляться только один раз в адресе. », но вы правы, что он не говорит, почему. Если вы думаете об этом, не сложно понять, почему. Представьте себе такой адрес, как ':: 1 ::', который может быть расширен до 6 уникальных адресов. Двусмысленно допускать два, и в тех случаях, когда это не было бы двусмысленным, это было бы бесполезно. – mpontillo

+1

[RFC 5952, A Рекомендация для представления текста адреса IPv6] (https://tools.ietf.org/html/rfc5952) обновил стандарт канонического текстового представления адресов IPv6. –

6

Очевидно, что этот бит опечатка:

можно использовать двойные двоеточия синтаксис для представления одного или более блоков с нулями. 1: 2 :: 6: 7 эквивалентно 1: 2: 3: 4: 5: 6: 7: 8.

1:2::6:71:2:0:0:0:0:6:7.

Я не слышал об этом раньше:

двойное двоеточие может [не появляться] в пределах ip4 точка адреса.

Но я сделал тестовую программу и, похоже, ее подтвердил.

$ ./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 

В противном случае я думаю, что все, что вы сказали, в порядке.


testipv6.с

#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

Спасибо за опечатку. Я сам не сомневаюсь, поскольку существует так много исключений. Взгляните на бессмыслицу, которая возможна с помощью электронных писем - можно вставлять комментарии в нее. Это может быть устаревшим, но почему это когда-либо было включено, вне меня. Я попробовал написать программу, но такое тестирование Blackbox могло бы оставить некоторые странные случаи, о которых я не знаю :) –

+0

Я только дал очки Майку, потому что нашел фрагмент в официальном rfc. –

+0

+1 для исходного кода. Иногда лучший способ узнать что-то - это испытать это для себя. =) Плюс, это хорошее введение в inet_pton(), о котором нужно знать любому, кто кодирует C для IPv6. – mpontillo

0

IPv6-адреса с идентификатором зоны имеют уникальное обозначение, хотя оно не относится к самому адресу. В системе с несколькими интерфейсами, поддерживающими IPv6, локальный адрес ссылки должен быть каким-то образом устранен. Это делается с использованием обозначения «%».

FE80 :: AA% eth0 относится к локальному адресу ссылки, доступному через интерфейс eth0. Это может быть индекс интерфейса в некоторых формах, FE80 :: AA% 10