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)