2011-02-04 6 views
10

楽しいことに、IPv6アドレス内のビルディングブロックまたは要素をよりよく理解したいと思います。各ブロックは0から0xFFFFの間の桁の16進数でエンコードされている(8つのブロック、16ビットのそれぞれと記す)長128ビット IPv6アドレスを作成する方法を理解するための完全なガイド

  • ある

    • IPv6アドレス:ここ

      は私の理解の基礎であります。先頭のゼロは省略することができます。

    • IPv4 doted-quadアドレスを付加することができ、IPv6アドレスの下位32ビットを占有します。 1:2:3:4:5:6:200.201.202.203。 (IPv4の規則は期待通りです)
    • IPv4表現は最後にしか表示されません。
    • 二重コロン構文を使用して、ゼロを持つ1つ以上のブロックを表すことができます。 1:2 :: 7:8は1:2:0:0:0:0:7:8に相当します。
    • 各IPv6アドレスは、その中に2つのコロンしかない場合があります。そうでない場合は、構文的に間違っています。
    • ダブルコロンは、ip6の先頭、中央、または末尾に表示されますが、IPv4のドット付きクォッドアドレスには表示されません。

    上記の点はすべて正しいですか?

    私はRFCを読むように教えてください。この問題についてはいくつかありますが、実際にはさまざまなコード化メカニズムを説明するための簡単な例はありません。多くの人が簡単な例を挙げていただければ幸いです。助けるために

    オンラインテストツール 最も近いオンラインツールは http://www.dominicsayers.com/source/beta/is_email/test/ ですが、メッセージが混乱していると、それは実際に右と間違っているものを平易な英語で言うと理由はありません。実際には電子メールのために作られていますが、もちろんIPv6アドレスを含んでいる可能性もあります。

  • +0

    is_email/testプログラムへのdominicsayersリンクは不幸にも壊れています。 –

    +0

    IPv4アドレスでは、中央のゼロクワッドを省略できます。例えば、10.0.0.248は10.248と書くことができます。 1:2:3:4:5:6:10.248のように、IPv6アドレスの末尾でそれを行うことができるかどうかはわかりません。 –

    答えて

    7

    一般的にはい、あなたのポイントは正しいです。

    本当にあなたはRFCを読んでいますか? RFC 3513, section 2.2はあなたが求めているものを正確に持っています。これはRFCのために書かれています。 =)私はこの質問を読んで将来の人々にとって非常に役立つかもしれないので、これを指摘することはできません。

    +0

    私は正しいRFCを読んでほしいと思っています。関連しているものがいくつかあります。 2.2にはいくつかのサンプルが含まれていますが、間違いを簡単にする例はありません。たとえば、なぜこれが間違っているのかをメモした2つの空の::ブロックを含むip6は含まれていません... –

    +0

    @mP、 「The」::「アドレスに一度しか出現できません」と言っていますが、それはなぜそうは言いません。あなたがそれについて考えるなら、それを理解することはそれほど難しいことではありません。 ':: 1 ::'のような6つのユニークなアドレスに展開できるようなアドレスを想像してみてください。 2つを許すのはあいまいであり、あいまいでない場合は役に立たないでしょう。 – mpontillo

    +1

    [RFC5952、IPv6アドレステキスト表現のための勧告](https://tools.ietf.org/html/rfc5952)は、IPv6アドレスの標準テキスト表現の標準を更新しました。 –

    6

    明らかに、このビットはタイプミスです:

    ゼロで一個の以上のブロックを表現する構文ダブルコロンを使用することが可能です。 1:2 :: 6:7は、1:2:3:4:5:6:7:8に相当します。

    1:2::6:7は、1: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 
    

    そうでなければ、あなたが言うことはすべて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

    typo spottingをありがとう。非常に多くの例外があるので、私自身は確信していません。電子メールで可能なナンセンスを見てみましょう - 誰かがコメントを埋め込むことができます..それは時代遅れかもしれませんが、なぜそれが含まれていたのかは私を超えています。私はプログラムを作成しようとしましたが、この種のブラックボックステストでは私が気付いていない奇妙なケースを除外するかもしれません:) –

    +0

    公式のrfcでスニペットを見つけたので、私はmikeにポイントを与えました。 –

    +0

    +1です。時々、何かを学ぶための最良の方法は、あなた自身でそれを体験することです。 =)さらに、inet_pton()には、IPv6用のCを記述している人なら誰でも知っておく必要のある情報があります。 – mpontillo

    0

    ゾーンIDを持つIPv6アドレスは、アドレス自体に固有のものではありませんが、固有の表記法を持っています。複数のIPv6対応インタフェースを備えたシステムでは、リンクローカルアドレスはなんらかの方法で曖昧さを解消する必要があります。これは "%"表記を使用して行われます。

    FE80 :: AA%eth0は、eth0インターフェイスを介して到達可能なリンクローカルアドレスを指します。 一部のプラットフォームではインタフェースインデックスになる可能性があります。FE80 :: AA%10

    関連する問題