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