名 前
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) を 参 照 の こ と 。
IP ソ ケ ッ ト は 、 socket(2) 関 数 を socket(AF_INET, socket_type, protocol) の よ う に 呼 び 出 す こ と で 生 成 さ れ る 。 指 定 で き る ソ ケ ッ ト タ イ プ は 3 つ あ り 、 tcp(7) ソ ケ ッ ト を オ ー プ ン す る 場 合 SOCK_STREAM、 udp(7) ソ ケ ッ ト を オ ー プ ン す る 場 合 SOCK_DGRAM、 IP プ ロ ト コ ル に 直 接 ア ク セ ス す る た め に raw(7) ソ ケ ッ ト を オ ー プ ン す る 場 合 に は SOCK_RAW で あ る 。 protocol は 送 受 信 さ れ る IP ヘ ッ ダ ー に 書 か れ る IP プ ロ ト コ ル で あ る 。 指 定 で き る 値 は 、 TCP ソ ケ ッ ト に は 0 か IPPROTO_TCP、 UDP ソ ケ ッ ト に は 0 か IPPROTO_UDP に 限 ら れ る 。 SOCK_RAW に 対 し て は 、 RFC 1700 で 定 義 さ れ て い る 有 効 な IANA IP プ ロ ト コ ル を 、 割 り 当 て ら れ て い る 番 号 で 指 定 す る こ と が で き る 。 あ る プ ロ セ ス で 、 や っ て く る パ ケ ッ ト を 受 信 し た り 接 続 要 求 を 受 け た り し た い 場 合 に は 、 そ の プ ロ セ ス は ロ ー カ ル な イ ン タ ー フ ェ ー ス ア ド レ ス に 、 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_familiy に は 常 に AF_INET を セ ッ ト す る 。 こ れ は 必 須 で あ る 。 Linux 2.2 で は 、 こ の セ ッ ト を 忘 れ る と ほ と ん ど の ネ ッ ト ワ ー ク 関 数 は EINVAL を 返 す よ う に な っ て い る 。 sin_port に は ポ ー ト 番 号 を ネ ッ ト ワ ー ク バ イ ト オ ー ダ ー で 指 定 す る 。 1024 未 満 の ポ ー ト 番 号 は 特 権 ポ ー ト (privileged ports) と 呼 ば れ る (予 約 ポ ー ト (reserved ports) と も 時 々 呼 ば れ る )。 特 権 プ ロ セ ス (CAP_NET_BIND_SERVICE ケ ー パ ビ リ テ ィ を 持 つ プ ロ セ ス ) 以 外 の プ ロ セ ス は 、 こ れ ら の ポ ー ト に は bind(2) で き な い 。 IPv4 プ ロ ト コ ル そ の も の に は ポ ー ト に 関 す る 概 念 が な い 。 ポ ー ト が 実 装 さ れ る の は 、 tcp(7) や udp(7) と い っ た 、 上 位 の プ ロ ト コ ル に お い て の み で あ る 。
sin_addr は IP ホ ス ト ア ド レ ス で あ る 。 struct in_addr の s_addr メ ン バ に は 、 ホ ス ト の イ ン タ ー フ ェ ー ス ア ド レ ス を ネ ッ ト ワ ー ク バ イ ト オ ー ダ ー で 指 定 す る 。 in_addr は 、 INADDR_* の 一 つ (例 え ば INADDR_ANY) を 代 入 す る 、 ラ イ ブ ラ リ 関 数 inet_aton(3), inet_addr(3), inet_makeaddr(3) を 用 い る 、 あ る い は 名 前 解 決 機 構 (name resolver) を 直 接 用 い る 、 の ど れ か で 設 定 す べ き で あ る 。 (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 は 偽 、 そ れ
以 外 は 真 を 意
味 す る 。
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_ifindex は imr_multiaddr グ ル ー プ に 参 加 /脱 退 す る イ ン タ ー フ ェ ー ス の interface index で あ る 。 ど の イ ン タ ー フ ェ ー ス で も よ い 場 合 は 0 に す る 。
ip_mreqn 構 造 体 は Linux 2.2 以 降 で の み 利 用 可 能 で あ る 。 互 換 性 の た め 、 古 い ip_mreq 構 造 体 (Linux 1.2 以 降 で 存 在 す る ) も ま だ サ ポ ー ト さ れ て い る 。 ip_mreqn と の 違 い は 、 imr_ifindex フ ィ ー ル ド を 含 ま な い こ と だ け で あ る 。 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_MEMBERSIP の 項 で 説 明 し た ip_mreqn に 似 て い る 。 imr_multiaddr フ ィ ー ル ド に は 、 ア プ リ ケ ー シ ョ ン が 参 加 ま た は 脱 退 し た い マ ル チ キ ャ ス ト グ ル ー プ の ア ド レ ス が 入 る 。 imr_interface フ ィ ー ル ド は 、 マ ル チ キ ャ ス ト グ ル ー プ に 参 加 す る 際 に シ ス テ ム が 使 用 す べ き ロ ー カ ル イ ン タ ー フ ェ ー ス の ア ド レ ス で あ る 。 imr_sourceaddr フ ィ ー ル ド に は 、 ア プ リ ケ ー シ ョ ン が デ ー タ を 受 信 し た い 送 信 元 の ア ド レ ス が 入 る 。 こ の オ プ シ ョ ン を 複 数 回 使 う こ と で 、 複 数 の 送 信 元 か ら の デ ー タ 受 信 を 許 可 す る こ と が で き る 。
IP_BLOCK_SOURCE (since
Linux 2.4.22 以 降 / 2.5.68 以 降 )
指 定 し た グ ル
ー プ で 、 指 定
し た 送 信 元 か
ら の マ ル チ キ
ャ ス ト デ ー タ
の 受 信 を 停 止
す る 。 こ の オ
プ シ ョ ン は 、
ア プ リ ケ ー シ
ョ ン が IP_ADD_MEMBERSHIP か
IP_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_LEAVE_GROUP を 使 う
こ と 。 引 き 数
は 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 以 降 ) 有
効 に な っ て い
る と 、 ユ ー ザ
ー は IP ヘ ッ ダ ー
を ユ ー ザ ー デ
ー タ の 前 に 与
え る 。 SOCK_RAW ソ ケ
ッ ト で の み 有
効 で あ る 。 詳
細 は raw(7) を 見 よ
。 こ の フ ラ グ
が 有 効 に な っ
て い る と 、
IP_OPTIONS, IP_TTL, IP_TOS は
無 視 さ れ る 。
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_INCLUDE と MCAST_EXCLUDE の 2 つ の マ ク ロ が あ り 、 フ ィ ル タ リ ン グ モ ー ド を 指 定 す る の に 使 用 で き る 。 ま た 、 IP_MSFILTER_SIZE(n) マ ク ロ が あ り 、 送 信 元 リ ス ト に n 個 の 送 信 元 が 入 っ た ip_msfilter 構 造 体 を 格 納 す る の に 必 要 な メ モ リ ー 量 を 判 定 す る こ と が で き る 。 マ ル チ キ ャ ス ト 送 信 元 フ ィ ル タ リ ン グ の 全 容 は RFC 3376 を 参 照 の こ と 。
IP_MTU (Linux 2.2
以 降 ) ソ ケ ッ ト
の 、 既 知 の path MTU
を 取 得 す る 。
ソ ケ ッ ト が 接
続 し て い る 場
合 の み 有 効 で
あ る 。 getsockopt(2) で
の み 使 え る 。
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_WANT と
IP_PMTUDISC_DONT の ど ち ら
か に 設 定 す る
こ と が で き る
。 設 定 の 変 更
は 、 /proc/sys/net/ipv4/ip_no_pmtu_disc
フ ァ イ ル に 、 0
(IP_PMTUDISC_WANT) か 0 以 外
(IP_PMTUDISC_DONT) を 書 き
込 む こ と で 行
う 。
path MTU discovery が 有 効 に な っ て い る と 、 カ ー ネ ル は 宛 先 ホ ス ト ご と に 自 動 的 に path MTU を 処 理 す る 。 特 定 の 相 手 に connect(2) で 接 続 し た 場 合 に は 、 IP_MTU ソ ケ ッ ト オ プ シ ョ ン を 用 い れ ば 、 既 知 の path MTU の 取 得 に 便 利 で あ る (た と え ば EMSGSIZE エ ラ ー が 起 き た 後 な ど )。 path MTU は 時 間 と と も に 変 化 す る か も し れ な い 。 宛 先 が た く さ ん あ る コ ネ ク シ ョ ン レ ス な ソ ケ ッ ト で は 、 与 え ら れ た 宛 先 に 対 す る 新 し い MTU に も 、 エ ラ ー キ ュ ー を 用 い て ア ク セ ス す る こ と が で き る (IP_RECVERR を 見 よ )。 MTU 更 新 が 到 着 す る ご と に 、 新 た な エ ラ ー が キ ュ ー イ ン グ さ れ る 。
MTU discovery の 進 行 中 に は 、 デ ー タ グ ラ ム ソ ケ ッ ト か ら の 初 期 パ ケ ッ ト は 到 着 し な い か も し れ な い 。 UDP を 用 い る ア プ リ ケ ー シ ョ ン で は 、 こ の こ と を 気 に か け て お き 、 パ ケ ッ ト の 再 送 ア ル ゴ リ ズ ム に こ の 分 を 除 外 さ せ る べ き で あ る 。 接 続 し て い な い ソ ケ ッ ト に 対 し て path MTU discovery プ ロ セ ス を 立 ち 上 げ る に は 、 大 き な デ ー タ グ ラ ム サ イ ズ (最 大 64K ヘ ッ ダ ー バ イ ト 長 ) か ら は じ め て 、 path MTU が 更 新 さ れ る ま で サ イ ズ を 縮 め て い く こ と も 可 能 で あ る 。
path MTU の 値 を ま ず 見 積 も っ て み る に は 、 宛 先 ア ド レ ス に connect(2) を 使 っ て デ ー タ グ ラ ム ソ ケ ッ ト を 接 続 し 、 getsockopt(2) を IP_MTU オ プ シ ョ ン と と も に 呼 び 、 MTU を 取 得 す る こ と で あ る 。
IP_PMTUDISC_PROBE (Linux 2.6.22 以 降 で 利 用 可 能 ) を 設 定 す る こ と で 、 SOCK_DGRAM や SOCK_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 以 降 ) ロ
ー カ ル デ バ イ
ス を マ ル チ キ
ャ ス ト ソ ケ ッ
ト と し て 設 定
す る 。 引 き 数
は IP_ADD_MEMBERSHIP と 同 様
に ip_mreqn 構 造 体 か
ip_mreq 構 造 体 (Linux 3.5
以 降 ) で あ る 。
不 正 な ソ ケ ッ
ト オ プ シ ョ ン
が 渡 さ れ る と
、 ENOPROTOOPT が 返 さ
れ る 。
IP_MULTICAST_LOOP (Linux 1.2 以 降 )
マ ル チ キ ャ ス
ト パ ケ ッ ト を
ロ ー カ ル な ソ
ケ ッ ト に ル ー
プ バ ッ ク す る
か ど う か を 定
め る ブ ー ル 値
の 整 数 引 き 数
を 設 定 ・ 取 得
す る 。
IP_MULTICAST_TTL (Linux 1.2 以 降 ) こ
の ソ ケ ッ ト か
ら 発 信 さ れ る
マ ル チ キ ャ ス
ト パ ケ ッ ト の
time−to−live 値 を 設 定
・ 取 得 す る 。
マ ル チ キ ャ ス
ト パ ケ ッ ト に
対 し て は 、 で
き る だ け 小 さ
な TTL に 設 定 す る
こ と が と て も
重 要 で あ る 。
デ フ ォ ル ト は 1
で 、 ユ ー ザ ー
プ ロ グ ラ ム が
明 示 的 に 要 求
し な い 限 り マ
ル チ キ ャ ス ト
パ ケ ッ ト は ロ
ー カ ル な ネ ッ
ト ワ ー ク か ら
出 な い こ と に
な る 。 引 き 数
に 整 数 を 取 る
。
IP_NODEFRAG (Linux 2.6.36 以 降 ) 有
効 (引 き 数 が 0 以
外 の 場 合 ) に な
っ て い る と 、
netfilter 層 で の 出 力
パ ケ ッ ト の 再
構 築 (reassembly) が 行 わ
れ な く な る 。
こ の オ プ シ ョ
ン は SOCK_RAW ソ ケ ッ
ト に お い て の
み 有 効 で あ る
。 引 き 数 は 整
数 で あ る 。
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_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_PKTINFO が sendmsg(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_type と ee_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_ERRQUEUE は SOCK_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 以 降 ) こ
の フ ラ グ が セ
ッ ト さ れ て い
る と 、 IP_TTL コ ン
ト ロ ー ル メ ッ
セ ー ジ が 受 信
パ ケ ッ ト の
time−to−live フ ィ ー ル
ド の バ イ ト デ
ー タ と と も に
渡 さ れ る 。
SOCK_STREAM ソ ケ ッ ト
で は サ ポ ー ト
さ れ て い な い
。
IP_RETOPTS
IP_RETOPTS (Linux 2.2 以 降 ) IP_RECVOPTS と 等 価 だ が 、 未 処 理 の 生 の オ プ シ ョ ン を 、 こ の hop で は 記 入 さ れ な い timestamp レ コ ー ド と route レ コ ー ド と と も に 返 す 。
IP_ROUTER_ALERT (Linux
2.2 以 降 ) フ ォ ワ ー
ド す べ き パ ケ
ッ ト を IP Router Alert オ プ
シ ョ ン を つ け
て こ の ソ ケ ッ
ト に 渡 す 。 raw ソ
ケ ッ ト に 対 し
て の み 有 効 で
あ る 。 こ れ は
た と え ば ユ ー
ザ ー 空 間 の RSVP デ
ー モ ン に 対 し
て 便 利 で あ る
。 タ ッ プ さ れ
た パ ケ ッ ト は
カ ー ネ ル に よ
っ て は フ ォ ワ
ー ド さ れ な い
の で 、 こ れ ら
を 再 送 す る の
は ユ ー ザ ー の
責 任 と な る 。
ソ ケ ッ ト の バ
イ ン ド は 無 視
さ れ 、 こ の よ
う な パ ケ ッ ト
は プ ロ ト コ ル
に よ っ て の み
フ ィ ル タ リ ン
グ さ れ る 。 整
数 値 の フ ラ グ
を 取 る 。
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 ケ
ー パ ビ リ テ ィ )
が 必 要 と な る
か も し れ な い
。 優 先 度 は
(SOL_SOCKET, SO_PRIORITY) ソ ケ
ッ ト オ プ シ ョ
ン を 用 い れ ば
、 プ ロ ト コ ル
に 依 存 し な い
形 で も 設 定 で
き る (socket(7) を 見
よ )。
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 の 項 に 説 明 が あ る 。
/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 を 無 効 に す
る と ネ ッ ト ワ
ー ク の コ ス ト
が 大 き く な っ
て し ま う か ら
で あ る 。 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 に ま で 切
り 捨 て ら れ る
。 そ れ ぞ れ の
大 き さ を バ イ
ト 単 位 で 表 す
整 数 値 が 入 っ
て い る 。 arp(7) を 見 よ 。 ioctl エ ラ ー
SO_BROADCAST フ
ラ グ を 設 定 し
て い な い 状 態
で ブ ロ ー ド キ
ャ ス ト ア ド レ
ス に パ ケ ッ ト
を 送 ろ う と し
た 。 prohibit な ル ー
ト を 通 し て パ
ケ ッ ト を 送 ろ
う と し た 。 ス
ー パ ー ユ ー ザ
ー 権 限 (CAP_NET_ADMIN ケ
ー パ ビ リ テ ィ )
な し で フ ァ イ
ア ウ ォ ー ル の
設 定 を 変 更 し
よ う と し た 。
ス ー パ ー ユ ー
ザ ー 権 限
(CAP_NET_BIND_SERVICE ケ ー パ
ビ リ テ ィ ) な し
で 特 権 ポ ー ト
に バ イ ン ド し
よ う と し た 。
EALREADY 非
ブ ロ ッ キ ン グ
ソ ケ ッ ト に 対
す る 接 続 操 作
が 既 に 実 行 中
で あ る 。 accept(2) の 途 中 で 接 続 が ク ロ ー ズ さ れ た 。 EHOSTUNREACH 宛 先 ア ド レ ス に マ ッ チ す る 有 効 な エ ン ト リ ー が ル ー テ ィ ン グ テ ー ブ ル に 存 在 し な い 。 こ の エ ラ ー は リ モ ー ト ル ー タ ー か ら の 、 あ る い は ロ ー カ ル ル ー テ ィ ン グ テ ー ブ ル へ の ICMP メ ッ セ ー ジ に よ っ て 引 き 起 こ さ れ る こ と が あ る 。
信 し よ う と す る と こ の エ ラ ー が 起 こ る こ と が あ る 。 EISCONN 接
続 済 み の ソ ケ
ッ ト に 対 し て
connect(2) が 呼 ば れ
た 。
ENOPROTOOPT と
EOPNOTSUPP 無 効 な ソ
ケ ッ ト オ プ シ
ョ ン が 渡 さ れ
た 。
ESOCKTNOSUPPORT ソ ケ ッ ト が 未 設 定 で あ る か 、 知 ら な い ソ ケ ッ ト タ イ プ が 要 求 さ れ た 。 他 の エ ラ ー が 上 層 の プ ロ ト コ ル に よ っ て 生 じ る か も し れ な い 。 tcp(7), raw(7), udp(7), socket(7) な ど を 参 照 の こ と 。 注 意IP_FREEBIND, IP_MSFILTER, IP_MTU, IP_MTU_DISCOVER, IP_RECVORIGDSTADDR, IP_PKTINFO, IP_RECVERR, IP_ROUTER_ALERT, and IP_TRANSPARENT は Linux 固 有 で あ る 。 SO_BROADCAST オ プ シ ョ ン の 利 用 に は 、 く れ ぐ れ も 注 意 す る こ と 。 こ れ は Linux で は 特 権 操 作 で は な い 。 不 注 意 な ブ ロ ー ド キ ャ ス ト を 行 う と 、 ネ ッ ト ワ ー ク は 簡 単 に 過 負 荷 状 態 に な る 。 新 し い ア プ リ ケ ー シ ョ ン プ ロ ト コ ル に は 、 ブ ロ ー ド キ ャ ス ト で は な く マ ル チ キ ャ ス ト グ ル ー プ を 用 い る ほ う が よ い 。 ブ ロ ー ド キ ャ ス ト は 推 奨 さ れ な い 。 他 の BSD の ソ ケ ッ ト 実 装 で は 、 IP_RCVDSTADDR と IP_RECVIF と い っ た ソ ケ ッ ト オ プ シ ョ ン が サ ポ ー ト さ れ て お り 、 宛 先 ア ド レ ス や 受 信 デ ー タ グ ラ ム の イ ン タ ー フ ェ ー ス が 取 得 で き る よ う に な っ て い る こ と も あ る 。 Linux で 同 じ こ と を や ら せ る に は 、 よ り 一 般 的 な IP_PKTINFO が 使 え る 。 い く つ か の BSD の ソ ケ ッ ト 実 装 で は IP_RECVTTL オ プ シ ョ ン も 提 供 さ れ て い る が 、 タ イ プ IP_RECVTTL の 補 助 メ ッ セ ー ジ は 受 信 パ ケ ッ ト と と も に 渡 さ れ る 。 こ れ は Linux で 使 わ れ て い る IP_TTL オ プ シ ョ ン と は 異 な る 動 作 で あ る 。 SOL_IP
ソ ケ ッ ト オ プ
シ ョ ン レ ベ ル
は 移 植 性 が な
い 。 BSD ベ ー ス の
プ ロ ト コ ル ス
タ ッ ク で は
IPPROTO_IP レ ベ ル が
使 用 さ れ て い
る 。 移 植 性 バ グエ ラ ー の 値 が ま っ た く 首 尾 一 貫 し て い な い 。 一 時 ポ ー ト の 範 囲 の 枯 渇 を 示 す の に 使 わ れ る エ ラ ー は 、 一 時 ポ ー ト の 割 り 当 て を 行 え る シ ス テ ム コ ー ル (connect(2), bind(2), listen(2), sendto(2)) に よ り 異 な る 。 IP 固 有 の イ ン タ ー フ ェ ー ス オ プ シ ョ ン を 指 定 す る た め の ioctl と ARP テ ー ブ ル の こ と が 記 述 さ れ て い な い 。 recvmsg(2) で msg_name に MSG_ERRQUEUE を 指 定 し て 、 受 信 パ ケ ッ ト に 入 っ て い た 宛 先 ア ド レ ス を 取 得 す る 方 法 は 2.2 カ ー ネ ル の 一 部 で う ま く 動 か な い 。 関 連 項 目recvmsg(2), sendmsg(2), byteorder(3), ipfw(4), capabilities(7), icmp(7), ipv6(7), netlink(7), raw(7), socket(7), tcp(7), udp(7) RFC 791: 元 々 の IP 仕 様 。 RFC 1122: IPv4 ホ ス ト の 要 件 。 RFC 1812: IPv4 ル ー タ ー の 要 件 。 こ の 文 書 に つ い てこ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。 |