Provided by: manpages-ja_0.5.0.0.20221215+dfsg-1_all bug

名前

       ip - Linux IPv4 プロトコルの実装

書式

       #include <sys/socket.h>
       #include <netinet/in.h>
       #include <netinet/ip.h> /* 上記のスーパーセット */

       tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
       udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
       raw_socket = socket(AF_INET, SOCK_RAW, protocol);

説明

       Linux  は  RFC 791  と RFC 1122 で記述されている Internet Protocol, version 4 を実装してい
       る。 ip には RFC 1112 に準拠した level 2 マルチキャストの実装が含まれている。 またパケット
       フィルタ機能を含む IP ルーターも実装されている。

       プログラミングインターフェースは BSD ソケットと互換である。 ソケットに関するより詳細な情報
       は socket(7)  を参照のこと。

       An IP socket is created using socket(2):

           socket(AF_INET, socket_type, protocol);

       Valid socket types include SOCK_STREAM to open a  stream  socket,  SOCK_DGRAM  to  open  a
       datagram socket, and SOCK_RAW to open a raw(7) socket to access the IP protocol directly.

       protocol  is  the  IP  protocol in the IP header to be received or sent.  Valid values for
       protocol include:

       • 0 and IPPROTO_TCP for tcp(7)  stream sockets;

       • 0 and IPPROTO_UDP for udp(7)  datagram sockets;

       • IPPROTO_SCTP for sctp(7)  stream sockets; and

       • IPPROTO_UDPLITE for udplite(7)  datagram sockets.

       For SOCK_RAW you may specify a  valid  IANA  IP  protocol  defined  in  RFC 1700  assigned
       numbers.

       あるプロセスで、やってくるパケットを受信したり 接続要求を受けたりしたい場合には、 そのプロ
       セスはローカルなインターフェースアドレスに、 bind(2)  を用いてソケットをバインドしなければ
       ならない。 この場合、 ローカルの「アドレスとポート」のペアに対してバインドできる IP ソケッ
       トは一つだけである。 bind(2) の呼び出しで INADDR_ANY  が指定されていた場合は、  ソケットは
       すべて のローカルインターフェースにバインドされる。 listen(2) がバインドされていないソケッ
       トに対してコールされると、 そのソケットは、 ローカルポートはランダムに選択された空いている
       ポートで、  ローカルアドレスは INADDR_ANY で自動的にバインドされる。 connect(2) がバインド
       されていないソケットに対してコールされると、 そのソケットは、 ローカルポートはランダムに選
       択された空いているポートか未使用の共有ポートで、  ローカルアドレスは INADDR_ANY で自動的に
       バインドされる。

       SO_REUSEADDR フラグがセットされていない場合には、 バインドされていた TCP  ローカルソケット
       アドレスは クローズされた後しばらくの間使えなくなる。 SO_REUSEADDR フラグを使うと TCP の信
       頼性を低下させるので、 使うときには注意が必要である。

   アドレスのフォーマット
       IP ソケットアドレスは、 IP インターフェースアドレスと 16ビットのポート番号の組み合わせで定
       義される。  IP プロトコルそのものはポート番号を扱わない。 ポート番号は、 udp(7)  や tcp(7)
       といった、上位のプロトコルで実装される。 raw ソケットでは、 sin_port  が  IP  プロトコルに
       セットされる。

           struct sockaddr_in {
               sa_family_t    sin_family; /* address family: AF_INET */
               in_port_t      sin_port;   /* port in network byte order */
               struct in_addr sin_addr;   /* internet address */
           };

           /* Internet address. */
           struct in_addr {
               uint32_t       s_addr;     /* address in network byte order */
           };

       sin_family  is  always  set  to  AF_INET.   This is required; in Linux 2.2 most networking
       functions return EINVAL when this setting is  missing.   sin_port  contains  the  port  in
       network  byte  order.   The  port  numbers  below  1024  are  called  privileged ports (or
       sometimes: reserved ports).  Only a privileged process (on Linux: a process that  has  the
       CAP_NET_BIND_SERVICE capability in the user namespace governing its network namespace) may
       bind(2)  to these sockets.  Note that the raw IPv4 protocol as such has no  concept  of  a
       port, they are implemented only by higher protocols like tcp(7)  and udp(7).

       sin_addr  is  the  IP host address.  The s_addr member of struct in_addr contains the host
       interface address in network byte order.  in_addr should be assigned one of  the  INADDR_*
       values   (e.g.,   INADDR_LOOPBACK)    using  htonl(3)   or  set  using  the  inet_aton(3),
       inet_addr(3), inet_makeaddr(3)  library functions or directly with the name resolver  (see
       gethostbyname(3)).

       IPv4 アドレスには、ユニキャストアドレス、 ブロードキャストアドレス、マルチキャストアドレス
       がある。 ユニキャストアドレスは、あるホストの一つのアドレスを指定する。 ブロードキャストア
       ドレスは、あるネットワーク上の全てのホストを指定する。    マルチキャストアドレスは、マルチ
       キャストグループに所属する  全てのホストを指定する。ブロードキャストアドレスへのデータグラ
       ムは、  SO_BROADCAST ソケットフラグがセットされていないと送信・受信できない。 現在の実装で
       は、接続指向のソケットにはユニキャストアドレスしか使えない。

       アドレスとポートは常にネットワークバイトオーダーで格納されることに注意せよ。      具体的に
       は、ポートを指定する数値には  htons(3)  を呼び出す必要がある。  標準ライブラリにあるアドレ
       ス/ポート操作関数は すべてネットワークバイトオーダーで動作する。

       特別なアドレスがいくつか存在する: INADDR_LOOPBACK(127.0.0.1)  は loopback デバイスを通して
       常にローカルなホストを参照する。 INADDR_ANY(0.0.0.0)  は任意のアドレスを意味し、バインド用
       である。 INADDR_BROADCAST(255.255.255.255)  は任意のホストを意味し、歴史的理由から、バイン
       ドの際には INADDR_ANY と同じ効果になる。

   ソケットオプション
       IP   にはプロトコル固有のソケットオプションがいくつか存在し、   setsockopt(2)   で設定が、
       getsockopt(2) で取得ができる。 IP のソケットオプションレベルは IPPROTO_IP である。  ブール
       整数値のフラグでは、 0 は偽、それ以外は真を意味する。

       When  an  invalid  socket option is specified, getsockopt(2)  and setsockopt(2)  fail with
       the error ENOPROTOOPT.

       IP_ADD_MEMBERSHIP (Linux 1.2 以降)
              マルチキャストグループに参加する。 引数は ip_mreqn 構造体である。

           struct ip_mreqn {
               struct in_addr imr_multiaddr; /* IP multicast group
                                                address */
               struct in_addr imr_address;   /* IP address of local
                                                interface */
               int            imr_ifindex;   /* interface index */
           };

       imr_multiaddr には、アプリケーションが参加または脱退したい  マルチキャストグループのアドレ
       スが入る。  指定するアドレスは有効なマルチキャストアドレスでなければならない (さもなければ
       setsockopt(2)  がエラー EINVAL で失敗する)。 imr_address  はシステムがマルチキャストグルー
       プに参加する際に用いる  ローカルなインターフェースのアドレスである。  これが INADDR_ANY で
       あった場合には、適切なインターフェースがシステムによって選択される。    imr_ifindeximr_multiaddr  グループに参加/脱退するインターフェースの interface index である。 どのイン
       ターフェースでもよい場合は 0 にする。

              The ip_mreqn structure is available only since Linux 2.2.  For  compatibility,  the
              old ip_mreq structure (present since Linux 1.2) is still supported; it differs from
              ip_mreqn only by not including the imr_ifindex field.  (The kernel determines which
              structure is being passed based on the size passed in optlen.)

              IP_ADD_MEMBERSHIP is valid only for setsockopt(2).

       IP_ADD_SOURCE_MEMBERSHIP (Linux 2.4.22 以降 / 2.5.68 以降)
              マルチキャストグループに参加、指定された送信元からのデータの受信のみを許可する。 引
              数は ip_mreq_source 構造体である。

           struct ip_mreq_source {
               struct in_addr imr_multiaddr;  /* IP multicast group
                                                 address */
               struct in_addr imr_interface;  /* IP address of local
                                                 interface */
               struct in_addr imr_sourceaddr; /* IP address of
                                                 multicast source */
           };

       ip_mreq_source   構造体は   IP_ADD_MEMBERSHIP   の項で説明した    ip_mreqn    に似ている。
       imr_multiaddr フィールドには、アプリケーションが参加または脱退したいマルチキャストグループ
       のアドレスが入る。 imr_interface フィールドは、 マルチキャストグループに参加する際に  シス
       テムが使用すべきローカルインターフェースのアドレスである。   imr_sourceaddr   フィールドに
       は、アプリケーションがデータを受信したい送信元のアドレスが入る。

              このオプションを複数回使うことで、 複数の送信元からのデータ受信を許可することができ
              る。

       IP_BIND_ADDRESS_NO_PORT (Linux 4.2 以降)
              Inform  the  kernel to not reserve an ephemeral port when using bind(2) with a port
              number of 0.  The port will later be automatically chosen at connect(2)  time, in a
              way that allows sharing a source port as long as the 4-tuple is unique.

       IP_BLOCK_SOURCE (since Linux 2.4.22 以降 / 2.5.68 以降)
              指定したグループで、指定した送信元からのマルチキャストデータの受信を停止する。 この
              オプションは、アプリケーションが IP_ADD_MEMBERSHIPIP_ADD_SOURCE_MEMBERSHIP のい
              ずれかを使ってマルチキャストグループに参加した後でのみ有効である。

              引数は ip_mreq_source 構造体である。 IP_ADD_SOURCE_MEMBERSHIP の項に説明がある。

       IP_DROP_MEMBERSHIP (Linux 1.2 以降)
              マルチキャストグループから抜ける。引数は IP_ADD_MEMBERSHIP と同様に ip_mreqn または
              ip_mreq 構造体である。

       IP_DROP_SOURCE_MEMBERSHIP (Linux 2.4.22 以降 / 2.5.68 以降)
              送信元を指定してグループから抜ける。 つまり、  指定したマルチキャストグループの指定
              された送信元からのデータ受信を停止する。 アプリケーションは同じマルチキャストグルー
              プで複数の送信元を購読 (subscribe) している場合には、  残りの送信元からのデータの受
              信は引き続き配信される。         すべての送信元からのデータ受信を一度で停止するには
              IP_DROP_MEMBERSHIP を使うこと。

              引数は ip_mreq_source 構造体である。 IP_ADD_SOURCE_MEMBERSHIP の項に説明がある。

       IP_FREEBIND (Linux 2.4 以降)
              このブール値のオプションを有効にすると、ローカルではない IP  アドレスや存在  しない
              IP  アドレスをバインドできるようになる。これを使うと、対応するネット ワークインター
              フェイスがなかったり、アプリケーションがソケットをバインドしようと する時点で特定の
              動的     IP    アドレスが有効になっていなかったりしても、ソケットを    接続待ち状態
              (listening)         にできるようになる。         このオプションは、下記に説明がある
              ip_nonlocal_bind /proc インターフェイス のソケット単位の設定である。

       IP_HDRINCL (Linux 2.0 以降)
              If  enabled,  the user supplies an IP header in front of the user data.  Valid only
              for SOCK_RAW sockets; see raw(7)  for more information.  When this flag is enabled,
              the values set by IP_OPTIONS, IP_TTL, and IP_TOS are ignored.

       IP_MSFILTER (since Linux 2.4.22 以降 / 2.5.68 以降)
              このオプションを使うと、  高度なフィルタリング API へアクセスできる。 この API では
              すべての状態にアクセスできる。 引数は ip_msfilter 構造体である。

           struct ip_msfilter {
               struct in_addr imsf_multiaddr; /* IP multicast group
                                                 address */
               struct in_addr imsf_interface; /* IP address of local
                                                 interface */
               uint32_t       imsf_fmode;     /* Filter-mode */

               uint32_t       imsf_numsrc;    /* Number of sources in
                                                 the following array */
               struct in_addr imsf_slist[1];  /* Array of source
                                                 addresses */
           };

       MCAST_INCLUDEMCAST_EXCLUDE の 2 つのマクロがあり、  フィルタリングモードを指定するのに
       使用できる。 また、 IP_MSFILTER_SIZE(n) マクロがあり、 送信元リストに n 個の送信元が入った
       ip_msfilter 構造体を格納するのに必要なメモリー量を判定することができる。

              マルチキャスト送信元フィルタリングの全容は RFC 3376 を参照のこと。

       IP_MTU (Linux 2.2 以降)
              Retrieve the current known path MTU of the current socket.  Returns an integer.

              IP_MTU is valid only for getsockopt(2)  and can be employed only  when  the  socket
              has been connected.

       IP_MTU_DISCOVER (Linux 2.2 以降)
              ソケットの  Path MTU Discovery の設定をセット・取得する。 有効になっていると、Linux
              は SOCK_STREAM ソケットに対して RFC 1191 で定義されている Path MTU  Discovery  を行
              う。  SOCK_STREAM でないソケットについては、 IP_PMTUDISC_DO をセットすると、 全ての
              送信パケットでフラグメント不許可フラグ (don't-fragment flag) が必ず  セットされるよ
              うになる。  SOCK_STREAM  でないソケットでは、 パケットを MTU のサイズの塊に分割した
              り、必要に応じて再送したりするのは、 ユーザーが責任を持って行う必要がある。  既知の
              Path MTU よりも大きなデータグラムの送信が要求されると、 カーネルは (EMSGSIZE で) 送
              信を拒否する。 IP_PMTUDISC_WANT の場合は、 Path MTU  に基づいて必要であればデータグ
              ラム の分割が行われ、それ以外の場合はフラグメント不許可フラグがセットされる。

              システム全体のデフォルトは IP_PMTUDISC_WANTIP_PMTUDISC_DONT の どちらかに設定す
              ることができる。設定の変更は、   /proc/sys/net/ipv4/ip_no_pmtu_disc   ファイルに、0
              (IP_PMTUDISC_WANT) か 0 以外 (IP_PMTUDISC_DONT) を書き込むことで行う。

              Path MTU discovery 値   意味
              IP_PMTUDISC_WANT        ルートごとの設定を用いる。
              IP_PMTUDISC_DONT        Path MTU Discovery を行わない。
              IP_PMTUDISC_DO          常に Path MTU Discovery を行う。
              IP_PMTUDISC_PROBE       DFビットをセットするが、Path MTU を無視する。

              path  MTU  discovery が有効になっていると、カーネルは宛先ホストごとに 自動的に path
              MTU を処理する。特定の相手に connect(2)  で接続した場合には、  IP_MTU  ソケットオプ
              ションを用いれば、既知の  path MTU の取得に便利である (たとえば EMSGSIZE エラーが起
              きた後など)。 path MTU は時間とともに変化する かもしれない。 宛先がたくさんあるコネ
              クションレスなソケットでは、  与えられた 宛先に対する新しい MTU にも、 エラーキュー
              を用いてアクセスすることができる (IP_RECVERR を見よ)。 MTU 更新が到着するごとに、新
              たなエラーがキューイング される。

              MTU discovery の進行中には、データグラムソケットからの初期パケットは 到着しないかも
              しれない。 UDP を用いるアプリケーションでは、 このことを気にかけておき、 パケットの
              再送アルゴリズムにこの分を除外させるべきである。

              To  bootstrap the path MTU discovery process on unconnected sockets, it is possible
              to start with a big datagram size (headers up to 64  kilobytes  long)  and  let  it
              shrink by updates of the path MTU.

              path  MTU の値をまず見積もってみるには、宛先アドレスに connect(2)  を使ってデータグ
              ラムソケットを接続し、 getsockopt(2)  を IP_MTU オプションとともに呼び、 MTU を取得
              することである。

              IP_PMTUDISC_PROBE  (Linux  2.6.22  以降で利用可能) を設定することで、 SOCK_DGRAMSOCK_RAW のソケットで RFC 4821 の MTU 探索を実装することが可能である。 また、この機
              能は、 tracepath(8) のような診断ツールで特に有用である。これらのツールでは、 観測さ
              れた Path MTU よりも大きな探索パケットを意図的に 送信しようとする。

       IP_MULTICAST_ALL (Linux 2.6.31 以降)
              このオプションを使って、 マルチキャストメッセージの、  ワイルドカードの  INADDR_ANY
              アドレスにバインドされているソケットへの  配送ポリシーを変更することができる。 引数
              はブート値の整数で、 デフォルト値は 1 である。 このオプションを 1  に設定されている
              場合、そのソケットでは、このシステムで参加しているすべてのグループからのメッセージ
              が受信される。      それ以外の場合は、そのソケットでは、       そのソケットに対して
              (IP_ADD_MEMBERSHIP などを使って) 明示的に参加が指定されたグループからのメッセージだ
              けが受信される。

       IP_MULTICAST_IF (Linux 1.2 以降)
              Set the local device for a multicast socket.  The argument for setsockopt(2)  is an
              ip_mreqn  or  (since Linux 3.5)  ip_mreq structure similar to IP_ADD_MEMBERSHIP, or
              an in_addr structure.  (The kernel determines which structure is being passed based
              on  the  size  passed  in  optlen.)   For getsockopt(2), the argument is an in_addr
              structure.

       IP_MULTICAST_LOOP (Linux 1.2 以降)
              マルチキャストパケットをローカルなソケットにループバックするかどうかを 定めるブール
              値の整数引数を設定・取得する。

       IP_MULTICAST_TTL (Linux 1.2 以降)
              このソケットから発信されるマルチキャストパケットの   time-to-live  値を設定・取得す
              る。 マルチキャストパケットに対しては、できるだけ小さな TTL  に設定することがとても
              重要である。デフォルトは  1  で、 ユーザープログラムが明示的に要求しない限り マルチ
              キャストパケットはローカルなネットワークから出ないことになる。 引数に整数を取る。

       IP_NODEFRAG (Linux 2.6.36 以降)
              If enabled (argument is nonzero), the reassembly of outgoing packets is disabled in
              the netfilter layer.  The argument is an integer.

              This option is valid only for SOCK_RAW sockets.

       IP_OPTIONS (Linux 2.0 以降)
              このソケットから送られるパケット全てに付随する IP オプションを 設定・取得する。オプ
              ションを保存しているメモリーバッファーへのポインターと オプションの長さとを引数に取
              る。  setsockopt(2)  を呼び出すと、ソケットに関連づけられる IP オプションを設定でき
              る。 IPv4 におけるオプションのサイズの最大値は 40 バイトである。 用いることのできる
              オプションについては  RFC 791  を見よ。  SOCK_STREAM ソケットに対する初期接続要求パ
              ケットに IP オプションが含まれていると、 ルーティングヘッダーを付けて戻されてくる初
              期パケットの IP オプションに同じオプションがセットされる。接続が確立された後、 やっ
              てきたパケットのオプションを変更することはできない。 デフォルトでは。外部から受信し
              たパケットの全ての  source routing オプション の処理は無効となっており、 /proc イン
              ターフェースの accept_source_route を使うとこれを有効にできる。これを無効にしていて
              も  timestamps など の他のオプションの処理は行われる。データグラムソケットでは、 IP
              オプションはローカルユーザーしか設定できない。 getsockopt(2)  を IP_OPTIONS  をつけ
              て呼ぶと、現在送信に用いられている IP オプションを 引数に与えたバッファーに取得でき
              る。

       IP_PASSSEC (Linux 2.6.17 以降)
              If labeled IPSEC or NetLabel is configured on the sending and receiving hosts, this
              option enables receiving of the security context of the peer socket in an ancillary
              message of type SCM_SECURITY retrieved using recvmsg(2).  This option is  supported
              only  for  UDP  sockets;  for  TCP  or  SCTP  sockets,  see  the description of the
              SO_PEERSEC option below.

              The value given as an argument to setsockopt(2)  and  returned  as  the  result  of
              getsockopt(2)  is an integer boolean flag.

              The  security context returned in the SCM_SECURITY ancillary message is of the same
              format as the one described under the SO_PEERSEC option below.

              Note: the reuse of the SCM_SECURITY message type for the IP_PASSSEC  socket  option
              was  likely  a  mistake,  since  other  IP control messages use their own numbering
              scheme in the IP namespace and often use the socket option  value  as  the  message
              type.   There  is  no conflict currently since the IP option with the same value as
              SCM_SECURITY is IP_HDRINCL and this is never used for a control message type.

       IP_PKTINFO (Linux 2.2 以降)
              IP_PKTINFO 補助メッセージを渡す。これには到着パケットに関する情報を提供する pktinfo
              構造体が含まれている。      データグラム指向のソケットでしか動作しない。     引数は
              IP_PKTINFO  メッセージを通過させるかどうかをソケットに知らせるフラグである。   メッ
              セージ自身は  recvmsg(2)  または sendmsg(2)  を用いたパケットの制御メッセージとして
              のみ送受信できる。

                  struct in_pktinfo {
                      unsigned int   ipi_ifindex;  /* Interface index */
                      struct in_addr ipi_spec_dst; /* Local address */
                      struct in_addr ipi_addr;     /* Header Destination
                                                      address */
                  };

              ipi_ifindex  はパケットが受信されたインターフェースの、他と重ならないインデックスで
              ある。  ipi_spec_dst  はパケットのローカルアドレスである。  ipi_addr はパケットヘッ
              ダーにある宛先アドレスである。   IP_PKTINFOsendmsg(2)     に渡されて、かつ
              ipi_spec_dst  が  0  以外の場合、 ipi_spec_dst はルーティングテーブルを検索する際に
              ローカルな送信元アドレスとして使用され、 IP source route オプションを設定するのにも
              使用される。  ipi_ifindex  が  0 以外の場合、このインデックスによって指定されるイン
              ターフェースの プライマリローカルアドレスで  ipi_spec_dst  を上書きし、ルーティング
              テーブルを検索する。

       IP_RECVERR (Linux 2.2 以降)
              エラーメッセージの受け渡しに、信頼性の高い拡張された方法を有効にする。 データグラム
              ソケットに対して有効になっていると、 発生したエラーは全てソケットごとのエラーキュー
              に保存される。  ユーザーはソケット操作からエラーを受け取ったとき、  recvmsg(2)   を
              MSG_ERRQUEUE   フラグとともに呼べばそのエラーを取得できる。    そのエラーを記述する
              sock_extended_err  構造体が、タイプ IP_RECVERR・ レベル IPPROTO_IP の補助メッセージ
              として渡される。 これは接続志向でないソケットで信頼性の高いエラー処理を行いたい場合
              に 有用である。エラーキューの受信データフラグメントには エラーパケットが含まれる。

              IP_RECVERR 制御メッセージには sock_extended_err 構造体が含まれる:

                  #define SO_EE_ORIGIN_NONE    0
                  #define SO_EE_ORIGIN_LOCAL   1
                  #define SO_EE_ORIGIN_ICMP    2
                  #define SO_EE_ORIGIN_ICMP6   3

                  struct sock_extended_err {
                      uint32_t ee_errno;   /* error number */
                      uint8_t  ee_origin;  /* where the error originated */
                      uint8_t  ee_type;    /* type */
                      uint8_t  ee_code;    /* code */
                      uint8_t  ee_pad;
                      uint32_t ee_info;    /* additional information */
                      uint32_t ee_data;    /* other data */
                      /* More data may follow */
                  };

                  struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);

              ee_errno にはキューに入っているエラーの errno 番号が入る。 ee_origin にはエラーが発
              生した場所を示すコードが入る。           その他のフィールドはプロトコル依存である。
              SO_EE_OFFENDER  マクロは与えられた補助メッセージへのポインターから エラーの発生した
              ネットワークオブジェクトのアドレスへのポインターを返す。     アドレスが不明な場合、
              sockaddr 構造体の sa_family フィールドは AF_UNSPEC となり、その他のフィールド値は不
              定である。

              IP は以下のような sock_extended_err 構造体を用いる: ee_origin は、エラー が ICMP パ
              ケットとして受信された場合には  SO_EE_ORIGIN_ICMP にセットされ、 ローカルで起こった
              場合には SO_EE_ORIGIN_LOCAL にセットされる。  不明な値は  無視される。  ee_typeee_code  は  ICMP  ヘッダーの type フィールドと code フィールドの値にセットされる。
              ee_info には EMSGSIZE エラーに対す る discover された MTU が入る。 メッセージにはエ
              ラーを引き起こしたノードの  sockaddr_in  構造体も含まれる。 これには SO_EE_OFFENDER
              マクロを使ってア  クセスできる。  ソースが不明の場合、  SO_EE_OFFENDER   アドレスの
              sin_family  フィールドは AF_UNSPEC となる。 エラーがネットワークで起きた 場合には、
              ソケットで有効になっていたすべての IP オプション (IP_OPTIONS, IP_TTL など) とエラー
              パケットに含まれていたすべての  IP オプションとが、 制 御メッセージとして渡される。
              エラーを起こしたパケットのペイロード (payload) は  普通のペイロードとして返される。
              TCP  にはエラーキューがないことに注意して  ほしい。  MSG_ERRQUEUESOCK_STREAM ソ
              ケットに対しては使えない。 TCP では IP_RECVERR だけが有効だが、ソケット関数から返さ
              れるエラーは SO_ERROR だけになる。

              raw  ソケットに対して IP_RECVERR を指定すると、受信したすべての ICMP エラーをアプリ
              ケーションに 渡すようになる。指定しないと、  接続済みのソケットに対するエラーだけを
              報告する。

              このオプションはブール値のフラグを設定・取得する。  IP_RECVERR はデフォルトではオフ
              になっている。

       IP_RECVOPTS (Linux 2.2 以降)
              到着した全ての IP オプションを IP_OPTION コントロールメッセージに入れてユーザーに渡
              す。  ルーティングヘッダーとその他のオプションとは、 ローカルホストに対してはあらか
              じめ記入されている。 SOCK_STREAM ソケットではサポートされていない。

       IP_RECVORIGDSTADDR (Linux 2.6.29 以降)
              このブール値のオプションがセットされると、 recvmsg(2)  で  IP_ORIGDSTADDR  補助メッ
              セージが有効になる。 カーネルはデータグラムを受信した元の宛先アドレスをこの補助メッ
              セージで返す。 この補助メッセージには struct sockaddr_in が格納される。

       IP_RECVTOS (Linux 2.2 以降)
              有効になっていると、 IP_TOS 補助メッセージが到着パケットとともに渡される。 これには
              パケットヘッダーの  Service/Precedence フィールドのタイプを指定するバイトデータが含
              まれている。 ブール整数値のフラグをとる。

       IP_RECVTTL (Linux 2.2 以降)
              When this flag is set, pass a IP_TTL control message with the time-to-live field of
              the received packet as a 32 bit integer.  Not supported for SOCK_STREAM sockets.

       IP_RETOPTS
              IP_RETOPTS  (Linux 2.2 以降)  IP_RECVOPTS と等価だが、未処理の生のオプションを、 こ
              の hop では記入されない timestamp レコードと route レコードとともに返す。

       IP_ROUTER_ALERT (Linux 2.2 以降)
              Pass all to-be forwarded packets with the  IP  Router  Alert  option  set  to  this
              socket.   Valid only for raw sockets.  This is useful, for instance, for user-space
              RSVP daemons.  The tapped packets are not forwarded by the kernel; it is the user's
              responsibility to send them out again.  Socket binding is ignored, such packets are
              filtered only by protocol.  Expects an integer flag.

       IP_TOS (Linux 1.0 以降)
              このソケットから送信されるすべての IP  パケットに適用される  Type-Of-Service  (TOS)
              フィールドを設定・取得する。 これはネットワーク上でのパケットの優先度を決めるために
              用いられる。 TOS はバイトデータである。標準の TOS  フラグがいくつか定義されている。
              IPTOS_LOWDELAY                 はインタラクティブなトラフィックの遅延を最小にする。
              IPTOS_THROUGHPUT はスループットを最大にする。 IPTOS_RELIABILITY  は信頼性を最高にす
              る。 IPTOS_MINCOST は転送速度が遅くてもかまわないとき、「データを詰め込む」のに用い
              られる。 これらのうち、 1  つまでだけを設定できる。  他のビットは無効で、クリアされ
              る。  Linux  はデフォルトでは  IPTOS_LOWDELAY  データグラムを最初に送信する。  しか
              し、正確な振る舞いはキュー処理の設定に依存する。   高い優先度にするにはスーパーユー
              ザー権限 (CAP_NET_ADMIN ケーパビリティ) が必要となるかもしれない。

       IP_TRANSPARENT (Linux 2.6.24 以降)
              このブール値のオプションを有効にすると、   このソケットで透過プロキシ  (transparent
              proxy)  ができるようになる。   このソケットオプションを使うと、呼び出したアプリケー
              ションは、 ローカルではない IP アドレスをバインドして、ローカルの端点として自分以外
              のアドレス (foreign address) を持つクライアントやサーバの両方として動作できるように
              なる。 注意: この機能が動作するためには、自分以外のアドレス宛のパケットが透過プロキ
              シが動作するマシン (すなわちソケットオプション IP_TRANSPARENT  を利用するアプリケー
              ションが動作しているシステム) 経由で転送されるように、 ルーティングが設定される必要
              がある。               このソケットオプションを有効にするには、スーパーユーザー特権
              (CAP_NET_ADMIN ケーパビリティ) が必要である。

              iptables の TPROXY ターゲットで透過プロキシリダイレクション (TProxy redirection) を
              行うには、リダイレクトされるソケットに対して このオプションを設定する必要がある。

       IP_TTL (Linux 1.0 以降)
              time-to-live フィールドの値を設定または取得する。  この値はこのソケットから送信され
              るすべてのパケットに用いられる。

       IP_UNBLOCK_SOURCE (Linux 2.4.22 以降 / 2.5.68 以降)
              それ以前はブロックされていたマルチキャストの送信元のブロックを解除する。 指定した送
              信元がブロックされていない場合は EADDRNOTAVAIL を返す。

              引数は ip_mreq_source 構造体である。 IP_ADD_SOURCE_MEMBERSHIP の項に説明がある。

       SO_PEERSEC (Linux 2.6.17 以降)
              If labeled IPSEC or NetLabel is configured on both the sending and receiving hosts,
              this  read-only  socket  option  returns  the  security  context of the peer socket
              connected to this socket.  By default, this  will  be  the  same  as  the  security
              context of the process that created the peer socket unless overridden by the policy
              or by a process with the required permissions.

              The argument to getsockopt(2)  is a pointer to a buffer of the specified length  in
              bytes  into which the security context string will be copied.  If the buffer length
              is less than the length of the security context string, then getsockopt(2)  returns
              -1,  sets  errno to ERANGE, and returns the required length via optlen.  The caller
              should allocate at least NAME_MAX bytes for the buffer initially, although this  is
              not  guaranteed  to  be sufficient.  Resizing the buffer to the returned length and
              retrying may be necessary.

              The security context string  may  include  a  terminating  null  character  in  the
              returned  length, but is not guaranteed to do so: a security context "foo" might be
              represented as either {'f','o','o'} of length 3 or {'f','o','o','\0'} of length  4,
              which  are  considered  to  be  interchangeable.  The string is printable, does not
              contain non-terminating null characters, and is  in  an  unspecified  encoding  (in
              particular, it is not guaranteed to be ASCII or UTF-8).

              The use of this option for sockets in the AF_INET address family is supported since
              Linux 2.6.17 for TCP sockets, and since Linux 4.17 for SCTP sockets.

              For SELinux, NetLabel conveys only the MLS portion of the security context  of  the
              peer  across  the  wire,  defaulting the rest of the security context to the values
              defined in the policy for the netmsg initial security identifier  (SID).   However,
              NetLabel  can  be configured to pass full security contexts over loopback.  Labeled
              IPSEC always passes full security contexts as part  of  establishing  the  security
              association (SA) and looks them up based on the association for each packet.

   /proc インターフェース
       IP プロトコルでは、いくつかのグローバルパラメーターを設定するための /proc ファイル群が用意
       されている。 これらのパラメーターには、 /proc/sys/net/ipv4/ ディレクトリ内のファイルの読み
       書きでアクセスできる。   Boolean   と書かれたインターフェースは整数値をとり、  0  以外の値
       ("true") は対応するオプションが有効、 0 値 ("false") は無効、であることを意味する。

       ip_always_defrag (Boolean; Linux 2.2.13 以降)
              [2.2.13    で新規登場。以前のバージョンのカーネルでは、この機能は    コンパイル時に
              CONFIG_IP_ALWAYS_DEFRAG オプションによって制御されていた; このファイルは 2.4.x 以降
              では存在しない]

              このブール値のフラグが有効になっている (0 以外になっている) と、 到着したフラグメン
              ト (IP パケットの一部で、 発信元と発信先の間のどこかのホストで、そのパケットが 大き
              すぎると判断され、分割された場合に生じる)  は、たとえフォワードされる場合であっても
              処理前に再構築 (デフラグメント) される。

              ファイアウォールがローカル側のネットワークに唯一のリンクを持っている 場合や、透過プ
              ロクシの場合に限って有効にすべきである。 通常のルーターやホストでは決して使用するこ
              とのないように。  さもないとフラグメントが別のリンクを経由して伝わる場合に、 通信の
              フラグメント化ができなくなってしまう。  またフラグメント再構築処理はメモリーと  CPU
              時間のコストが非常に大きい。

              これはマスカレードや透過プロクシが設定されると、 不思議な仕組みによって自動的に有効
              になる。

       ip_autoconfig (Linux 2.2 以降 2.6.17 まで)
              まだ記述していない。

       ip_default_ttl (integer; default: 64; Linux 2.2 以降)
              送出されるパケットの time-to-live 値のデフォルトをセットする。 これは  IP_TTL  オプ
              ションを用いれば、パケットごとに変えることもできる。

       ip_dynaddr (ブール値; デフォルト: 無効; Linux 2.0.31 以降)
              動的ソケットアドレスと、インターフェースアドレスが変更された際の マスカレードエント
              リーの再書き込みを有効にする。 ダイアルアップインターフェースで、 IP アドレスが変更
              される場合に便利である。

       ip_forward (ブール値; デフォルト: 無効; Linux 1.2 以降)
              IP forwarding を有効にするかどうかのブール値フラグ。 IP forwarding するかどうかはイ
              ンターフェースごとにも設定できる。

       ip_local_port_range (Linux 2.2 以降)
              このファイルには、   ポート番号に明示的にバインドされないソケットに割り当てられるデ
              フォルトのローカルポートの範囲 — つまり「一時ポート (ephemeral ports)」に使用される
              範囲 — を定める 2 つの整数が入っている。 一時ポートは以下の場合にソケットに割り当て
              られる。

              *  bind(2) の呼び出し時にソケットアドレスのポート番号に 0 が指定されている。

              *  バインドされていないストリームソケットに対して listen(2) が呼び出された。

              *  バインドされていないソケットに対して connect(2)  が呼ばれた。

              *  バインドされていないデータグラムソケットに対して sendto(2)  が呼ばれた。

              一時ポートに割り当てられるポート番号の範囲は、 ip_local_port_range の最初の数字から
              始まり、 2 番目の数字で終わる。 一時ポートの範囲を使い切った場合、 関連するシステム
              コールはエラーを返す (バグの節を参照)。

              ip_local_port_range で指定するポート番号の範囲は、 マスカレードで用いられているポー
              トと重なってはならない (その場合も取り扱われるが)。  ファイアウォールのパケットフィ
              ルターが「利用中のローカルポート」  について何らかの仮定をしている場合には、 番号を
              勝手に決めてしまうと問題が起きるかもしれない。 1 番目の番号は少なくとも 1024 より大
              きくすべきである。   良く使われるポートとの衝突を避けたり、ファイアウォールの問題を
              回避したければ、 4096 よりも大きくするほうが良いだろう。

       ip_no_pmtu_disc (ブール値; デフォルト: 無効; Linux 2.2 以降)
              有効になっていると、デフォルトで TCP ソケットに対する Path MTU Discoverty  を行わな
              い。  Path MTU Discovery は、 正しく設定されていない (ICMP パケットを全てドロップす
              る) ファイアウォールや、 (point-to-point リンクで双方の MTU  が一致していない場合な
              ど)      正しく設定されていないインターフェースが経路上に存在すると失敗してしまう。
              Path MTU Discovery をグローバルに無効にするよりは、  壊れているルーターを直すほうが
              良い。 Path MTU Discovery を無効にするとネットワークのコストが 大きくなってしまうか
              らである。

       ip_nonlocal_bind (ブール値; デフォルト: 無効; Linux 2.4 以降)
              セットされていれば、プロセスが自分以外の IP アドレスを bind(2) できるようになる。こ
              れはかなり便利だが、うまく動かないアプリケーションもある。

       ip6frag_time (integer; default: 30)
              IPv6 フラグメントをメモリーに保持しておく時間 (秒単位)。

       ip6frag_secret_interval (integer; default: 600)
              IPv6 フラグメントの hash secret の生成間隔 (hash secret の寿命)  (秒単位)。

       ipfrag_high_thresh (integer), ipfrag_low_thresh (integer)
              キューイングされている  IP フラグメントの量が ipfrag_high_thresh に達すると、キュー
              の内容は ipfrag_low_thresh にまで切り捨てられる。それぞれの大きさを  バイト単位で表
              す整数値が入っている。

       neigh/*
              arp(7)  を見よ。

   ioctl
       socket(7)  に記述されている ioctl は、すべて ip にも適用される。

       ジェネリックデバイスのパラメーターを設定する ioctl については netdevice(7)  に記述されてい
       る。

エラー

       EACCES 必要な権限のないユーザーが操作を実行しようとした。    以下のような場合が考えられる:
              SO_BROADCAST  フラグを設定していない状態でブロードキャストアドレスに パケットを送ろ
              うとした。 prohibit  なルートを通してパケットを送ろうとした。  スーパーユーザー権限
              (CAP_NET_ADMIN   ケーパビリティ)   なしでファイアウォールの設定を変更しようとした。
              スーパーユーザー権限 (CAP_NET_BIND_SERVICE ケーパビリティ) なしで特権ポートにバイン
              ドしようとした。

       EADDRINUSE
              既に使用されているアドレスにバインドしようとした。

       EADDRNOTAVAIL
              存在しないインターフェースが要求された。または 要求されたソースアドレスがローカルで
              ない。

       EAGAIN 非ブロッキングソケットに対してブロックする操作を行った。

       EALREADY
              非ブロッキングソケットに対する接続操作が既に実行中である。

       ECONNABORTED
              accept(2)  の途中で接続がクローズされた。

       EHOSTUNREACH
              宛先アドレスにマッチする有効なエントリーがルーティングテーブルに 存在しない。このエ
              ラーはリモートルーターからの、  あるいはローカルルーティングテーブルへの  ICMP メッ
              セージによって引き起こされることがある。

       EINVAL 不正な引数が渡された。送信操作において、 blackhole ルートに送信しようとするとこのエ
              ラーが起こることがある。

       EISCONN
              接続済みのソケットに対して connect(2)  が呼ばれた。

       EMSGSIZE
              データグラムが path MTU よりも大きく、フラグメント化もできない。

       ENOBUFS, ENOMEM
              空きメモリーが足りない。 このエラーは、メモリーアロケーションがソケットバッファーの
              大きさによって制限されていることを意味しているのが通常であるが、 100%  そうだという
              わけではない。

       ENOENT パケットが到着していないソケットに対して SIOCGSTAMP が呼ばれた。

       ENOPKG カーネルサブシステムが設定されていない。

       ENOPROTOOPTEOPNOTSUPP
              無効なソケットオプションが渡された。

       ENOTCONN
              接続されていないソケットに対して、   接続状態でしか定義されていない操作を行おうとし
              た。

       EPERM  高い優先度を設定したり、設定を変更したり、要求されたプロセスや プロセスグループにシ
              グナルを送ったりするのに必要な権限を、 ユーザーが持っていない。

       EPIPE  接続が接続相手によって、予期しないやり方でクローズまたはシャットダウンされた。

       ESOCKTNOSUPPORT
              ソケットが未設定であるか、知らないソケットタイプが要求された。

       他のエラーが上層のプロトコルによって生じるかもしれない。 tcp(7), raw(7), udp(7), socket(7)
       などを参照のこと。

注意

       IP_FREEBIND,  IP_MSFILTER,  IP_MTU,   IP_MTU_DISCOVER,   IP_RECVORIGDSTADDR,   IP_PASSSEC,
       IP_PKTINFO, IP_RECVERR, IP_ROUTER_ALERT, IP_TRANSPARENT は Linux 固有である。

       SO_BROADCAST  オプションの利用には、くれぐれも注意すること。 これは Linux では特権操作では
       ない。 不注意なブロードキャストを行うと、ネットワークは簡単に過負荷状態になる。 新しいアプ
       リケーションプロトコルには、ブロードキャストではなく  マルチキャストグループを用いるほうが
       よい。 ブロードキャストは推奨されない。

       他の BSD のソケット実装では、 IP_RCVDSTADDRIP_RECVIF  といったソケットオプションがサ
       ポートされており、 宛先アドレスや受信データグラムのインターフェースが取得できるように なっ
       ていることもある。 Linux で同じことをやらせるには、より一般的な IP_PKTINFO が使える。

       いくつかの   BSD   のソケット実装では   IP_RECVTTL    オプションも提供されているが、タイプ
       IP_RECVTTL  の補助メッセージは受信パケットとともに渡される。  これは  Linux で使われている
       IP_TTL オプションとは異なる動作である。

       SOL_IP   ソケットオプションレベルは移植性がない。    BSD    ベースのプロトコルスタックでは
       IPPROTO_IP レベルが使用されている。

       INADDR_ANY (0.0.0.0) and INADDR_BROADCAST (255.255.255.255) are byte-order-neutral.
        This means htonl(3) has no effect on them.

   移植性
       Linux 2.0 との互換性のために、 obsolete な socket(AF_INET, SOCK_PACKET, protocol) という書
       式でも     packet(7)      をオープンできるようになっているが、これはお勧めできない。今後は
       socket(AF_PACKET, SOCK_RAW, protocol) を代わりに用いるべきである。主な違いは、ジェネリック
       なリンク層用の sockaddr_ll アドレス構造体が、古い sockaddr_pkt  に変わって用いられるように
       なったことである。

バグ

       エラーの値がまったく首尾一貫していない。

       一時ポートの範囲の枯渇を示すのに使われるエラーは、    一時ポートの割り当てを行えるシステム
       コール (connect(2), bind(2), listen(2), sendto(2)) により異なる。

       IP 固有のインターフェースオプションを指定するための ioctl と ARP  テーブルのことが記述され
       ていない。

       recvmsg(2)  で msg_nameMSG_ERRQUEUE を指定して、受信パケットに入っていた宛先アドレスを
       取得する方法は 2.2 カーネルの一部でうまく動かない。

関連項目

       recvmsg(2), sendmsg(2), byteorder(3),  capabilities(7),  icmp(7),  ipv6(7),  netdevice(7),
       netlink(7), raw(7), socket(7), tcp(7), udp(7), ip(8)

       The kernel source file Documentation/networking/ip-sysctl.txt.

       RFC 791: 元々の IP 仕様。 RFC 1122: IPv4 ホストの要件。 RFC 1812: IPv4 ルーターの要件。

この文書について

       この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの
       説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。