[1] [DFN[IPv4 [RUBYB[アドレス]@en[address]]]]は、[[IPv4]]
において通信の当事者を識別する[RUBY[[[番地]]][[[アドレス]]]]です。
[[IPアドレス]]の一種です。

* 仕様書

[REFS[
- [62] [CITE@en[URL Standard]] ([TIME[2015-09-18 15:38:29 +09:00]] 版) <https://url.spec.whatwg.org/#concept-ipv4>
- [64] [CITE@en[URL Standard]] ([TIME[2016-08-25 16:02:43 +09:00]]) <https://url.spec.whatwg.org/#concept-ipv4-parser>
]REFS]

* データモデル

[63] [DFN[[RUBYB[[[IPv4アドレス]]]@en[IPv4 address]]]]は、32ビット識別子です [SRC[>>62]]。

* 文字列表現

** インターネット・ホスト表の定義

[17] [RUBYB[[[インターネット・ホスト表]]]@en[Internet host table]]での[[IPv4アドレス]]の表記は、
1[[オクテット]]を表す10進整数を4つ、[CODE(char)[[[.]]]] で並べたものとして定義されていました。
[[BNF]] では
[PRE(BNF code)[
      <address> ::= <octet> "." <octet> "." <octet> "." <octet>
      <octet> ::= <0 to 255 decimal>
]PRE]
... と表されていました。 [SRC[>>18]]

;;
- [19] [[RFC 810]] [CITE@en[DoD Internet host table specification]] (廃止済み)
<http://tools.ietf.org/html/rfc810>
- [18] [[RFC 952]] [CITE@en[DOD INTERNET HOST TABLE SPECIFICATION]] 
<http://tools.ietf.org/html/rfc0952>

;; [[RFC 810]] は [[RFC 608]] を廃止していますが、 [[RFC 608]]
は古くて [[IPv4アドレス]]はありませんでした。[[IPv4アドレス]]の定義として
[[RFC 810]] は [[RFC 796]] を参照していますが、 [[RFC 796]]
はアドレス割り当てを図示しており、文字列表現はありませんでした。

** SMTP の定義

[9] [[SMTP]] ([[RFC 2821]] → [[RFC 5321]]) では [[IPv4アドレス]]は次のように
[[ABNF]] で定義されています。

[PRE(ABNF code)[
      IPv4-address-literal = Snum 3("." Snum)
      Snum = 1*3DIGIT  ; representing a decimal integer
            ; value in the range 0 through 255
]PRE]

;;
- [10] [[RFC 2821]] [CITE@en[Simple Mail Transfer Protocol]] (廃止済み)
-- [12] <http://tools.ietf.org/html/rfc2821#section-4.1.3>
- [11] [[RFC 5321]] [CITE@en[Simple Mail Transfer Protocol]] 
-- [13] <http://tools.ietf.org/html/rfc5321#page-44>

[14] [[RFC 2821]] の前の [[RFC 821]] でも同じような定義でした。
[PRE(ABNF code)[
            <dotnum> ::= <snum> "." <snum> "." <snum> "." <snum>
            <snum> ::= one, two, or three digits representing a decimal
                      integer value in the range 0 through 255
]PRE]

;;
- [15] [[RFC 821]] [CITE@en[Simple Mail Transfer Protocol]] (廃止済み)
--[16] <http://tools.ietf.org/html/rfc821#page-30>

** 昔の URL の緩い定義

[38] [[URL]] 仕様は歴史的に緩い定義で、任意の[[十進整数]]を4つ [CODE(char)[[[.]]]]
で並べたものを[[IPv4アドレス]]としてきました。

[31] [[RFC 2396]], [[RFC 2543]] は
[PRE(ABNF example code)[
  IPv4address     = 1*digit "." 1*digit "." 1*digit "." 1*digit
]PRE]
... と [[ABNF]] で定義しており、本文中でも同様の説明となっています。
[[RFC 1630]] と [[RFC 1738]] も異なる [[BNF]] で同じように定義しています。

;;
- [36] [[RFC 1630]] [CITE@en[Universal Resource Identifiers in WWW: A Unifying Syntax for the Expression of Names and Addresses of Objects on the Network as used in the World-Wide Web]]
-- [37] <http://tools.ietf.org/html/rfc1630#page-25>
- [34] [[RFC 1738]] [CITE@en[Uniform Resource Locators (URL)]] (廃止済み)
-- [35] <http://tools.ietf.org/html/rfc1738#page-18>
- [32] [[RFC 2396]] [CITE@en[Uniform Resource Identifiers (URI): Generic Syntax]] (廃止済み) 
-- [33] <http://tools.ietf.org/html/rfc2396#page-14>
- [29] [[RFC 2543]] [CITE@en[SIP: Session Initiation Protocol]] (廃止済み)
-- [30] <http://tools.ietf.org/html/rfc2543#page-21>

[39] これは後に >>8 のように改訂されています。

** RFC 2373 の定義

[3] [[RFC 2373]] は [[IPv6アドレス]]の文字列表現を定義していました。
[[IPv4アドレス]]は[[IPv6アドレス]]の一部分として用いられることがあるため、その定義も包含していましたが、
[[IPv4アドレス]]の表現は自明のことのように扱われており、明記はされていませんでした。

[4] ただし附属書として [[ABNF]] 定義があり、
[PRE(ABNF code)[
      IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT
]PRE]
... となっていました。

;;
- [5] [[RFC 2373]] [CITE@en[IP Version 6 Addressing Architecture]] 
-- [6] <http://tools.ietf.org/html/rfc2373#page-22>

[7] 1つ前の版である [[RFC 1884]] には [[ABNF]] はなく、また次の版である [[RFC 3513]]
からもなぜか削除されています。文章による定義は以前も以後も含まれていますが、
>>3 の通り、[[IPv4アドレス]]については明記されていません。

[8] [[RFC 2732]] は [[URL]] における [[IPv4アドレス]]の定義を [[RFC 2396]]
の元のものから [[RFC 2373]] のものに変更しており、10進数の桁数が高々3桁とより厳密になりました。

;; [[RFC 2732]] の改訂版である [[RFC 3986]] では更に厳密な定義 (>>20) になっています。 

[26] [[SIP]] も同じ定義をコピペして使っていました [SRC[>>28]] が、
[[RFC 5954]] でより厳密な定義 (>>20) になっています (>>23)。

[43] [[RFC 3875]] も >>4 と同等の [[ABNF]] 定義を含んでいます [SRC[>>44]]。

[REFS[
- [27] [[RFC 3261]] [CITE@en[SIP: Session Initiation Protocol]]
-- [28] <http://tools.ietf.org/html/rfc3261#page-223>
- [44] [CITE@en[RFC 3875 - The Common Gateway Interface (CGI) Version 1.1]] ([TIME[2011-11-20 06:09:05 +09:00]] 版) <http://tools.ietf.org/html/rfc3875#page-16>
]REFS]

** RFC 3986 の定義

[20] [[RFC 3986]] は [[RFC 952]] (>>17)  を参照しつつ、同じことを文章と [[ABNF]] 
で定義しています。[[ABNF]] では
[PRE(ABNF code)[
      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
]PRE]
... と表されています。

;;
- [21] [[RFC 3986]] [CITE@en[Uniform Resource Identifier (URI): Generic Syntax]]
-- [22] <http://tools.ietf.org/html/rfc3986#page-20>

[23] [[RFC 5954]] は [[SIP]] における [CODE(ABNF)@en[[[IPv4address]]]]
の定義を >>20 に改めています。これに伴い、
任意の3桁以内の[[10進整数]]が認められていたものが[[オクテット]]を表すもののみに厳密化しています。
[SRC[>>25]]

;; 
- [24] [[RFC 5954]] [CITE@en[Essential Correction for IPv6 ABNF and URI Comparison in RFC 3261]] 
-- [25] <http://tools.ietf.org/html/rfc5954>

[48] [[RFC 7239]] の[[節点識別子]]は [[RFC 3986]] の定義を参照しています。

** 非正準表現

[75] [CITE[フィッシング対策協議会 Council of Anti-Phishing Japan | ニュース | 緊急情報 | URL に特殊な IP アドレス表記を用いたフィッシング (2023/11/14)]], [TIME[2023-11-14T08:24:55.000Z]], [TIME[2023-11-17T11:59:54.343Z]] <https://www.antiphishing.jp/news/alert/ipurl_20231114.html>

[76] [CITE@ja[メール中のURLに特殊なIPアドレス表記を用いたフィッシングに、フィッシング対策協議会が注意喚起 - INTERNET Watch]], [[株式会社インプレス]], [TIME[2023-11-17T12:01:57.000Z]] <https://internet.watch.impress.co.jp/docs/news/1546968.html>

** 構文解析

[65] [DFN[[RUBYB[IPv4構文解析器]@en[IPv6 parser]]]] [SRC[>>64]]

[68] [[IPv4構文解析器]]は、
入力から得られる[[IPv4アドレス]]を返すか、
入力が誤った[[IPv4アドレス]]だとして[[失敗]]を返すか、
入力が[[IPv4アドレス]]ではないとしてそのまま返すかのいずれかです。

[66] [[ホスト構文解析器]]から呼び出されます。

;; [67] [[IPv6構文解析器]]は、 [[IPv6アドレス]]に埋め込まれた
[[IPv4アドレス]]を独自の方法で[[構文解析]]します。[[IPv4構文解析器]]は使いません。

* 有名な IPv4 アドレス

[74] [[特殊IPアドレス]]も参照。

[FIG(short list)[
- [CODE[8.8.8.8]]
]FIG]

* 文脈

[50] [[IPv4アドレス]]と[[IPv6アドレス]]が用いられる場所は、[[IPアドレス]]の項を参照。

* 関連

[2] [[IPv4]] が最もよく用いられている [[IP]] である現在、
[[IPv4アドレス]]のことを単に「[[IPアドレス]]」と呼ぶことがほとんどです。
また、俗に、更に略して単に「[[IP]]」と呼ばれることすらあります。

* メモ

[40] [CITE@en[RFC 6021 - Common YANG Data Types]]
([TIME[2010-10-07 04:53:03 +09:00]] 版)
<http://tools.ietf.org/html/rfc6021>

[41] [CITE[Manpage of INET]]
( ([TIME[2010-04-25 12:26:45 +09:00]] 版))
<http://archive.linux.or.jp/JM/html/LDP_man-pages/man3/inet_addr.3.html>

[42] [CITE@ja-JP[変なIPに書き換えても繋がるかテスト]]
( ([TIME[2011-05-15 15:55:28 +09:00]] 版))
<http://abc.s65.xrea.com/1/>

[45] [CITE@en[RFC 6943 - Issues in Identifier Comparison for Security Purposes]]
( ([TIME[2013-11-19 01:20:54 +09:00]] 版))
<http://tools.ietf.org/html/rfc6943#section-3.1.1>

[46] [CITE@en[RFC 7249 - Internet Numbers Registries]]
( ([TIME[2014-05-19 15:53:46 +09:00]] 版))
<http://tools.ietf.org/html/rfc7249#section-2.2>

[47] [CITE[IRC logs: freenode / #whatwg / 20141014]]
( ([TIME[2014-10-18 03:20:53 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20141014>

[49] [CITE@en[CSP2/CSP3: Drop literal IPv4 support. · c39f73a · w3c/webappsec]]
([TIME[2015-02-11 16:37:40 +09:00]] 版)
<https://github.com/w3c/webappsec/commit/c39f73a5fd93dd68de228a2e8914734c8e14a16c>

[51] [CITE@en[''''''[''''''whatwg'''''']'''''' IPv4 parsing]]
([[Anne van Kesteren]] 著, [TIME[2015-06-23 01:52:35 +09:00]] 版)
<https://lists.w3.org/Archives/Public/public-whatwg-archive/2015Jun/0092.html>

[52] [CITE@en[Define an IPv4 parser that is compatible with Chrome · whatwg/url@9043740]]
([TIME[2015-07-02 11:07:03 +09:00]] 版)
<https://github.com/whatwg/url/commit/904374077513ac73d4e8ed2a8a76a460bb369735>

[53] [CITE@en[Bug 26431 – Define IPv4 parsing]]
([TIME[2015-07-02 11:09:27 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=26431>

[54] [CITE@en[Re: ''''''[''''''whatwg'''''']'''''' IPv4 parsing]]
([[Anne van Kesteren]] 著, [TIME[2015-07-01 23:29:24 +09:00]] 版)
<https://lists.w3.org/Archives/Public/public-whatwg-archive/2015Jul/0000.html>

[55] [CITE@en[Off-by-one error in IPv4 parser. Fixes https://twitter.com/Zalathar/s… · whatwg/url@94e9e60]]
([TIME[2015-07-03 12:01:50 +09:00]] 版)
<https://github.com/whatwg/url/commit/94e9e60b968a73640a622a0b643879ed17a57b41>

[56] [CITE@en[IPv4 serializer reversed order of IPv4 addresses accidentally. Also d… · whatwg/url@e7d85d6]]
([TIME[2015-07-11 10:56:15 +09:00]] 版)
<https://github.com/whatwg/url/commit/e7d85d64a0abedeb39765ddfe97f2828ed0c992b>

[57] [CITE@en[Handle "0" as input in the IPv4 number parser. Fixes #50. · whatwg/url@8848692]]
([TIME[2015-07-24 22:54:40 +09:00]] 版)
<https://github.com/whatwg/url/commit/884869260417fbdc0738c286d8e8d9cdec026b47>

[58] [CITE@en[Apparently 0x is an IPv4 number. Fixes #50 (again). · whatwg/url@1eab2ab]]
([TIME[2015-07-24 22:56:44 +09:00]] 版)
<https://github.com/whatwg/url/commit/1eab2abb3806158fc7a550ac5b7deb2d6fff5602>

[59] [CITE@en[RFC 1918 - Address Allocation for Private Internets]]
([TIME[2015-06-14 13:13:57 +09:00]] 版)
<https://tools.ietf.org/html/rfc1918>

[60] [CITE@en[If IPv4 parser finds empty labels, return input as domain. Fixes #51. · whatwg/url@990295a]]
([TIME[2015-08-15 11:45:55 +09:00]] 版)
<https://github.com/whatwg/url/commit/990295a481ba5b9ababf2e0c37dcd4b1d577e41a>

[61] [CITE@en[Report all IPv4 syntax violations. · whatwg/url@c1b8970]]
([TIME[2015-08-18 12:17:47 +09:00]] 版)
<https://github.com/whatwg/url/commit/c1b8970133eb54aa86feaa407dc2db2fdedc8096>

[69] [CITE@en[Editorial: cleanup host similarly to URL]]
([[annevk]]著, [TIME[2016-11-01 00:18:24 +09:00]])
<https://github.com/whatwg/url/commit/7f9c5fd9236f9a329c48615bce5d25b50f276738>

[70] [CITE@en[Parse IPv4 number "0x0a" correctly]]
([[annevk]]著, [TIME[2016-12-09 11:28:38 +09:00]])
<https://github.com/whatwg/url/commit/620fa90a8c6c06980a608382b4bd0810353834d9>

[71] [CITE@en[Editorial: typo in IPv4 parser]]
([[italoacasas]]著, [TIME[2016-12-29 00:01:47 +09:00]])
<https://github.com/whatwg/url/commit/90e567b5252be925fcdbac3908228f3c5bcb4a42>

[72] [CITE@en[IPv4 parser: handle the empty string]]
([[annevk]]著, [TIME[2016-12-30 00:02:19 +09:00]])
<https://github.com/whatwg/url/commit/cb146b945fb95e93bcc7c942d0eac4572a60f48f>

[73] [CITE@en[Attempt to explain valid input better]]
([[annevk]]著, [TIME[2017-02-10 17:10:23 +09:00]])
<https://github.com/whatwg/url/commit/50cb9ab9d8f70cc2bc72e91976bfaea0ad0fd330>