github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/net/ip.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // IPアドレスの操作 6 // 7 // IPv4アドレスは4バイトで、IPv6アドレスは16バイトです。 8 // IPv4アドレスは正規のプレフィックス(10個のゼロ、2つの0xFF)を追加することで、IPv6アドレスに変換できます。 9 // このライブラリはどちらのバイトスライスのサイズも受け付けますが、常に16バイトのアドレスを返します。 10 11 package net 12 13 // IPアドレスの長さ(バイト単位)。 14 const ( 15 IPv4len = 4 16 IPv6len = 16 17 ) 18 19 // IPは単一のIPアドレス、バイトのスライスです。 20 // このパッケージの関数は、4バイト(IPv4)または16バイト(IPv6)のスライスを入力として受け付けます。 21 // 22 // このドキュメントでは、IPアドレスをIPv4アドレスまたはIPv6アドレスと呼ぶことは、アドレスの意味的な属性であり、単にバイトスライスの長さだけではありません:16バイトスライスもIPv4アドレスである可能性があります。 23 type IP []byte 24 25 // IPMaskは、IPアドレスのアドレッシングとルーティングに使用できる 26 // ビットマスクです。 27 // 28 // 詳細については、型 [IPNet] と関数 [ParseCIDR] を参照してください。 29 type IPMask []byte 30 31 // IPNetはIPネットワークを表します。 32 type IPNet struct { 33 IP IP 34 Mask IPMask 35 } 36 37 // IPv4は、IPv4アドレスa.b.c.dのIPアドレス(16バイト形式)を返します。 38 func IPv4(a, b, c, d byte) IP 39 40 // IPv4Maskは、IPv4マスクa.b.c.dのIPマスク(4バイト形式)を返します。 41 func IPv4Mask(a, b, c, d byte) IPMask 42 43 // CIDRMaskは、'ones'個の1ビットで構成された [IPMask] を返します。 44 // その後、0ビットが 'bits'ビットの総長になるまで続きます。 45 // この形式のマスクに対して、CIDRMaskは [IPMask.Size] の逆です。 46 func CIDRMask(ones, bits int) IPMask 47 48 // 有名なIPv4アドレス 49 var ( 50 IPv4bcast = IPv4(255, 255, 255, 255) 51 IPv4allsys = IPv4(224, 0, 0, 1) 52 IPv4allrouter = IPv4(224, 0, 0, 2) 53 IPv4zero = IPv4(0, 0, 0, 0) 54 ) 55 56 // 有名なIPv6アドレス 57 var ( 58 IPv6zero = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 59 IPv6unspecified = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 60 IPv6loopback = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1} 61 IPv6interfacelocalallnodes = IP{0xff, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01} 62 IPv6linklocalallnodes = IP{0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01} 63 IPv6linklocalallrouters = IP{0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x02} 64 ) 65 66 // IsUnspecified は、ipが特定されていないアドレスであるかどうかを報告します。 67 // つまり、IPv4アドレスの "0.0.0.0" またはIPv6アドレス "::" です。 68 func (ip IP) IsUnspecified() bool 69 70 // IsLoopbackはipがループバックアドレスであるかどうかを報告します。 71 func (ip IP) IsLoopback() bool 72 73 // IsPrivateは、RFC 1918(IPv4アドレス)およびRFC 4193(IPv6アドレス)に基づいて、IPがプライベートアドレスかどうかを報告します。 74 func (ip IP) IsPrivate() bool 75 76 // IsMulticastは、ipがマルチキャストアドレスかどうかを報告します。 77 func (ip IP) IsMulticast() bool 78 79 // IsInterfaceLocalMulticastは、ipがインターフェースローカルなマルチキャストアドレスかどうかを報告します。 80 func (ip IP) IsInterfaceLocalMulticast() bool 81 82 // IsLinkLocalMulticast は、与えられた IP アドレスがリンクローカルマルチキャストアドレスかどうかを報告します。 83 func (ip IP) IsLinkLocalMulticast() bool 84 85 // IsLinkLocalUnicast は、ip がリンクローカルユニキャストアドレスであるかどうかを報告します。 86 func (ip IP) IsLinkLocalUnicast() bool 87 88 // IsGlobalUnicastは、ipがグローバルユニキャストアドレスであるかどうかを報告します。 89 // 90 // グローバルユニキャストアドレスの識別は、RFC 1122、RFC 4632、RFC 4291で定義されたアドレスタイプの識別を使用しますが、 91 // IPv4の指示ブロードキャストアドレスは除外します。 92 // ipがIPv4のプライベートアドレススペースまたはローカルIPv6ユニキャストアドレススペースにある場合でも、trueを返します。 93 func (ip IP) IsGlobalUnicast() bool 94 95 // To4はIPv4アドレスを4バイトの表現に変換します。 96 // もしipがIPv4アドレスでない場合、To4はnilを返します。 97 func (ip IP) To4() IP 98 99 // To16はIPアドレスipを16バイトの表現に変換します。 100 // ipがIPアドレスでない場合(長さが正しくない場合)、To16はnilを返します。 101 func (ip IP) To16() IP 102 103 // DefaultMaskはIPアドレスipのデフォルトのマスクを返します。 104 // IPv4アドレスのみがデフォルトマスクを持ちます。ipが有効なIPv4アドレスでない場合、DefaultMaskは 105 // nilを返します。 106 func (ip IP) DefaultMask() IPMask 107 108 // MaskはIPアドレスipをmaskでマスクした結果を返します。 109 func (ip IP) Mask(mask IPMask) IP 110 111 // StringはIPアドレスipの文字列形式を返します。 112 // それは以下の4つの形式のいずれかを返します: 113 // - "<nil>", ipの長さが0の場合 114 // - ドット付きの10進表現 ("192.0.2.1"), ipがIPv4またはIP4-mapped IPv6アドレスの場合 115 // - RFC 5952に準拠したIPv6形式 ("2001:db8::1"), ipが有効なIPv6アドレスの場合 116 // - 上記の条件に当てはまらない場合は、ipの句読点を除いた16進数形式 117 func (ip IP) String() string 118 119 // MarshalTextは [encoding.TextMarshaler] インターフェースを実装します。 120 // エンコードは [IP.String] で返されるものと同じですが、1つ例外があります: 121 // len(ip)がゼロの場合、空のスライスを返します。 122 func (ip IP) MarshalText() ([]byte, error) 123 124 // UnmarshalTextは [encoding.TextUnmarshaler] インターフェースを実装します。 125 // IPアドレスは [ParseIP] で受け入れられる形式で指定することが期待されています。 126 func (ip *IP) UnmarshalText(text []byte) error 127 128 // Equalは、ipとxが同じIPアドレスであるかどうかを報告します。 129 // IPv4アドレスと同じアドレスを持つIPv6形式は 130 // 同じものと見なされます。 131 func (ip IP) Equal(x IP) bool 132 133 // Sizeはマスクの先頭の1の数と合計のビット数を返します。 134 // マスクが正規の形式でない場合、つまり、1が0に続く形式でない場合は、 135 // Sizeは0, 0を返します。 136 func (m IPMask) Size() (ones, bits int) 137 138 // Stringは、句読点なしのmの16進数形式を返します。 139 func (m IPMask) String() string 140 141 // Containsは、ネットワークが指定したIPを含んでいるかどうかを報告します。 142 func (n *IPNet) Contains(ip IP) bool 143 144 // Networkはアドレスのネットワーク名、"ip+net"を返します。 145 func (n *IPNet) Network() string 146 147 // Stringは、CIDR表記であるnの文字列を返します。例えば「192.0.2.0/24」やRFC 4632およびRFC 4291で定義されている「2001:db8::/48」です。 148 // もしマスクが正規形式でない場合、IPアドレスに続いてスラッシュ文字とパンクチュエーションを含まない16進形式のマスクで表された文字列を返します。例えば「198.51.100.0/c000ff00」。 149 func (n *IPNet) String() string 150 151 // ParseIPは文字列sをIPアドレスと解釈し、結果を返します。 152 // 文字列sはIPv4点区切りの10進法(「192.0.2.1」)、IPv6(「2001:db8::68」)、またはIPv4-mapped IPv6形式(「::ffff:192.0.2.1」)で書かれている必要があります。 153 // もしsが有効なIPアドレスのテキスト表現ではない場合、ParseIPはnilを返します。 154 func ParseIP(s string) IP 155 156 // ParseCIDRはCIDR表記のIPアドレスとプレフィックス長を含むsを解析します。 157 // 例えば、"192.0.2.0/24"や"2001:db8::/32"のようなものです。 158 // RFC 4632とRFC 4291で定義されています。 159 // 160 // IPアドレスとプレフィックス長によって暗示されるIPとネットワークを返します。 161 // 例えば、ParseCIDR("192.0.2.1/24")はIPアドレスが 162 // 192.0.2.1でネットワークが192.0.2.0/24を返します。 163 func ParseCIDR(s string) (IP, *IPNet, error)