IPv4構文解析器

IPv4構文解析器

[1] IPv4 アドレス (address) は、IPv4 において通信の当事者を識別する番地 (アドレス) です。 IPアドレスの一種です。

目次

  1. 仕様書
  2. データモデル
  3. 文字列表現
    1. インターネット・ホスト表の定義
    2. SMTP の定義
    3. 昔の URL の緩い定義
    4. RFC 2373 の定義
    5. RFC 3986 の定義
    6. 非正準表現
    7. 構文解析
  4. 有名な IPv4 アドレス
  5. 文脈
  6. 関連
  7. メモ

仕様書#

データモデル#

[63] IPv4アドレス (IPv4 address) は、32ビット識別子です >>62

文字列表現#

インターネット・ホスト表の定義#

[17] インターネット・ホスト表 (Internet host table) でのIPv4アドレスの表記は、 1オクテットを表す10進整数を4つ、. で並べたものとして定義されていました。 BNF では

      <address> ::= <octet> "." <octet> "." <octet> "." <octet>
      <octet> ::= <0 to 255 decimal>
... と表されていました。 >>18

RFC 810RFC 608 を廃止していますが、 RFC 608 は古くて IPv4アドレスはありませんでした。IPv4アドレスの定義として RFC 810RFC 796 を参照していますが、 RFC 796 はアドレス割り当てを図示しており、文字列表現はありませんでした。

SMTP の定義#

[9] SMTP (RFC 2821RFC 5321) では IPv4アドレスは次のように ABNF で定義されています。

      IPv4-address-literal = Snum 3("." Snum)
      Snum = 1*3DIGIT  ; representing a decimal integer
            ; value in the range 0 through 255

[14] RFC 2821 の前の RFC 821 でも同じような定義でした。

            <dotnum> ::= <snum> "." <snum> "." <snum> "." <snum>
            <snum> ::= one, two, or three digits representing a decimal
                      integer value in the range 0 through 255

昔の URL の緩い定義#

[38] URL 仕様は歴史的に緩い定義で、任意の十進整数を4つ . で並べたものをIPv4アドレスとしてきました。

[31] RFC 2396, RFC 2543

  IPv4address     = 1*digit "." 1*digit "." 1*digit "." 1*digit
... と ABNF で定義しており、本文中でも同様の説明となっています。 RFC 1630RFC 1738 も異なる BNF で同じように定義しています。

[39] これは後に >>8 のように改訂されています。

RFC 2373 の定義#

[3] RFC 2373IPv6アドレスの文字列表現を定義していました。 IPv4アドレスIPv6アドレスの一部分として用いられることがあるため、その定義も包含していましたが、 IPv4アドレスの表現は自明のことのように扱われており、明記はされていませんでした。

[4] ただし附属書として ABNF 定義があり、

      IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT
... となっていました。

[7] 1つ前の版である RFC 1884 には ABNF はなく、また次の版である RFC 3513 からもなぜか削除されています。文章による定義は以前も以後も含まれていますが、 >>3 の通り、IPv4アドレスについては明記されていません。

[8] RFC 2732URL における IPv4アドレスの定義を RFC 2396 の元のものから RFC 2373 のものに変更しており、10進数の桁数が高々3桁とより厳密になりました。

RFC 2732 の改訂版である RFC 3986 では更に厳密な定義 (>>20) になっています。

[26] SIP も同じ定義をコピペして使っていました >>28 が、 RFC 5954 でより厳密な定義 (>>20) になっています (>>23)。

[43] RFC 3875>>4 と同等の ABNF 定義を含んでいます >>44

RFC 3986 の定義#

[20] RFC 3986RFC 952 (>>17) を参照しつつ、同じことを文章と ABNF で定義しています。ABNF では

      IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet

      dec-octet   = DIGIT                 ; 0-9
                  / %x31-39 DIGIT         ; 10-99
                  / "1" 2DIGIT            ; 100-199
                  / "2" %x30-34 DIGIT     ; 200-249
                  / "25" %x30-35          ; 250-255
... と表されています。

[23] RFC 5954SIP における IPv4address の定義を >>20 に改めています。これに伴い、 任意の3桁以内の10進整数が認められていたものがオクテットを表すもののみに厳密化しています。 >>25

[48] RFC 7239節点識別子RFC 3986 の定義を参照しています。

非正準表現#

[75] フィッシング対策協議会 Council of Anti-Phishing Japan | ニュース | 緊急情報 | URL に特殊な IP アドレス表記を用いたフィッシング (2023/11/14), , https://www.antiphishing.jp/news/alert/ipurl_20231114.html

[76] メール中のURLに特殊なIPアドレス表記を用いたフィッシングに、フィッシング対策協議会が注意喚起 - INTERNET Watch, 株式会社インプレス, https://internet.watch.impress.co.jp/docs/news/1546968.html

構文解析#

[65] IPv4構文解析器 (IPv6 parser) >>64

[68] IPv4構文解析器は、 入力から得られるIPv4アドレスを返すか、 入力が誤ったIPv4アドレスだとして失敗を返すか、 入力がIPv4アドレスではないとしてそのまま返すかのいずれかです。

[66] ホスト構文解析器から呼び出されます。

[67] IPv6構文解析器は、 IPv6アドレスに埋め込まれた IPv4アドレスを独自の方法で構文解析します。IPv4構文解析器は使いません。

有名な IPv4 アドレス#

[74] 特殊IPアドレスも参照。

文脈#

[50] IPv4アドレスIPv6アドレスが用いられる場所は、IPアドレスの項を参照。

関連#

[2] IPv4 が最もよく用いられている IP である現在、 IPv4アドレスのことを単に「IPアドレス」と呼ぶことがほとんどです。 また、俗に、更に略して単に「IP」と呼ばれることすらあります。

メモ#

[40] RFC 6021 - Common YANG Data Types ( 版) http://tools.ietf.org/html/rfc6021

[41] Manpage of INET ( ( 版)) http://archive.linux.or.jp/JM/html/LDP_man-pages/man3/inet_addr.3.html

[42] 変なIPに書き換えても繋がるかテスト ( ( 版)) http://abc.s65.xrea.com/1/

[45] RFC 6943 - Issues in Identifier Comparison for Security Purposes ( ( 版)) http://tools.ietf.org/html/rfc6943#section-3.1.1

[46] RFC 7249 - Internet Numbers Registries ( ( 版)) http://tools.ietf.org/html/rfc7249#section-2.2

[47] IRC logs: freenode / #whatwg / 20141014 ( ( 版)) http://krijnhoetmer.nl/irc-logs/whatwg/20141014

[49] CSP2/CSP3: Drop literal IPv4 support. · c39f73a · w3c/webappsec ( 版) https://github.com/w3c/webappsec/commit/c39f73a5fd93dd68de228a2e8914734c8e14a16c

[51] [whatwg] IPv4 parsing (Anne van Kesteren 著, 版) https://lists.w3.org/Archives/Public/public-whatwg-archive/2015Jun/0092.html

[52] Define an IPv4 parser that is compatible with Chrome · whatwg/url@9043740 ( 版) https://github.com/whatwg/url/commit/904374077513ac73d4e8ed2a8a76a460bb369735

[53] Bug 26431 – Define IPv4 parsing ( 版) https://www.w3.org/Bugs/Public/show_bug.cgi?id=26431

[54] Re: [whatwg] IPv4 parsing (Anne van Kesteren 著, 版) https://lists.w3.org/Archives/Public/public-whatwg-archive/2015Jul/0000.html

[55] Off-by-one error in IPv4 parser. Fixes https://twitter.com/Zalathar/s… · whatwg/url@94e9e60 ( 版) https://github.com/whatwg/url/commit/94e9e60b968a73640a622a0b643879ed17a57b41

[56] IPv4 serializer reversed order of IPv4 addresses accidentally. Also d… · whatwg/url@e7d85d6 ( 版) https://github.com/whatwg/url/commit/e7d85d64a0abedeb39765ddfe97f2828ed0c992b

[57] Handle "0" as input in the IPv4 number parser. Fixes #50. · whatwg/url@8848692 ( 版) https://github.com/whatwg/url/commit/884869260417fbdc0738c286d8e8d9cdec026b47

[58] Apparently 0x is an IPv4 number. Fixes #50 (again). · whatwg/url@1eab2ab ( 版) https://github.com/whatwg/url/commit/1eab2abb3806158fc7a550ac5b7deb2d6fff5602

[59] RFC 1918 - Address Allocation for Private Internets ( 版) https://tools.ietf.org/html/rfc1918

[60] If IPv4 parser finds empty labels, return input as domain. Fixes #51. · whatwg/url@990295a ( 版) https://github.com/whatwg/url/commit/990295a481ba5b9ababf2e0c37dcd4b1d577e41a

[61] Report all IPv4 syntax violations. · whatwg/url@c1b8970 ( 版) https://github.com/whatwg/url/commit/c1b8970133eb54aa86feaa407dc2db2fdedc8096

[69] Editorial: cleanup host similarly to URL (annevk著, ) https://github.com/whatwg/url/commit/7f9c5fd9236f9a329c48615bce5d25b50f276738

[70] Parse IPv4 number "0x0a" correctly (annevk著, ) https://github.com/whatwg/url/commit/620fa90a8c6c06980a608382b4bd0810353834d9

[71] Editorial: typo in IPv4 parser (italoacasas著, ) https://github.com/whatwg/url/commit/90e567b5252be925fcdbac3908228f3c5bcb4a42

[72] IPv4 parser: handle the empty string (annevk著, ) https://github.com/whatwg/url/commit/cb146b945fb95e93bcc7c942d0eac4572a60f48f

[73] Attempt to explain valid input better (annevk著, ) https://github.com/whatwg/url/commit/50cb9ab9d8f70cc2bc72e91976bfaea0ad0fd330