github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/net/netip/netip.go (about) 1 // Copyright 2020 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 // パッケージnetipは、小さな値型であるIPアドレス型を定義します。 6 // この[Addr]型をベースに、パッケージは [AddrPort] (IPアドレスとポート)と [Prefix] (IPアドレスとビット長のプレフィックス)も定義します。 7 // 8 // [net.IP] 型と比較して、 [Addr] 型はメモリを少なく使用し、不変であり、比較可能(==およびマップキーとしてサポート)です。 9 package netip 10 11 import ( 12 "github.com/shogo82148/std/internal/intern" 13 ) 14 15 // Addrは、[net.IP]または[net.IPAddr]に似た、スコープ付きアドレスを持つIPv4またはIPv6アドレスを表します。 16 // 17 // [net.IP]または[net.IPAddr]とは異なり、Addrは比較可能な値型であり(==をサポートし、マップキーとして使用可能)、不変です。 18 // 19 // ゼロ値のAddrは有効なIPアドレスではありません。 20 // Addr{}は、0.0.0.0と::の両方とは異なります。 21 type Addr struct { 22 // addr is the hi and lo bits of an IPv6 address. If z==z4, 23 // hi and lo contain the IPv4-mapped IPv6 address. 24 // 25 // hi and lo are constructed by interpreting a 16-byte IPv6 26 // address as a big-endian 128-bit number. The most significant 27 // bits of that number go into hi, the rest into lo. 28 // 29 // For example, 0011:2233:4455:6677:8899:aabb:ccdd:eeff is stored as: 30 // addr.hi = 0x0011223344556677 31 // addr.lo = 0x8899aabbccddeeff 32 // 33 // We store IPs like this, rather than as [16]byte, because it 34 // turns most operations on IPs into arithmetic and bit-twiddling 35 // operations on 64-bit registers, which is much faster than 36 // bytewise processing. 37 addr uint128 38 39 // z is a combination of the address family and the IPv6 zone. 40 // 41 // nil means invalid IP address (for a zero Addr). 42 // z4 means an IPv4 address. 43 // z6noz means an IPv6 address without a zone. 44 // 45 // Otherwise it's the interned zone name string. 46 z *intern.Value 47 } 48 49 // IPv6LinkLocalAllNodesは、IPv6リンクローカル全ノードマルチキャストアドレスff02::1を返します。 50 func IPv6LinkLocalAllNodes() Addr 51 52 // IPv6LinkLocalAllRoutersは、IPv6リンクローカル全ルーターマルチキャストアドレスff02::2を返します。 53 func IPv6LinkLocalAllRouters() Addr 54 55 // IPv6Loopbackは、IPv6ループバックアドレス::1を返します。 56 func IPv6Loopback() Addr 57 58 // IPv6Unspecifiedは、IPv6未指定アドレス"::"を返します。 59 func IPv6Unspecified() Addr 60 61 // IPv4Unspecifiedは、IPv4未指定アドレス"0.0.0.0"を返します。 62 func IPv4Unspecified() Addr 63 64 // AddrFrom4は、addrのバイトで指定されたIPv4アドレスのアドレスを返します。 65 func AddrFrom4(addr [4]byte) Addr 66 67 // AddrFrom16は、addrのバイトで指定されたIPv6アドレスを返します。 68 // IPv4マップされたIPv6アドレスはIPv6アドレスのままです。 69 // (必要に応じて、Unmapを使用して変換してください。) 70 func AddrFrom16(addr [16]byte) Addr 71 72 // ParseAddrは、sをIPアドレスとして解析し、その結果を返します。 73 // 文字列sは、ドット付き10進表記("192.0.2.1")、IPv6("2001:db8::68")、 74 // またはスコープ付きアドレスゾーンを持つIPv6("fe80::1cc0:3e8c:119f:c2e1%ens18")のいずれかである必要があります。 75 func ParseAddr(s string) (Addr, error) 76 77 // / MustParseAddrは、[ParseAddr](s)を呼び出し、エラーが発生した場合にパニックを引き起こします。 78 // ハードコードされた文字列を使用したテストで使用することを目的としています。 79 func MustParseAddr(s string) Addr 80 81 // AddrFromSliceは、4バイトまたは16バイトのバイトスライスをIPv4またはIPv6アドレスとして解析します。 82 // [net.IP] は、[]byte引数として直接渡すことができます。 83 // スライスの長さが4または16でない場合、[Addr]{}、falseを返します。 84 func AddrFromSlice(slice []byte) (ip Addr, ok bool) 85 86 // IsValidは、[Addr] が初期化されたアドレス(ゼロのAddrではない)であるかどうかを報告します。 87 // 88 // "0.0.0.0"と"::"の両方が有効な値であることに注意してください。 89 func (ip Addr) IsValid() bool 90 91 // BitLenは、IPアドレスのビット数を返します。 92 // IPv6の場合は128、IPv4の場合は32、ゼロの [Addr] の場合は0です。 93 // 94 // IPv4マップされたIPv6アドレスはIPv6アドレスと見なされるため、ビット長は128になります。 95 func (ip Addr) BitLen() int 96 97 // Zoneは、ipのIPv6スコープ付きアドレッシングゾーンを返します(存在する場合)。 98 func (ip Addr) Zone() string 99 100 // Compareは、2つのIPを比較して整数を返します。 101 // ip == ip2の場合、結果は0になります。 102 // ip < ip2の場合、結果は-1になります。 103 // ip > ip2の場合、結果は+1になります。 104 // "less than"の定義は、[Addr.Less] メソッドと同じです。 105 func (ip Addr) Compare(ip2 Addr) int 106 107 // Lessは、ipがip2よりも前にソートされるかどうかを報告します。 108 // IPアドレスは、まず長さでソートされ、次にアドレスでソートされます。 109 // ゾーンを持つIPv6アドレスは、ゾーンのない同じアドレスの直後にソートされます。 110 func (ip Addr) Less(ip2 Addr) bool 111 112 // Is4は、ipがIPv4アドレスであるかどうかを報告します。 113 // 114 // IPv4マップされたIPv6アドレスの場合、falseを返します。[Addr.Unmap] を参照してください。 115 func (ip Addr) Is4() bool 116 117 // Is4In6は、ipがIPv4マップされたIPv6アドレスであるかどうかを報告します。 118 func (ip Addr) Is4In6() bool 119 120 // Is6は、IPv6アドレス、IPv4マップされたIPv6アドレスを含むかどうかを報告します。 121 func (ip Addr) Is6() bool 122 123 // Unmapは、IPv4マップされたIPv6アドレスのプレフィックスを削除したipを返します。 124 // 125 // つまり、ipがIPv4アドレスをラップしたIPv6アドレスである場合、 126 // ラップされたIPv4アドレスを返します。それ以外の場合は、ipを変更せずに返します。 127 func (ip Addr) Unmap() Addr 128 129 // WithZoneは、提供されたゾーンを持つipと同じIPを返します。 130 // zoneが空の場合、ゾーンは削除されます。 131 // ipがIPv4アドレスの場合、WithZoneは何も行わず、ipを変更せずに返します。 132 func (ip Addr) WithZone(zone string) Addr 133 134 // IsLinkLocalUnicastは、ipがリンクローカルユニキャストアドレスであるかどうかを報告します。 135 func (ip Addr) IsLinkLocalUnicast() bool 136 137 // IsLoopbackは、ipがループバックアドレスであるかどうかを報告します。 138 func (ip Addr) IsLoopback() bool 139 140 // IsMulticastは、ipがマルチキャストアドレスであるかどうかを報告します。 141 func (ip Addr) IsMulticast() bool 142 143 // IsInterfaceLocalMulticastは、ipがIPv6インターフェースローカルマルチキャストアドレスであるかどうかを報告します。 144 func (ip Addr) IsInterfaceLocalMulticast() bool 145 146 // IsLinkLocalMulticastは、ipがリンクローカルマルチキャストアドレスであるかどうかを報告します。 147 func (ip Addr) IsLinkLocalMulticast() bool 148 149 // IsGlobalUnicastは、ipがグローバルユニキャストアドレスであるかどうかを報告します。 150 // 151 // リンクローカルアドレススペースを除く、現在のIANA割り当て2000::/3のグローバルユニキャストスペース外にあるIPv6アドレスに対してtrueを返します。 152 // また、ipがIPv4プライベートアドレススペースまたはIPv6ユニークローカルアドレススペースにある場合でも、trueを返します。 153 // ゼロの [Addr] の場合はfalseを返します。 154 // 155 // 参考文献については、RFC 1122、RFC 4291、およびRFC 4632を参照してください。 156 func (ip Addr) IsGlobalUnicast() bool 157 158 // IsPrivateは、RFC 1918(IPv4アドレス)およびRFC 4193(IPv6アドレス)に従って、 159 // ipがプライベートアドレスであるかどうかを報告します。 160 // つまり、ipが10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、またはfc00::/7のいずれかであるかどうかを報告します。 161 // これは、[net.IP.IsPrivate] と同じです。 162 func (ip Addr) IsPrivate() bool 163 164 // IsUnspecifiedは、ipが未指定のアドレスであるかどうかを報告します。 165 // IPv4アドレス"0.0.0.0"またはIPv6アドレス"::"のいずれかです。 166 // 167 // ただし、ゼロの [Addr] は未指定のアドレスではありません。 168 func (ip Addr) IsUnspecified() bool 169 170 // Prefixは、IPの上位bビットのみを保持し、指定された長さのPrefixを生成します。 171 // ipがゼロの [Addr] の場合、Prefixは常にゼロのPrefixとnilエラーを返します。 172 // それ以外の場合、bitsが負の場合またはip.BitLen()より大きい場合、Prefixはエラーを返します。 173 func (ip Addr) Prefix(b int) (Prefix, error) 174 175 // As16は、IPアドレスを16バイトの表現で返します。 176 // IPv4アドレスはIPv4マップされたIPv6アドレスとして返されます。 177 // ゾーンを持つIPv6アドレスは、ゾーンを除いた形式で返されます(ゾーンを取得するには [Addr.Zone] メソッドを使用してください)。 178 // ゼロのAddrの場合は、すべてのバイトがゼロの値を返します。 179 func (ip Addr) As16() (a16 [16]byte) 180 181 // As4は、IPv4またはIPv4-in-IPv6アドレスを4バイトの表現で返します。 182 // ipがゼロの [Addr] またはIPv6アドレスの場合、As4はパニックを引き起こします。 183 // 0.0.0.0はゼロのAddrではないことに注意してください。 184 func (ip Addr) As4() (a4 [4]byte) 185 186 // AsSliceは、IPv4またはIPv6アドレスを、それぞれ4バイトまたは16バイトの表現で返します。 187 func (ip Addr) AsSlice() []byte 188 189 // Nextは、ipの次のアドレスを返します。 190 // アドレスが存在しない場合、ゼロの [Addr] を返します。 191 func (ip Addr) Next() Addr 192 193 // Prevは、ipの前のアドレスを返します。 194 // アドレスが存在しない場合、ゼロのAddrを返します。 195 func (ip Addr) Prev() Addr 196 197 // Stringは、IPアドレスipの文字列形式を返します。 198 // 返される形式は、次の5つのいずれかです。 199 // 200 // - ゼロの [Addr] の場合は "invalid IP" 201 // - IPv4ドット付き10進数表記 ("192.0.2.1") 202 // - IPv6表記 ("2001:db8::1") 203 // - [Addr.Is4In6] の場合は "::ffff:1.2.3.4" 204 // - ゾーンを持つIPv6表記 ("fe80:db8::1%eth0") 205 // 206 // 注意:パッケージnetのIP.Stringメソッドとは異なり、 207 // IPv4マップされたIPv6アドレスは、ドット区切りの4つ組の前に"::ffff:"の接頭辞が付きます。 208 func (ip Addr) String() string 209 210 // AppendToは、[Addr.MarshalText] によって生成されたipのテキストエンコーディングをbに追加し、拡張されたバッファを返します。 211 func (ip Addr) AppendTo(b []byte) []byte 212 213 // StringExpandedは、[Addr.String] と同様ですが、IPv6アドレスは先頭にゼロを付けて"::"の圧縮を行わずに展開されます。 214 // たとえば、"2001:db8::1"は"2001:0db8:0000:0000:0000:0000:0000:0001"になります。 215 func (ip Addr) StringExpanded() string 216 217 // MarshalTextは、[encoding.TextMarshaler] インターフェースを実装します。 218 // エンコーディングは、[Addr.String] が返すものと同じですが、1つの例外があります。 219 // ipがゼロの [Addr] の場合、エンコーディングは空の文字列になります。 220 func (ip Addr) MarshalText() ([]byte, error) 221 222 // UnmarshalTextは、[encoding.TextUnmarshaler] インターフェースを実装します。 223 // IPアドレスは、[ParseAddr] で受け入れられる形式で指定する必要があります。 224 // 225 // textが空の場合、UnmarshalTextは*ipをゼロの [Addr] に設定し、エラーを返しません。 226 func (ip *Addr) UnmarshalText(text []byte) error 227 228 // MarshalBinaryは、[encoding.BinaryMarshaler] インターフェースを実装します。 229 // ゼロの [Addr] の場合は長さ0のスライスを返し、IPv4アドレスの場合は4バイトの形式を、 230 // IPv6アドレスの場合はゾーンを追加した16バイトの形式を返します。 231 func (ip Addr) MarshalBinary() ([]byte, error) 232 233 // UnmarshalBinaryは、[encoding.BinaryUnmarshaler] インターフェースを実装します。 234 // MarshalBinaryによって生成された形式のデータを想定しています。 235 func (ip *Addr) UnmarshalBinary(b []byte) error 236 237 // AddrPortは、IPアドレスとポート番号です。 238 type AddrPort struct { 239 ip Addr 240 port uint16 241 } 242 243 // AddrPortFromは、提供されたIPとポート番号で [AddrPort] を返します。 244 // アロケーションは行いません。 245 func AddrPortFrom(ip Addr, port uint16) AddrPort 246 247 // Addrは、pのIPアドレスを返します。 248 func (p AddrPort) Addr() Addr 249 250 // Portは、pのポート番号を返します。 251 func (p AddrPort) Port() uint16 252 253 // ParseAddrPortは、sを [AddrPort] として解析します。 254 // 255 // 名前解決は行われません。アドレスとポートの両方が数値である必要があります。 256 func ParseAddrPort(s string) (AddrPort, error) 257 258 // MustParseAddrPortは、[ParseAddrPort](s)を呼び出し、エラーが発生した場合にパニックを引き起こします。 259 // テストでハードコードされた文字列を使用するために使用することを意図しています。 260 func MustParseAddrPort(s string) AddrPort 261 262 // IsValidは、p.Addr()が有効かどうかを報告します。 263 // ゼロを含むすべてのポートが有効です。 264 func (p AddrPort) IsValid() bool 265 266 // Compare returns an integer comparing two AddrPorts. 267 // The result will be 0 if p == p2, -1 if p < p2, and +1 if p > p2. 268 // AddrPorts sort first by IP address, then port. 269 func (p AddrPort) Compare(p2 AddrPort) int 270 271 func (p AddrPort) String() string 272 273 // AppendToは、[AddrPort.MarshalText] によって生成されたpのテキストエンコーディングをbに追加し、拡張されたバッファを返します。 274 func (p AddrPort) AppendTo(b []byte) []byte 275 276 // MarshalTextは、[encoding.TextMarshaler] インターフェースを実装します。 277 // エンコーディングは、[AddrPort.String] が返すものと同じですが、1つの例外があります。 278 // p.Addr()がゼロの [Addr] の場合、エンコーディングは空の文字列になります。 279 func (p AddrPort) MarshalText() ([]byte, error) 280 281 // UnmarshalTextは、encoding.TextUnmarshalerインターフェースを実装します。 282 // [AddrPort] は、[AddrPort.MarshalText] によって生成された形式のデータ、または [ParseAddrPort] で受け入れられる形式で指定する必要があります。 283 func (p *AddrPort) UnmarshalText(text []byte) error 284 285 // MarshalBinaryは、[encoding.BinaryMarshaler] インターフェースを実装します。 286 // これは、[Addr.MarshalBinary] に、リトルエンディアンで表されたポートを追加したものを返します。 287 func (p AddrPort) MarshalBinary() ([]byte, error) 288 289 // UnmarshalBinaryは、[encoding.BinaryUnmarshaler] インターフェースを実装します。 290 // これは、[AddrPort.MarshalBinary] によって生成された形式のデータを想定しています。 291 func (p *AddrPort) UnmarshalBinary(b []byte) error 292 293 // Prefixは、IPネットワークを表すIPアドレスプレフィックス(CIDR)です。 294 // 295 // [Addr]()の最初の [Prefix.Bits]()が指定されます。残りのビットは任意のアドレスに一致します。 296 // Bits()の範囲は、IPv4の場合は[0,32]、IPv6の場合は[0,128]です。 297 type Prefix struct { 298 ip Addr 299 300 // bitsPlusOne stores the prefix bit length plus one. 301 // A Prefix is valid if and only if bitsPlusOne is non-zero. 302 bitsPlusOne uint8 303 } 304 305 // PrefixFromは、指定されたIPアドレスとビットプレフィックス長で [Prefix] を返します。 306 // 307 // アロケーションは行いません。[Addr.Prefix] とは異なり、[PrefixFrom] はipのホストビットをマスクしません。 308 // 309 // bitsが負の場合またはip.BitLenより大きい場合、[Prefix.Bits] は無効な値-1を返します。 310 func PrefixFrom(ip Addr, bits int) Prefix 311 312 // Addrは、pのIPアドレスを返します。 313 func (p Prefix) Addr() Addr 314 315 // Bitsは、pのプレフィックス長を返します。 316 // 317 // 無効な場合は-1を報告します。 318 func (p Prefix) Bits() int 319 320 // IsValidは、p.Addr()に対してp.Bits()が有効な範囲であるかどうかを報告します。 321 // p.Addr()がゼロの [Addr] の場合、IsValidはfalseを返します。 322 // pがゼロの [Prefix] の場合、p.IsValid() == falseになることに注意してください。 323 func (p Prefix) IsValid() bool 324 325 // IsSingleIPは、pが正確に1つのIPを含むかどうかを報告します。 326 func (p Prefix) IsSingleIP() bool 327 328 // ParsePrefixは、sをIPアドレスプレフィックスとして解析します。 329 // 文字列は、RFC 4632およびRFC 4291で定義されたCIDR表記形式である場合があります。 330 // 文字列は、"192.168.1.0/24"または"2001:db8::/32"のようになります。 331 // IPv6ゾーンはプレフィックスで許可されていません。ゾーンが存在する場合は、エラーが返されます。 332 // 333 // マスクされたアドレスビットはゼロになりません。そのため、Maskedを使用してください。 334 func ParsePrefix(s string) (Prefix, error) 335 336 // MustParsePrefixは、[ParsePrefix](s)を呼び出し、エラーが発生した場合にパニックを引き起こします。 337 // テストでハードコードされた文字列を使用するために使用することを意図しています。 338 func MustParsePrefix(s string) Prefix 339 340 // Maskedは、pを正規形式で返します。p.Addr()の高位p.Bits()ビット以外はすべてマスクされます。 341 // 342 // pがゼロまたは無効な場合、Maskedはゼロの [Prefix] を返します。 343 func (p Prefix) Masked() Prefix 344 345 // Containsは、ネットワークpがipを含むかどうかを報告します。 346 // 347 // IPv4アドレスはIPv6プレフィックスに一致しません。 348 // IPv4マップされたIPv6アドレスはIPv4プレフィックスに一致しません。 349 // ゼロ値のIPはどのプレフィックスにも一致しません。 350 // ipがIPv6ゾーンを持つ場合、Prefixesはゾーンを削除するため、Containsはfalseを返します。 351 func (p Prefix) Contains(ip Addr) bool 352 353 // Overlapsは、pとoが共通のIPアドレスを含むかどうかを報告します。 354 // 355 // pとoが異なるアドレスファミリであるか、どちらかがゼロのIPである場合、falseを報告します。 356 // Containsメソッドと同様に、IPv4マップされたIPv6アドレスを持つプレフィックスは、IPv6マスクとして扱われます。 357 func (p Prefix) Overlaps(o Prefix) bool 358 359 // AppendToは、[Prefix.MarshalText] によって生成されたpのテキストエンコーディングをbに追加し、拡張されたバッファを返します。 360 func (p Prefix) AppendTo(b []byte) []byte 361 362 // MarshalTextは、[encoding.TextMarshaler] インターフェースを実装します。 363 // エンコーディングは、[Prefix.String] が返すものと同じですが、1つの例外があります。 364 // pがゼロ値の場合、エンコーディングは空の文字列になります。 365 func (p Prefix) MarshalText() ([]byte, error) 366 367 // UnmarshalTextは、encoding.TextUnmarshalerインターフェースを実装します。 368 // IPアドレスは、[ParsePrefix]で受け入れられる形式で指定する必要があります。 369 // または、[Prefix.MarshalText] によって生成された形式である必要があります。 370 func (p *Prefix) UnmarshalText(text []byte) error 371 372 // MarshalBinaryは、[encoding.BinaryMarshaler] インターフェースを実装します。 373 // これは、[Addr.MarshalBinary] に、プレフィックスビットを表す追加のバイトを追加したものを返します。 374 func (p Prefix) MarshalBinary() ([]byte, error) 375 376 // UnmarshalBinaryは、[encoding.BinaryUnmarshaler] インターフェースを実装します。 377 // これは、[Prefix.MarshalBinary] によって生成された形式のデータを想定しています。 378 func (p *Prefix) UnmarshalBinary(b []byte) error 379 380 // Stringは、pのCIDR表記を返します: "<ip>/<bits>"。 381 func (p Prefix) String() string