IPv6アドレス省略・展開ツール

IPv6アドレスを唯一の正規の省略表記にするか、32桁すべてに展開します。どのゼロが消えるか、なぜその連続が::になったか、入力がRFC 5952のどの規則に反していたかも表示します。リストもまとめて変換できます。

RFC 5952の正規表記 · RFC 4291に基づく解析(末尾のIPv4表記にも対応) · ブラウザー内で動作

読み取った形式: IPv6

8つのグループと、省略で消える部分文字数:39 → 17 · 22文字短縮
残す先頭のゼロ、削除::になる連続その他のゼロ、残す
例

アドレス1つ、または1行に1つずつ並べたリスト(最大100件)を入力します。変換はブラウザー内で行い、何も送信しません。

規則を3件適用RFC 5952

2001:db8::1:0:0:1

2個のゼロのグループの連続が2つ:最初の方が::になりました

RFC 5952の規則ごとのチェック

先頭のゼロを削除§4.1修正0DB8 → db8, 0001 → 1, 0000 → 0, 0000 → 0
::はできるだけ長く§4.2.1修正0000:0000を省略せずに表記 → ::
1グループだけに::を使わない§4.2.2合格
最長の連続、同じ長さなら最初§4.2.3合格2個のゼロのグループの連続が2つ:最初の方が::になりました
小文字§4.3修正0DB8 → db8
省略表記(RFC 5952)
完全表記
URLでの表記
1つの数値として
10進数 · 16進数 · 2進数
逆引きDNS名

IPv6アドレスを省略するには?

小文字にし、各グループの先頭のゼロを削除してから、すべてゼロのグループが2個以上続く最長の部分を::に置き換えます。同じ長さの連続が2つあれば、最初の方を置き換えます。

こうして得られるのが、RFC 5952がソフトウェアに出力を求める唯一の正規表記です。プログラムは入力としてそれ以外の有効な書き方もすべて受け付けなければならないため、省略してもアドレス自体は変わらず、変わるのは書き方だけです。

2001:0DB8:0000:0000:0000:FF00:0042:8329を2001:db8::ff00:42:8329に省略する手順です。
IPv6アドレス省略ツールで、RFC 5952の規則で削除される先頭のゼロと、::に置き換わるゼロの連続を表示した画面IPv6アドレス省略ツールで、RFC 5952の規則で削除される先頭のゼロと、::に置き換わるゼロの連続を表示した画面入力した内容大文字や先頭のゼロがあっても構いません:有効な書き方ならどれでも読み取ります。削除されるゼロ先頭のゼロを、グループごとに取り消し線で示します。::になる連続ゼロのグループの最長の連続。同じ長さなら最初の方です。残る連続その他のゼロの連続は0を残し、その理由を示します。規則ごとのチェック入力がRFC 5952の規則にいくつ反していたか。その下のチェックリストで、各規則と変更点を示します。
同じ長さのゼロの連続が2つ:RFC 5952は最初の方を省略し、チェックリストが入力の反していた規則をそれぞれ示します。

IPv6アドレスの省略表記のルールは?

RFC 5952は5つの規則を定めています:先頭のゼロを削除する、::はできるだけ長くする、ゼロのグループ1つだけには::を使わない、最長の連続を省略する(同じ長さなら最初)、16進数の英字は小文字で書く。

6つ目の推奨は、IPv4を含むアドレスについてです:::ffff:のようなプレフィックスの後は、最後の32ビットをドット付きのIPv4アドレスで書きます。ツールは入力を各規則と照らし合わせ、修正した規則を示します。

1先頭のゼロを削除§4.1

正しい: 2001:db8::1

誤り: 2001:0db8::0001

2::はできるだけ長く§4.2.1

正しい: 2001:db8::2:1

誤り: 2001:db8:0:0:0:0:2:1

31グループだけに::を使わない§4.2.2

正しい: 2001:db8:0:1:1:1:1:1

誤り: 2001:db8::1:1:1:1:1

4最長の連続、同じ長さなら最初§4.2.3

正しい: 2001:db8::1:0:0:1

誤り: 2001:db8:0:0:1::1

5小文字§4.3

正しい: 2001:db8::a

誤り: 2001:DB8::A

+末尾のIPv4表記§5

正しい: ::ffff:192.0.2.1

誤り: 0:0:0:0:0:ffff:192.0.2.1

各規則と、RFC 5952自身が挙げる正しい例と誤った例。

IPv6アドレスを展開するには?

記述されているグループを数え、合計が8つになるまでのゼロのグループを::が表すものとして補い、各グループを4桁にゼロ埋めします:2001:db8::1には3つのグループがあるので、::は5つ分です。

展開した形は、逆引きDNSがニブル(16進数1桁)ごとに使う形であり、多くのログや表計算で文字列として並べ替えるのに必要な形でもあります。Pythonでは.exploded、GoではStringExpandedと呼びます。

2001:db8::1の展開:記述されたグループが3つ、::が表すゼロのグループが5つ、すべてのグループを4桁にゼロ埋めします。

1つのIPv6アドレスには何通りの表記がありますか?

たくさんあります:先頭のゼロ、大文字・小文字、::の位置がそれぞれ変わりうるため、1つのアドレスに有効な書き方が多数あります。RFC 5952は、1つの正規表記を定める前に、2001:db8:0:0:1:0:0:1の書き方を8通り挙げています。

アドレスを文字列として比較すると失敗するのはこのためです:同じアドレスの2つの書き方が一致しません。代わりに128ビットの数値として比較するか、先に両方を省略表記にしてください。

2001:db8:0:0:1:0:0:12001:0db8:0:0:1:0:0:12001:db8::1:0:0:12001:db8::0:1:0:0:12001:0db8::1:0:0:12001:db8:0:0:1::12001:db8:0000:0:1::12001:DB8:0:0:1::1
2001:db8::1:0:0:1正規表記 · RFC 5952
RFC 5952が挙げる8通りの書き方。すべて同じアドレスです。

ポートやゾーン付きのIPv6アドレスをURLに書くには?

アドレスを角かっこで囲み、http://[2001:db8::1]:8443/のように書きます。こうすればポートがグループと取り違えられません。%eth0のようなゾーンは、ブラウザーのURLには一切書けません。

RFC 5952はポートのあるアドレスを角かっこで囲むよう求めており、2001:db8::1:8443は推奨しないとしています。URLで角かっこが使われるのはこの用途だけです。ブラウザーは::ffff:の後でもアドレスを16進数で表示するため、[::ffff:192.0.2.1]は[::ffff:c000:201]と表示されます。

ゾーンは、fe80::1%eth0のように1台のマシン上のインターフェースを指します。RFC 9844は2025年にこれをURLから再び除外し、ブラウザーも受け付けませんが、プログラムでは入力できるようにしておくべきです。

http://スキーム[2001:db8::1]角かっこ内のIPv6:8443ポート/statusパス

ゾーン(%eth0) · fe80::1%eth0

プログラムの入力欄に入力可
ブラウザーのURL拒否
inet_pton()解析できない
グローバルアドレスゾーンは付かない
IPv6アドレスを含むURLの分解と、ゾーンを書ける場所。

コードでIPv6を省略・展開するには?

アドレスを解析して出力します:Pythonの.compressed、Goのnetip.Addr.String()、MySQLのINET6_NTOA(INET6_ATON(…))は正規の表記を返し、.explodedとStringExpanded()は完全表記を返します。

Pythonのstr()も省略表記を返し、Pythonは%zoneの接尾辞も受け付けます。MySQLは小文字で最大39文字を出力し、どのプラットフォームでも同じ結果になります。

› import ipaddress
a = ipaddress.ip_address('2001:0DB8::0001')
a.compressed, a.exploded
('2001:db8::1', '2001:0db8:0000:0000:0000:0000:0000:0001')

Python ipaddress

› a := netip.MustParseAddr("2001:0DB8::0001")
fmt.Println(a.String(), a.StringExpanded())
2001:db8::1 2001:0db8:0000:0000:0000:0000:0000:0001

Go net/netip

› SELECT INET6_NTOA(INET6_ATON('2001:0DB8::0001'));
2001:db8::1

MySQL 8.4

Python、Go、MySQLで得られる正規の省略表記と完全表記。

よくある質問

2001:0db8:0000:0000:0000:ff00:0042:8329の省略表記は?

2001:db8::ff00:42:8329です。英字を小文字にし、各グループの先頭のゼロを削除して(0db8はdb8、0042は42)、すべてゼロのグループが3つ続く部分を::に置き換えます。結果は39文字ではなく22文字になり、RFC 5952が正規と呼ぶ唯一の形です。これをもう一度展開すると、まったく同じ16進数32桁に戻ります。

IPv6アドレスで::は2回使えますか?

使えません。::は1つ以上のゼロのグループを表し、1つのアドレスに1回しか使えません。2回あると、それぞれがいくつのゼロのグループを表すのか誰にも分からないため、2001:db8::1::1は無効です。ゼロの連続が2つあるアドレスでは、長い方(同じ長さなら最初の方)を省略し、もう一方は2001:db8::1:0:0:1のように0:0と書きます。

2001:db8:0:1:1:1:1:1を2001:db8::1:1:1:1:1と省略しないのはなぜですか?

RFC 5952が、ゼロのグループ1つだけに::を使うことを禁じているからです。この省略で減るのは1文字だけで、アドレスが読みにくくなるため、正規表記では単独のグループを0のまま残し、2001:db8:0:1:1:1:1:1と書きます。2001:db8::1:1:1:1:1も同じアドレスとして解析はされますが、ソフトウェアがこの形で出力すべきではありません。

IPv6アドレスは大文字と小文字のどちらで書くべきですか?

小文字です。RFC 5952は、正規表記では16進数の英字aからfを小文字で書くよう定めており、ブラウザーや多くのライブラリもそのように出力します。ソフトウェアは大文字の入力も受け付けなければならないため、2001:DB8::Aと2001:db8::aは同じアドレスで、変わるのは表示される形だけです。大文字は古いドキュメントや一部のベンダーの設定ファイルでよく見られます。

IPv6アドレスの::を展開するには?

記述されているグループを数え、合計が8つになるのに必要な数のゼロのグループを::が表すと考えます。2001:db8::ff00:42:8329では5つのグループが書かれているので、::は0000のグループ3つです。各グループを4桁にゼロ埋めすると2001:0db8:0000:0000:0000:ff00:0042:8329となり、これが逆引きDNSや多くのログツールで使われる完全表記です。

最も長いIPv6アドレスは何文字ですか?

16進数だけの完全表記で39文字です:4桁のグループが8つとコロンが7つです。末尾をドット付きのIPv4で書いた形はさらに長くなりうるため、ソケットAPIのバッファーサイズINET6_ADDRSTRLENは46バイトです。0000:0000:0000:0000:0000:ffff:255.255.255.255と終端のNULが収まる大きさです。省略表記のアドレスは普通それよりずっと短く、アドレス::はわずか2文字です。

::ffff:c000:280が::ffff:192.0.2.128になるのはなぜですか?

IPv4射影アドレスの最後の32ビットはIPv4アドレスを表しているため、RFC 5952はその部分をドット付きのIPv4アドレスで書くことを推奨しているからです。どちらの書き方も同じアドレスで、入力としてはどちらも有効です。例外はブラウザーで、URL Standardは常に16進数の形で出力するため、同じアドレスがアドレスバーでは[::ffff:c000:280]と表示されます。

ポート付きのIPv6アドレスをURLに書くには?

アドレスを角かっこで囲み、その後にポートを書きます:http://[2001:db8::1]:8443/。角かっこがないとポートがもう1つのグループに見えてしまうため、RFC 5952は2001:db8::1:8443と書かないよう求めています。URLで角かっこを使うのはIPv6のリテラルだけです。%eth0のようなゾーンは、ブラウザーのURLには一切書けず、ブラウザーが受け付けません。

PythonでIPv6アドレスを省略表記にするには?

ipaddressモジュールで解析し、正規の省略表記なら.compressedを、32桁すべてなら.explodedを読みます:ipaddress.ip_address('2001:0db8::0001').compressedは'2001:db8::1'を返し、str()も同じ結果を返します。Goではnetip.AddrのString()とStringExpanded()が同じ役割を果たし、MySQLのINET6_NTOA(INET6_ATON(…))は小文字の正規表記を出力します。

IPv6アドレスのリストをまとめて省略できますか?

はい。1行に1つずつ最大100件のアドレスを貼り付けると、ツールは表の表示に切り替わり、各行の省略表記と完全表記、その書き方が反していたRFC 5952の規則を表示します。アドレスでない行は削除せずに印を付けるので、行は入力と対応したままです。どちらの列もコピーでき、CSVもダウンロードできます。データがブラウザーの外に出ることはありません。

足りないものはありますか?機能や新しいツールを提案する