OSDN Git Service

(split) Convert release and draft pages to UTF-8.
[linuxjm/LDP_man-pages.git] / release / man7 / ip.7
1 '\" t
2 .\" Don't change the line above. it tells man that tbl is needed.
3 .\" This man page is Copyright (C) 1999 Andi Kleen <ak@muc.de>.
4 .\" Permission is granted to distribute possibly modified copies
5 .\" of this page provided the header is included verbatim,
6 .\" and in case of nontrivial modification author and date
7 .\" of the modification is added to the header.
8 .\" $Id: ip.7,v 1.19 2000/12/20 18:10:31 ak Exp $
9 .\"
10 .\" Japanese Version Copyright (c) 1999 NAKANO Takeo all rights reserved.
11 .\" Translated 1999-12-06, NAKANO Takeo <nakano@apm.seikei.ac.jp>
12 .\" Updated 2001-02-14, Kentaro Shirakata <argrath@ub32.org>
13 .\" Updated 2001-04-04, Yuichi SATO <ysato@h4.dion.ne.jp>
14 .\" Updated & Modified 2003-10-16, Yuichi SATO <ysato444@yahoo.co.jp>
15 .\" Updated & Modified 2005-01-22, Yuichi SATO
16 .\" Updated & Modified 2005-09-10, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
17 .\" Updated & Modified 2005-10-06, Akihiro MOTOKI
18 .\" Updated 2007-01-05, Akihiro MOTOKI, Catch up to LDP man-pages 2.43
19 .\" Updated 2007-05-28, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v2.48
20 .\" Updated 2008-12-26, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v3.14
21 .\"
22 .\"WORD         ancillary message       補助メッセージ
23 .\"WORD         ... oriented            〜指向の
24 .\"WORD         capability              権限
25 .\"WORD         payload                 ペイロード
26 .\"WORD         drop(ped)       (パケットを) 落とす、(受動の場合) 到着しない
27 .\"WORD         tap                     タップ(する)
28 .\"
29 .TH IP  7 2009-02-28 "Linux" "Linux Programmer's Manual"
30 .SH 名前
31 ip \- Linux IPv4 プロトコルの実装
32 .SH 書式
33 .B #include <sys/socket.h>
34 .br
35 .\" .B #include <net/netinet.h> -- does not exist anymore
36 .\" .B #include <linux/errqueue.h> -- never include <linux/foo.h>
37 .B #include <netinet/in.h>
38 .br
39 .B #include <netinet/ip.h>        \fR/* 上記のスーパーセット */
40 .sp
41 .IB tcp_socket " = socket(AF_INET, SOCK_STREAM, 0);"
42 .br
43 .IB udp_socket " = socket(AF_INET, SOCK_DGRAM, 0);"
44 .br
45 .IB raw_socket " = socket(AF_INET, SOCK_RAW, " protocol ");"
46 .SH 説明
47 Linux は RFC\ 791 と RFC\ 1122 で記述されている
48 Internet Protocol, version 4 を実装している。
49 .B ip
50 には RFC\ 1112 に準拠した level 2 マルチキャストの実装が含まれている。
51 またパケットフィルタ機能を含む IP ルーターも実装されている。
52 .\" FIXME has someone verified that 2.1 is really 1812 compliant?
53 .PP
54 プログラミング・インターフェースは BSD ソケットと互換である。
55 ソケットに関するより詳細な情報は
56 .BR socket (7)
57 を参照のこと。
58 .PP
59 IP ソケットは、
60 .BR socket (2)
61 関数を
62 .B "socket(AF_INET, socket_type, protocol)"
63 のように呼び出すことで生成される。
64 指定できるソケットタイプは 3 つあり、
65 .BR tcp (7)
66 ソケットをオープンする場合
67 .BR SOCK_STREAM 、
68 .BR udp (7)
69 ソケットをオープンする場合
70 .BR SOCK_DGRAM 、
71 IP プロトコルに直接アクセスするために
72 .BR raw (7)
73 ソケットをオープンする場合には
74 .B SOCK_RAW
75 である。
76 .I protocol
77 は送受信される IP ヘッダに書かれる IP プロトコルである。
78 指定できる値は、
79 TCP ソケットには 0 か
80 .BR IPPROTO_TCP 、
81 UDP ソケットには 0 か
82 .B IPPROTO_UDP
83 に限られる。
84 .B SOCK_RAW
85 に対しては、 RFC\ 1700 で定義されている有効な IANA IP プロトコルを、
86 割り当てられている番号で指定することができる。
87 .PP
88 .\" FIXME ip current does an autobind in listen, but I'm not sure
89 .\" if that should be documented.
90 あるプロセスで、やってくるパケットを受信したり
91 接続要求を受けたりしたい場合には、
92 そのプロセスはローカルなインターフェースアドレスに、
93 .BR bind (2)
94 を用いてソケットをバインドしなければならない。
95 あるローカルな「アドレスとポート」のペアに対してバインドできる
96 IP ソケットは一つに限られる。
97 .BR bind (2)
98 の呼び出しで
99 .B INADDR_ANY
100 が指定されていた場合は、ソケットはローカルなインターフェースの
101 \fIすべて\fPにバインドされる。
102 .BR listen (2)
103 または
104 .BR connect (2)
105 がバインドされていないソケットでコールされると、
106 そのソケットは自動的にローカルなアドレスを
107 .B INADDR_ANY
108 にセットし、空いているポートをランダムに選んでバインドする。
109
110 .B SO_REUSEADDR
111 フラグがセットされていない場合には、
112 バインドされていた TCP ローカルソケットアドレスは
113 クローズされた後しばらくの間使えなくなる。
114 .B SO_REUSEADDR
115 フラグを使うと TCP の信頼性を低下させるので、
116 使うときには注意が必要である。
117 .SS アドレスのフォーマット
118 IP ソケットアドレスは、 IP インターフェースアドレスと
119 16ビットのポート番号の組み合わせで定義される。
120 IP プロトコルそのものはポート番号を扱わない。
121 ポート番号は、
122 .BR udp (7)
123
124 .BR tcp (7)
125 といった、上位のプロトコルで実装される。
126 raw ソケットでは、
127 .I sin_port
128 が IP プロトコルにセットされる。
129 .PP
130 .in +4n
131 .nf
132 struct sockaddr_in {
133     sa_family_t    sin_family; /* address family: AF_INET */
134     in_port_t      sin_port;   /* port in network byte order */
135     struct in_addr sin_addr;   /* internet address */
136 };
137
138 /* Internet address. */
139 struct in_addr {
140     uint32_t       s_addr;     /* address in network byte order */
141 };
142 .fi
143 .in
144 .PP
145 .I sin_familiy
146 には常に
147 .B AF_INET
148 をセットする。これは必須である。 Linux 2.2 では、このセットを忘れると
149 ほとんどのネットワーク関数は
150 .B EINVAL
151 を返すようになっている。
152 .I sin_port
153 にはポート番号をネットワークバイトオーダーで指定する。
154 1024 未満のポート番号は
155 .I "特権ポート (privileged ports)"
156 と呼ばれる
157 .RI ( "予約ポート (reserved ports)"
158 とも時々呼ばれる)。
159 特権プロセス
160 .RB ( CAP_NET_BIND_SERVICE
161 ケーパビリティを持つプロセス) 以外のプロセスは、これらのポートには
162 .BR bind (2)
163 できない。 IPv4 プロトコルそのものにはポートに関する概念がない。
164 ポートは、
165 .BR tcp (7)
166
167 .BR udp (7)
168 といった、上位のプロトコルにおいて実装される。
169 .PP
170 .I sin_addr
171 は IP ホストアドレスである。
172 .I struct in_addr
173
174 .I s_addr
175 メンバには、ホストのインターフェースアドレスを
176 ネットワークバイトオーダーで指定する。
177 .I in_addr
178 は、INADDR_* の一つ (例えば
179 .BR INADDR_ANY )
180 を代入する、
181 ライブラリ関数
182 .BR inet_aton (3),
183 .BR inet_addr (3),
184 .BR inet_makeaddr (3)
185 を用いる、あるいは名前解決機構 (name resolver)
186 を直接用いる、のどれかで設定すべきである。
187 .RB ( gethostbyname (3)
188 を見よ)。
189
190 IPv4 アドレスには、ユニキャストアドレス、
191 ブロードキャストアドレス、マルチキャストアドレスがある。
192 ユニキャストアドレスは、あるホストの一つのアドレスを指定する。
193 ブロードキャストアドレスは、あるネットワーク上の全てのホストを指定する。
194 マルチキャストアドレスは、マルチキャストグループに所属する
195 全てのホストを指定する。ブロードキャストアドレスへのデータグラムは、
196 .B SO_BROADCAST
197 ソケットフラグがセットされていないと送信・受信できない。
198 現在の実装では、接続指向のソケットにはユニキャストアドレスしか使えない。
199 .\" Leave a loophole for XTP @)
200
201 アドレスとポートは常にネットワークバイトオーダーで格納されることに注意せよ。
202 具体的には、ポートを指定する数値には
203 .BR htons (3)
204 を呼び出す必要がある。
205 標準ライブラリにあるアドレス/ポート操作関数は
206 すべてネットワークバイトオーダーで動作する。
207
208 特別なアドレスがいくつか存在する:
209 .TP
210 .BR INADDR_LOOPBACK (127.0.0.1)
211 loopback デバイスを通して常にローカルなホストを参照する。
212 .TP
213 .BR INADDR_ANY (0.0.0.0)
214 バインドに用いる任意のアドレス。
215 .TP
216 .BR INADDR_BROADCAST (255.255.255.255)
217 任意のホスト。歴史的理由から、バインドの際には
218 .B INADDR_ANY
219 と同じ効果になる。
220 .SS ソケットオプション
221 IP にはプロトコル固有のソケットオプションがいくつか存在し、
222 .BR setsockopt (2)
223 で設定が、
224 .BR getsockopt (2)
225 で取得ができる。 IP のソケットオプションレベルは
226 .B IPPROTO_IP
227 .\" Linux では SOL_IP も可
228 である。
229 ブール整数値のフラグでは、 0 は偽、それ以外は真を意味する。
230 .\"
231 .\" FIXME Document IP_FREEBIND
232 .\" Boolean
233 .\" Since Linux 2.4.0-test10
234 .\"
235 .TP
236 .BR IP_ADD_MEMBERSHIP " (Linux 1.2 以降)"
237 マルチキャストグループに参加する。
238 引き数は
239 .I ip_mreqn
240 構造体である。
241 .sp
242 .in +4n
243 .nf
244 struct ip_mreqn {
245     struct in_addr imr_multiaddr; /* IP multicast group
246                                      address */
247     struct in_addr imr_address;   /* IP address of local
248                                      interface */
249     int            imr_ifindex;   /* interface index */
250 };
251 .fi
252 .in
253 .sp
254 .I imr_multiaddr
255 には、アプリケーションが参加または撤退したい
256 マルチキャストグループのアドレスが入る。
257 指定するアドレスは有効なマルチキャストアドレスでなければならない
258 .\" (つまり、224.0.0.0-239.255.255.255 の範囲内)
259 (さもなければ
260 .BR setsockopt (2)
261 がエラー
262 .B EINVAL
263 で失敗する)。
264 .I imr_address
265 はシステムがマルチキャストグループに参加する際に用いる
266 ローカルなインターフェースのアドレスである。
267 これが
268 .B INADDR_ANY
269 であった場合には、適切なインターフェースがシステムによって選択される。
270 .I imr_ifindex
271
272 .I imr_multiaddr
273 グループに参加/撤退するインターフェースの interface index である。
274 どのインターフェースでもよい場合は 0 にする。
275 .IP
276 .I ip_mreqn
277 は Linux 2.2 以降でのみ利用可能である。
278 互換性のため、古い
279 .I ip_mreq
280 構造体 (Linux 1.2 以降で存在する) もまだサポートされている。
281 .I ip_mreqn
282 との違いは、
283 .I imr_ifindex
284 フィールドを含まないことだけである。
285 .BR setsockopt (2)
286 でのみ使える。
287 .\"
288 .TP
289 .BR IP_DROP_MEMBERSHIP " (Linux 1.2 以降)"
290 マルチキャストグループから抜ける。引き数は
291 .B IP_ADD_MEMBERSHIP
292 と同様に
293 .I ip_mreqn
294 または
295 .I ip_mreq
296 構造体である。
297 .TP
298 .BR IP_HDRINCL " (Linux 2.0 以降)"
299 有効になっていると、ユーザは IP ヘッダをユーザーデータの前に与える。
300 .B SOCK_RAW
301 ソケットでのみ有効である。詳細は
302 .BR raw (7)
303 を見よ。このフラグが有効になっていると、
304 .BR IP_OPTIONS ,
305 .BR IP_TTL ,
306 .B IP_TOS
307 は無視される。
308 .\" FIXME Document IP_IPSEC_POLICY
309 .\" Since Linux 2.5.47
310 .\" Needs CAP_NET_ADMIN
311 .TP
312 .BR IP_MTU " (Linux 2.2 以降)"
313 .\" Precisely: 2.1.124
314 ソケットの、既知の path MTU を取得する。
315 ソケットが接続している場合のみ有効である。
316 .BR getsockopt (2)
317 でのみ使える。
318 .TP
319 .BR IP_MTU_DISCOVER " (Linux 2.2 以降)"
320 .\" Precisely: 2.1.124
321 ソケットの Path MTU Discovery の設定をセット・取得する。
322 有効になっていると、 Linux はこのソケットに対して
323 RFC\ 1191 で定義されている Path MTU Discovery を行う。
324 発信データグラムには、全て「フラグメント不許可」フラグがセットされる。
325 システム全体に対するデフォルトは、
326 .B SOCK_STREAM
327 ソケットに対しては
328 .I /proc/sys/net/ipv4/ip_no_pmtu_disc
329 ファイルにより制御できる。
330 その他については無効となっている。
331 .B SOCK_STREAM
332 でないソケットに対しては、
333 ユーザーがデータを MTU のサイズの塊にパケット化したり、
334 必要な場合には再送したりしなければならない。
335 このフラグがセットされていると、
336 カーネルは既知の path MTU より大きなパケットを拒否する
337 .RB ( EMSGSIZE
338 となる)。
339 .TS
340 tab(:);
341 c l
342 l l.
343 Path MTU discovery フラグ:意味
344 IP_PMTUDISC_WANT:ルートごとの設定を用いる。
345 IP_PMTUDISC_DONT:Path MTU Discovery を行わない。
346 IP_PMTUDISC_DO:常に Path MTU Discovery を行う。
347 IP_PMTUDISC_PROBE:DFビットをセットするが、Path MTU を無視する。
348 .TE
349
350 path MTU discovery が有効になっていると、カーネルは宛先ホストごとに
351 自動的に path MTU を処理する。特定の相手に
352 .BR connect (2)
353 で接続した場合には、
354 .B IP_MTU
355 ソケットオプションを用いれば、既知の path MTU の取得に便利である
356 (たとえば
357 .B EMSGSIZE
358 エラーが起きた後など)。これは時間とともに変化するかもしれない。
359 宛先がたくさんあるコネクションレスなソケットでは、
360 与えられた宛先に対する新しい MTU にも、
361 エラーキューを用いてアクセスすることができる
362 .RB ( IP_RECVERR
363 を見よ)。
364 MTU 更新が到着するごとに、新たなエラーがキューイングされる。
365
366 MTU discovery の進行中には、データグラムソケットからの初期パケットは
367 到着しないかもしれない。 UDP を用いるアプリケーションでは、
368 このことを気にかけておき、
369 パケットの再送アルゴリズムにこの分を除外させるべきである。
370
371 接続していないソケットに対して
372 path MTU discovery プロセスを立ち上げるには、
373 大きなデータグラムサイズ (最大 64K ヘッダバイト長) からはじめて、
374 path MTU が更新されるまでサイズを縮めていくことも可能である。
375 .\" FIXME this is an ugly hack
376
377 path MTU の値をまず見積もってみるには、宛先アドレスに
378 .BR connect (2)
379 を使ってデータグラムソケットを接続し、
380 .BR getsockopt (2)
381
382 .B IP_MTU
383 オプションとともに呼び、 MTU を取得することである。
384
385 .B IP_PMTUDISC_PROBE
386 (Linux 2.6.22 以降で利用可能) を設定することで、
387 .B SOCK_DGRAM
388
389 .B SOCK_RAW
390 のソケットで RFC 4821 の MTU 探索を実装することが可能である。
391 また、この機能は、
392 .BR tracepath (8)
393 のような診断ツールで特に有用である。これらのツールでは、
394 観測された Path MTU よりも大きな探索パケットを意図的に
395 送信しようとする。
396 .TP
397 .BR IP_MULTICAST_IF " (Linux 1.2 以降)"
398 ローカルデバイスをマルチキャストソケットとして設定する。引き数は
399 .B IP_ADD_MEMBERSHIP
400 と同様に
401 .I ip_mreqn
402 または
403 .I ip_mreq
404 構造体である。
405 .IP
406 不正なソケットオプションが渡されると、
407 .B ENOPROTOOPT
408 が返される。
409 .TP
410 .BR IP_MULTICAST_LOOP " (Linux 1.2 以降)"
411 マルチキャストパケットをローカルなソケットにループバックするかどうかを
412 定めるブール値の整数引き数を設定・取得する。
413 .TP
414 .BR IP_MULTICAST_TTL " (Linux 1.2 以降)"
415 このソケットから発信されるマルチキャストパケットの
416 time-to-live 値を設定・取得する。
417 マルチキャストパケットに対しては、できるだけ小さな
418 TTL に設定することがとても重要である。デフォルトは 1 で、
419 ユーザープログラムが明示的に要求しない限り
420 マルチキャストパケットはローカルなネットワークから出ないことになる。
421 引き数に整数を取る。
422 .TP
423 .BR IP_OPTIONS " (Linux 2.0 以降)"
424 .\" Precisely: 1.3.30
425 このソケットから送られるパケット全てに付随する IP オプションを
426 設定・取得する。オプションを保存しているメモリバッファへのポインタと
427 オプションの長さとを引き数に取る。
428 .BR setsockopt (2)
429 を呼び出すと、ソケットに関連づけられる IP オプションを設定できる。
430 IPv4 におけるオプションのサイズの最大値は 40 バイトである。
431 用いることのできるオプションについては RFC\ 791 を見よ。
432 .B SOCK_STREAM
433 ソケットに対する初期接続要求パケットに IP オプションが含まれていると、
434 ルーティングヘッダを付けて戻されてくる初期パケットの
435 IP オプションに同じオプションがセットされる。接続が確立された後、
436 やってきたパケットのオプションを変更することはできない。
437 デフォルトでは。外部から受信したパケットの全ての source routing オプション
438 の処理は無効となっており、
439 .I /proc
440 インタフェースの
441 .I accept_source_route
442 を使うとこれを有効にできる。これを無効にしていても timestamps など
443 の他のオプションの処理は行われる。データグラムソケットでは、
444 IP オプションはローカルユーザーしか設定できない。
445 .BR getsockopt (2)
446
447 .B IP_OPTIONS
448 をつけて呼ぶと、現在送信に用いられている IP オプションを
449 引き数に与えたバッファに取得できる。
450 .\" FIXME Document IP_PASSSEC
451 .\" Boolean
452 .\" Since Linux 2.6.17
453 .\" commit 2c7946a7bf45ae86736ab3b43d0085e43947945c
454 .\" Author: Catherine Zhang <cxzhang@watson.ibm.com>
455 .TP
456 .BR IP_PKTINFO " (Linux 2.2 以降)"
457 .\" Precisely: 2.1.68
458 .B IP_PKTINFO
459 補助メッセージを渡す。これには到着パケットに関する情報を提供する
460 .I pktinfo
461 構造体が含まれている。
462 データグラム指向のソケットでしか動作しない。
463 引き数は
464 .B IP_PKTINFO
465 メッセージを通過させるかどうかをソケットに知らせるフラグである。
466 メッセージ自身は
467 .BR recvmsg (2)
468 または
469 .BR sendmsg (2)
470 を用いたパケットの制御メッセージとしてのみ送受信できる。
471
472 .IP
473 .in +4n
474 .nf
475 struct in_pktinfo {
476     unsigned int   ipi_ifindex;  /* Interface index */
477     struct in_addr ipi_spec_dst; /* Local address */
478     struct in_addr ipi_addr;     /* Header Destination
479                                     address */
480 };
481 .fi
482 .in
483 .IP
484 .\" FIXME elaborate on that.
485 .I ipi_ifindex
486 はパケットが受信されたインターフェースの、他と重ならないインデックスである。
487 .I ipi_spec_dst
488 はパケットのローカルアドレスである。
489 .I ipi_addr
490 はパケットヘッダにある宛先アドレスである。
491 .B IP_PKTINFO
492
493 .BR sendmsg (2)
494 に渡されて、かつ
495 .\" このフィールドは、名前の付け方が明らかに間違っているのだが
496 .I ipi_spec_dst
497 が 0 以外の場合、
498 .I ipi_spec_dst
499 はルーティングテーブルを検索する際にローカルな送信元アドレスとして使用され、
500 IP source route オプションを設定するのにも使用される。
501 .I ipi_ifindex
502 が 0 以外の場合、このインデックスによって指定されるインターフェースの
503 プライマリローカルアドレスで
504 .I ipi_spec_dst
505 を上書きし、ルーティングテーブルを検索する。
506 .TP
507 .BR IP_RECVERR " (Linux 2.2 以降)"
508 .\" Precisely: 2.1.15
509 エラーメッセージの受け渡しに、信頼性の高い拡張された方法を有効にする。
510 データグラムソケットに対して有効になっていると、
511 発生したエラーは全てソケットごとのエラーキューに保存される。
512 ユーザーはソケット操作からエラーを受け取ったとき、
513 .BR recvmsg (2)
514
515 .B MSG_ERRQUEUE
516 フラグとともに呼べばそのエラーを取得できる。
517 そのエラーを記述する
518 .I sock_extended_err
519 構造体が、タイプ
520 .BR IP_RECVERR ・
521 レベル
522 .B IPPROTO_IP
523 .\" Linux では SOL_IP も可
524 の補助メッセージとして渡される。
525 これは接続志向でないソケットで信頼性の高いエラー処理を行いたい場合に
526 有用である。エラーキューの受信データフラグメントには
527 エラーパケットが含まれる。
528 .\"NAKANO portion をフラグメントって言っちゃっていいのか?
529 .IP
530 .B IP_RECVERR
531 制御メッセージには
532 .I sock_extended_err
533 構造体が含まれる:
534 .IP
535 .in +4n
536 .ne 18
537 .nf
538 #define SO_EE_ORIGIN_NONE    0
539 #define SO_EE_ORIGIN_LOCAL   1
540 #define SO_EE_ORIGIN_ICMP    2
541 #define SO_EE_ORIGIN_ICMP6   3
542
543 struct sock_extended_err {
544     uint32_t ee_errno;   /* error number */
545     uint8_t  ee_origin;  /* where the error originated */
546     uint8_t  ee_type;    /* type */
547     uint8_t  ee_code;    /* code */
548     uint8_t  ee_pad;
549     uint32_t ee_info;    /* additional information */
550     uint32_t ee_data;    /* other data */
551     /* More data may follow */
552 };
553
554 struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);
555 .fi
556 .in
557 .IP
558 .I ee_errno
559 にはキューに入っているエラーの
560 .I errno
561 番号が入る。
562 .I ee_origin
563 にはエラーが発生した場所を示すコードが入る。
564 その他のフィールドはプロトコル依存である。
565 .B SO_EE_OFFENDER
566 マクロは与えられた補助メッセージへのポインタから
567 エラーの発生したネットワークオブジェクトのアドレスへのポインタを返す。
568 アドレスが不明な場合、
569 .I sockaddr
570 構造体の
571 .I sa_family
572 フィールドは
573 .B AF_UNSPEC
574 となり、その他のフィールド値は不定である。
575 .IP
576 IP は以下のような
577 .I sock_extended_err
578 構造体を用いる:
579 .I ee_origin
580 は、
581 エラーが ICMP パケットとして受信された場合には
582 .B SO_EE_ORIGIN_ICMP
583 にセットされ、ローカルで起こった場合には
584 .B SO_EE_ORIGIN_LOCAL
585 にセットされる。
586 不明な値は無視される。
587 .I ee_type
588
589 .I ee_code
590 は ICMP ヘッダの type フィールドと code フィールドの値にセットされる。
591 .I ee_info
592 には
593 .B EMSGSIZE
594 エラーに対する discover された MTU が入る。
595 メッセージにはエラーを引き起こしたノードの
596 .I sockaddr_in
597 構造体も含まれる。
598 これには
599 .B SO_EE_OFFENDER
600 マクロを使ってアクセスできる。
601 ソースが不明の場合、
602 SO_EE_OFFENDER アドレスの
603 .I sin_family
604 フィールドは
605 .B AF_UNSPEC
606 となる。
607 エラーがネットワークで起きた場合には、
608 ソケットで有効になっていたすべての IP オプション
609 .RB ( IP_OPTIONS ", " IP_TTL
610 など) とエラーパケットに含まれていたすべての IP オプションとが、
611 制御メッセージとして渡される。
612 エラーを起こしたパケットのペイロード (payload) は
613 普通のペイロードとして返される。
614 .\" FIXME . is it a good idea to document that? It is a dubious feature.
615 .\" .B SOCK_STREAM
616 .\" ソケットでは、
617 .\" .B IP_RECVERR
618 .\" はやや異なる意味を持つ。次のタイムアウトまでデータを保持するのでなく、
619 .\" やってきたエラーは全てただちにユーザーに渡される。これは、
620 .\" 高速なエラー処理が必要となるような、極端に寿命の短い
621 .\" TCP 接続に対して有用である。このオプションは注意して用いること。
622 .\" 経路が変わったり、その他通常の状況に対して、適切な回復が不可能となり、
623 .\" TCP の信頼性を低くしてしまう。またプロトコルの仕様に反してしまう。
624 TCP にはエラーキューがないことに注意してほしい。
625 .B MSG_ERRQUEUE
626
627 .B SOCK_STREAM
628 ソケットに対しては使えない。
629 TCP では
630 .B IP_RECVERR
631 だけが有効だが、ソケット関数から返されるエラーは
632 .B SO_ERROR
633 だけになる。
634 .IP
635 raw ソケットに対して
636 .B IP_RECVERR
637 を指定すると、受信したすべての ICMP エラーをアプリケーションに
638 渡すようになる。指定しないと、
639 接続済みのソケットに対するエラーだけを報告する。
640 .IP
641 このオプションはブール値のフラグを設定・取得する。
642 .B IP_RECVERR
643 はデフォルトではオフになっている。
644 .TP
645 .BR IP_RECVOPTS " (Linux 2.2 以降)"
646 .\" Precisely: 2.1.15
647 到着した全ての IP オプションを
648 .B IP_OPTION
649 コントロールメッセージに入れてユーザーに渡す。
650 ルーティングヘッダとその他のオプションとは、
651 ローカルホストに対してはあらかじめ記入されている。
652 .B SOCK_STREAM
653 ソケットではサポートされていない。
654 .TP
655 .BR IP_RECVTOS " (Linux 2.2 以降)"
656 .\" Precisely: 2.1.68
657 有効になっていると、
658 .B IP_TOS
659 補助メッセージが到着パケットとともに渡される。
660 これにはパケットヘッダの Service/Precedence
661 フィールドのタイプを指定するバイトデータが含まれている。
662 ブール整数値のフラグをとる。
663 .TP
664 .BR IP_RECVTTL " (Linux 2.2 以降)"
665 .\" Precisely: 2.1.68
666 このフラグがセットされていると、
667 .B IP_TTL
668 コントロールメッセージが受信パケットの
669 time-to-live フィールドのバイトデータとともに渡される。
670 .B SOCK_STREAM
671 ソケットではサポートされていない。
672 .TP
673 .B IP_RETOPTS
674 .BR IP_RETOPTS " (Linux 2.2 以降)"
675 .\" Precisely: 2.1.15
676 .B IP_RECVOPTS
677 と等価だが、未処理の生のオプションを、
678 この hop では記入されない timestamp レコードと route レコードとともに返す。
679 .\"NAKANO 意味不明...(^^;
680 .TP
681 .BR IP_ROUTER_ALERT " (Linux 2.2 以降)"
682 .\" Precisely: 2.1.68
683 フォワードすべきパケットを IP Router Alert オプションをつけて
684 このソケットに渡す。
685 raw ソケットに対してのみ有効である。これはたとえばユーザー空間の
686 RSVP デーモンに対して便利である。タップされたパケットは
687 カーネルによってはフォワードされないので、これらを再送するのは
688 ユーザーの責任となる。ソケットのバインドは無視され、
689 このようなパケットはプロトコルによってのみフィルタリングされる。
690 整数値のフラグを取る。
691 .\"NAKANO Socket binding... の文、意味わからん。
692 .TP
693 .BR IP_TOS " (Linux 1.0 以降)"
694 このソケットから送信されるすべての IP パケットに適用される
695 Type-Of-Service (TOS) フィールドを設定・取得する。
696 これはネットワーク上でのパケットの優先度を決めるために用いられる。
697 TOS はバイトデータである。標準の TOS フラグがいくつか定義されている。
698 .B IPTOS_LOWDELAY
699 はインタラクティブなトラフィックの遅延を最小にする。
700 .B IPTOS_THROUGHPUT
701 はスループットを最大にする。
702 .B IPTOS_RELIABILITY
703 は信頼性を最高にする。
704 .B IPTOS_MINCOST
705 は転送速度が遅くてもかまわないとき、「データを詰め込む」のに用いられる。
706 これらのうち、 1 つまでだけを設定できる。
707 他のビットは無効で、クリアされる。
708 .\"NAKANO ↑訳あってる?
709 Linux はデフォルトでは
710 .B IPTOS_LOWDELAY
711 データグラムを最初に送信する。
712 しかし、正確な振る舞いはキュー処理の設定に依存する。
713 .\" FIXME elaborate on this
714 高い優先度にするにはスーパーユーザー権限
715 .RB ( CAP_NET_ADMIN
716 ケーパビリティ) が必要となるかもしれない。
717 優先度は
718 .RB ( SOL_SOCKET ", " SO_PRIORITY )
719 ソケットオプションを用いれば、
720 プロトコルに依存しない形でも設定できる
721 .RB ( socket (7)
722 を見よ)。
723 .\" FIXME Document IP_TRANSPARENT
724 .\" Needs CAP_NET_ADMIN
725 .\" Boolean
726 .\" Since Linux 2.6.27
727 .\" commit f5715aea4564f233767ea1d944b2637a5fd7cd2e
728 .\" Author: KOVACS Krisztian <hidden@sch.bme.hu>
729 .TP
730 .BR IP_TTL " (Linux 1.0 以降)"
731 time-to-live フィールドの値を設定または取得する。
732 この値はこのソケットから送信されるすべてのパケットに用いられる。
733 .\" FIXME Document IP_XFRM_POLICY
734 .\" Since Linux 2.5.48
735 .\" Needs CAP_NET_ADMIN
736 .SS /proc インタフェース
737 IP プロトコルでは、いくつかのグローバルパラメータを設定するための
738 .I /proc
739 ファイル群が用意されている。
740 これらのパラメータには、
741 .I /proc/sys/net/ipv4/
742 ディレクトリ内のファイルの読み書きでアクセスできる。
743 .\" FIXME As at 2.6.12, 14 Jun 2005, the following are undocumented:
744 .\"     ip_queue_maxlen
745 .\"     ip_conntrack_max
746 .I Boolean
747 と書かれたインタフェースは整数値をとり、
748 0 以外の値 ("true") は対応するオプションが有効、
749 0 値 ("false") は無効、であることを意味する。
750 .\"
751 .TP
752 .IR ip_always_defrag " (Boolean; Linux 2.2.13 以降)"
753 [2.2.13 で新規登場。以前のバージョンのカーネルでは、この機能は
754 コンパイル時に
755 .B CONFIG_IP_ALWAYS_DEFRAG
756 オプションによって制御されていた;
757 このファイルは 2.4.x 以降では存在しない]
758
759 このブール値のフラグが有効になっている (0 以外になっている) と、
760 到着したフラグメント (IP パケットの一部で、
761 発信元と発信先の間のどこかのホストで、そのパケットが
762 大きすぎると判断され、分割された場合に生じる)
763 は、たとえフォワードされる場合であっても
764 処理前に再構築 (デフラグメント) される。
765
766 ファイアウォールがローカル側のネットワークに唯一のリンクを持っている
767 場合や、透過プロクシの場合に限って有効にすべきである。
768 通常のルーターやホストでは決して使用することのないように。
769 さもないとフラグメントが別のリンクを経由して伝わる場合に、
770 通信のフラグメント化ができなくなってしまう。
771 またフラグメント再構築処理はメモリと CPU 時間のコストが非常に大きい。
772
773 これはマスカレードや透過プロクシが設定されると、
774 不思議な仕組みによって自動的に有効になる。
775 .\"
776 .TP
777 .IR ip_autoconfig " (Linux 2.2 以降 2.6.17 まで)"
778 .\" Precisely: since 2.1.68
779 .\" FIXME document ip_autoconfig
780 まだ記述していない。
781 .\"
782 .TP
783 .IR ip_default_ttl " (integer; default: 64; Linux 2.2 以降)"
784 .\" Precisely: 2.1.15
785 送出されるパケットの time-to-live 値のデフォルトをセットする。
786 これは
787 .B IP_TTL
788 オプションを用いれば、パケットごとに変えることもできる。
789 .\"
790 .TP
791 .IR ip_dynaddr " (Boolean; default: disabled; Linux 2.0.31 以降)"
792 動的ソケットアドレスと、インターフェースアドレスが変更された際の
793 マスカレードエントリの再書き込みを有効にする。
794 ダイアルアップインターフェースで、
795 IP アドレスが変更される場合に便利である。
796 .\"
797 .TP
798 .IR ip_forward " (Boolean; default: disabled; Linux 1.2 以降)"
799 IP forwarding を有効にするかどうかのブール値フラグ。
800 IP forwarding するかどうかはインターフェースごとにも設定できる。
801 .\"
802 .TP
803 .IR ip_local_port_range " (Linux 2.2 以降)"
804 .\" Precisely: since 2.1.68
805 ソケットに割り当てられているデフォルトのローカルポートの範囲を定める
806 二つの整数を与える。割り当ては 1 番目の番号から始まり、 2 番目の番号で終わる。
807 これらはマスカレードで用いられているポートと重なってはならない
808 (その場合も取り扱われるが)。
809 ファイアウォールのパケットフィルターが「利用中のローカルポート」
810 について何らかの仮定をしている場合には、
811 番号を勝手に決めてしまうと問題が起きるかもしれない。
812 1 番目の番号は少なくとも 1024 より大きくすべきである。
813 良く使われるポートとの衝突を避けたり、ファイアウォールの問題を
814 回避したければ、 4096 よりも大きくするほうが良いだろう。
815 .\"
816 .TP
817 .IR ip_no_pmtu_disc " (Boolean; default: disabled; Linux 2.2 以降)"
818 .\" Precisely: 2.1.15
819 有効になっていると、デフォルトで TCP ソケットに対する
820 Path MTU Discoverty を行わない。
821 Path MTU Discovery は、
822 正しく設定されていない (ICMP パケットを全てドロップする) ファイアウォールや、
823 (point-to-point リンクで双方の MTU が一致していない場合など)
824 正しく設定されていないインターフェースが経路上に存在すると失敗してしまう。
825 Path MTU Discovery をグローバルに無効にするよりは、
826 壊れているルータを直すほうが良い。
827 Path MTU Discovery を無効にするとネットワークのコストが
828 大きくなってしまうからである。
829 .\"
830 .\" The following is from 2.6.12: Documentation/networking/ip-sysctl.txt
831 .TP
832 .IR ip_nonlocal_bind " (Boolean; default: disabled; Linux 2.4 以降)"
833 .\" Precisely: patch-2.4.0-test10
834 セットされていれば、プロセスが自分以外の IP アドレスを
835 .BR bind (2)
836 できるようになる。これはかなり便利だが、うまく動かないアプリケーションもある。
837 .\"
838 .\" The following is from 2.6.12: Documentation/networking/ip-sysctl.txt
839 .TP
840 .IR ip6frag_time " (integer; default 30)"
841 IPv6 フラグメントをメモリに保持しておく時間 (秒単位)。
842 .\"
843 .\" The following is from 2.6.12: Documentation/networking/ip-sysctl.txt
844 .TP
845 .IR ip6frag_secret_interval " (integer; default 600)"
846 IPv6 フラグメントの hash secret の生成間隔 (hash secret の寿命)
847 (秒単位)。
848 .TP
849 .IR ipfrag_high_thresh " (integer), " ipfrag_low_thresh " (integer)"
850 キューイングされている IP フラグメントの量が
851 .I ipfrag_high_thresh
852 に達すると、キューの内容は
853 .I ipfrag_low_thresh
854 にまで切り捨てられる。それぞれの大きさを
855 バイト単位で表す整数値が入っている。
856 .TP
857 .I neigh/*
858 .BR arp (7)
859 を見よ。
860 .\" FIXME Document the conf/*/* interfaces
861 .\" FIXME Document the route/* interfaces
862 .\" FIXME document them all
863 .SS ioctl
864 .BR socket (7)
865 に記述されている ioctl は、すべて
866 .B ip
867 にも適用される。
868 .\" 2006-04-02, mtk
869 .\" commented out the following because ipchains is obsolete
870 .\" .PP
871 .\" ファイアウォール関係の設定に関する ioctl については
872 .\" .B ipchains
873 .\" パッケージの
874 .\" .BR ipfw (4)
875 .\" に記述されている。
876 .PP
877 ジェネリックデバイスのパラメータを設定する ioctl については
878 .BR netdevice (7)
879 に記述されている。
880 .\" FIXME Add a discussion of multicasting
881 .SH エラー
882 .\" FIXME document all errors.
883 .\"     We should really fix the kernels to give more uniform
884 .\"     error returns (ENOMEM vs ENOBUFS, EPERM vs EACCES etc.)
885 .TP
886 .B EACCES
887 必要な権限のないユーザーが操作を実行しようとした。
888 以下のような場合が考えられる:
889 .B SO_BROADCAST
890 フラグを設定していない状態でブロードキャストアドレスに
891 パケットを送ろうとした。
892 .I prohibit
893 なルートを通してパケットを送ろうとした。
894 スーパーユーザー権限
895 .RB ( CAP_NET_ADMIN
896 ケーパビリティ) なしでファイアウォールの設定を変更しようとした。
897 スーパーユーザー権限
898 .RB ( CAP_NET_BIND_SERVICE
899 ケーパビリティ) なしで特権ポートにバインドしようとした。
900 .TP
901 .B EADDRINUSE
902 既に使われているアドレスにバインドしようとした。
903 .TP
904 .B EADDRNOTAVAIL
905 存在しないソケットが要求された。または要求された
906 ソースアドレスがローカルでない。
907 .TP
908 .B EAGAIN
909 非ブロッキングソケットに対してブロックする操作を行った。
910 .TP
911 .B EALREADY
912 非ブロッキングソケットに対する接続操作が既に実行中である。
913 .TP
914 .B ECONNABORTED
915 .BR accept (2)
916 の最中に接続がクローズされた。
917 .TP
918 .B EHOSTUNREACH
919 宛先アドレスにマッチする有効なエントリがルーティングテーブルに
920 存在しない。このエラーはリモートルータからの、
921 あるいはローカルルーティングテーブルへの
922 ICMP メッセージによって引き起こされることがある。
923 .TP
924 .B EINVAL
925 不正な引き数が渡された。送信操作において、
926 .I blackhole
927 ルートに送信しようとするとこのエラーが起こることがある。
928 .TP
929 .B EISCONN
930 .BR connect (2)
931 が、既に接続済みのソケットに対して呼ばれた。
932 .TP
933 .B EMSGSIZE
934 データグラムが path MTU よりも大きく、フラグメント化もできない。
935 .TP
936 .BR ENOBUFS ", " ENOMEM
937 空きメモリが足りない。
938 このエラーは、メモリアロケーションがソケットバッファの
939 大きさによって制限されていることを意味しているのが通常であるが、
940 100% そうだというわけではない。
941 .TP
942 .B ENOENT
943 パケットが全く到着していないソケットに対して
944 .B SIOCGSTAMP
945 が呼ばれた。
946 .TP
947 .B ENOPKG
948 カーネルサブシステムが設定されていない。
949 .TP
950 .BR ENOPROTOOPT " と " EOPNOTSUPP
951 不正なソケットオプションが渡された。
952 .TP
953 .B ENOTCONN
954 接続されていないソケットに対して、
955 接続状態でしか定義されていない操作を行おうとした。
956 .TP
957 .B EPERM
958 高い優先度を設定したり、設定を変更したり、要求されたプロセスや
959 プロセスグループにシグナルを送ったりするのに必要な権限を、
960 ユーザーが持っていない。
961 .TP
962 .B EPIPE
963 接続が先方から期待していなかったやり方で
964 クローズあるいはシャットダウンされた。
965 .TP
966 .B ESOCKTNOSUPPORT
967 ソケットが未設定であるか、知らないソケットタイプが要求された。
968 .PP
969 他のエラーが上層のプロトコルによって生じるかもしれない。
970 .BR tcp (7),
971 .BR raw (7),
972 .BR udp (7),
973 .BR socket (7)
974 などを参照のこと。
975 .SH 注意
976 .BR IP_MTU ,
977 .BR IP_MTU_DISCOVER ,
978 .BR IP_PKTINFO ,
979 .BR IP_RECVERR ,
980 .B IP_ROUTER_ALERT
981 は Linux 固有であり、移植性を考慮したプログラムでは
982 用いるべきではない。
983 .\" IP_PASSSEC is Linux-specific
984 .\" IP_TRANSPARENT is Linux-specific
985 .\" IP_FREEBIND is Linux-specific
986 .\" IP_XFRM_POLICY is Linux-specific
987 .\" IP_IPSEC_POLICY is a nonstandard extension, also present on some BSDs
988 .B SO_BROADCAST
989 オプションの利用には、くれぐれも注意すること。
990 これは Linux では特権操作ではない。
991 不注意なブロードキャストを行うと、ネットワークは簡単に過負荷状態になる。
992 新しいアプリケーションプロトコルには、ブロードキャストではなく
993 マルチキャストグループを用いるほうがよい。
994 ブロードキャストは推奨されない。
995 .PP
996 他の BSD のソケット実装では、
997 .B IP_RCVDSTADDR
998
999 .B IP_RECVIF
1000 といったソケットオプションがサポートされており、
1001 宛先アドレスや受信データグラムのインターフェースが取得できるように
1002 なっていることもある。
1003 Linux で同じことをやらせるには、より一般的な
1004 .B IP_PKTINFO
1005 が使える。
1006 .PP
1007 いくつかの BSD のソケット実装では
1008 .B IP_RECVTTL
1009 オプションも提供されているが、タイプ
1010 .B IP_RECVTTL
1011 の補助メッセージは受信パケットとともに渡される。
1012 これは Linux で使われている
1013 .B IP_TTL
1014 オプションとは異なる動作である。
1015 .PP
1016 .B SOL_IP
1017 ソケットオプションレベルは移植性がない。
1018 BSD ベースのプロトコルスタックでは
1019 .B IPPROTO_IP
1020 レベルが使用されている。
1021 .SS 移植性
1022 Linux 2.0 との互換性のために、 obsolete な
1023 .BI "socket(AF_INET, SOCK_PACKET, " protocol )
1024 という書式でも
1025 .BR packet (7)
1026 をオープンできるようになっているが、これはお勧めできない。今後は
1027 .BI "socket(AF_PACKET, SOCK_RAW, " protocol )
1028 を代わりに用いるべきである。主な違いは、ジェネリックなリンク層用の
1029 .I sockaddr_ll
1030 アドレス構造体が、古い
1031 .B sockaddr_pkt
1032 に変わって用いられるようになったことである。
1033 .SH バグ
1034 エラーの値が全く首尾一貫していない。
1035 .PP
1036 IP 固有のインターフェースオプションを指定するための ioctl と
1037 ARP テーブルのことが記述されていない。
1038 .PP
1039 glibc のバージョンによっては
1040 .I in_pktinfo
1041 の定義を忘れているものがある。
1042 現時点でのとりあえずの対策としては、この man ページにある定義をプログラム中に
1043 コピーすることである。
1044 .PP
1045 .BR recvmsg (2)
1046
1047 .I msg_name
1048
1049 .B MSG_ERRQUEUE
1050 を指定して、受信パケットに入っていた宛先アドレスを取得する方法は
1051 2.2 カーネルの一部でうまく動かない。
1052 .\" .SH 著者
1053 .\" この man ページは Andi Kleen が書いた。
1054 .SH 関連項目
1055 .BR recvmsg (2),
1056 .BR sendmsg (2),
1057 .BR byteorder (3),
1058 .BR ipfw (4),
1059 .BR capabilities (7),
1060 .BR netlink (7),
1061 .BR raw (7),
1062 .BR socket (7),
1063 .BR tcp (7),
1064 .BR udp (7)
1065 .PP
1066 .BR RFC\ 791 :
1067 オリジナルの IP の仕様
1068 .br
1069 .BR RFC\ 1122 :
1070 IPv4 ホストの必要条件
1071 .br
1072 .BR RFC\ 1812 :
1073 IPv4 ルータの必要条件
1074 .\" FIXME autobind INADDR REUSEADDR