名 前
udp − IPv4 の ユ ー ザ ー デ ー タ グ ラ ム プ ロ ト コ ル
書 式
#include
<sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
説 明
こ れ は RFC 768 で 記 述 さ れ て い る User Datagram Protocol の 実 装 で あ る 。 UDP は コ ネ ク シ ョ ン レ ス の 、 信 頼 性 の 低 い デ ー タ パ ケ ッ ト サ ー ビ ス で あ る 。 パ ケ ッ ト は 到 着 前 に 並 び 替 え ら れ た り 複 製 さ れ た り す る 。 UDP は 転 送 エ ラ ー を 検 出 す る た め に チ ェ ッ ク サ ム を 生 成 ・ チ ェ ッ ク す る 。
UDP ソ ケ ッ ト が 生 成 さ れ る と き 、 ロ ー カ ル ア ド レ ス や リ モ ー ト ア ド レ ス は 指 定 さ れ な い 。 正 し い 行 き 先 ア ド レ ス を 引 数 と し て sendto(2) や sendmsg(2) を 呼 べ ば 、 デ ー タ グ ラ ム は た だ ち に 送 信 さ れ る 。 ソ ケ ッ ト に 対 し て connect(2) を 呼 ぶ と 、 デ フ ォ ル ト の 行 き 先 ア ド レ ス が 設 定 さ れ 、 send(2) や write(2) を 使 っ て 、 行 き 先 ア ド レ ス の 指 定 な し に デ ー タ グ ラ ム を 送 信 で き る よ う に な る 。 こ の 場 合 で も 、 行 き 先 ア ド レ ス を sendto(2) や sendmsg(2) に 渡 せ ば 、 デ フ ォ ル ト 以 外 の ア ド レ ス に 送 信 可 能 で あ る 。 パ ケ ッ ト を 受 信 す る た め に 、 ま ず ソ ケ ッ ト を bind(2) を 用 い て ロ ー カ ル な ア ド レ ス に バ イ ン ド さ せ る こ と も で き る 。 そ う で な い 場 合 は 、 ソ ケ ッ ト 層 は 自 動 的 に /proc/sys/net/ipv4/ip_local_port_range で 定 義 さ れ て い る 範 囲 の 外 で 空 い て い る ロ ー カ ル な ポ ー ト を 割 り 当 て 、 ソ ケ ッ ト を INADDR_ANY に バ イ ン ド す る 。 受 信 動 作 は パ ケ ッ ト を 一 つ だ け 返 す 。 渡 し た バ ッ フ ァ ー よ り も パ ケ ッ ト が 小 さ け れ ば 、 そ の パ ケ ッ ト の 大 き さ の デ ー タ だ け が 返 さ れ る 。 逆 に バ ッ フ ァ ー よ り も 大 き い 場 合 は パ ケ ッ ト は 丸 め ら れ 、 MSG_TRUNC フ ラ グ が セ ッ ト さ れ る 。 MSG_WAITALL は サ ポ ー ト し て い な い 。
IP オ プ シ ョ ン は 、 ip(7) に 記 述 さ れ て い る ソ ケ ッ ト オ プ シ ョ ン を 用 い て 読 み 書 き で き る 。 こ れ ら は 適 切 な /proc パ ラ メ ー タ ー が 有 効 な 場 合 に 限 っ て カ ー ネ ル に よ っ て 処 理 さ れ る (し か し 無 効 に な っ て い る 場 合 で も ユ ー ザ ー に は 渡 さ れ る )。 ip(7) を 参 照 の こ と 。
MSG_DONTROUTE
フ ラ グ が 送 信
時 に セ ッ ト さ
れ て い る 場 合
に は 、 行 き 先
ア ド レ ス は ロ
ー カ ル な イ ン
タ ー フ ェ ー ス
ア ド レ ス か ら
参 照 で き な け
れ ば な ら な い
。 パ ケ ッ ト は
そ の イ ン タ ー
フ ェ ー ス に し
か 送 ら れ な い
。 デ フ ォ ル ト
で は 、 Linux の UDP は Path
MTU Discovery を 行 う 。 つ
ま り 、 カ ー ネ
ル は 特 定 の 宛
先 IP ア ド レ ス の MTU
(Maximum Transmission Unit; 最 大 転
送 単 位 ) を 記 録
し 、 UDP パ ケ ッ ト
の 書 き 込 み が MTU
を 超 え た 場 合
EMSGSIZE を 返 す 。
EMSGSIZE を 返 さ れ た
場 合 、 ア プ リ
ケ ー シ ョ ン は
パ ケ ッ ト サ イ
ズ を 小 さ く す
べ き で あ る 。
ソ ケ ッ ト オ プ
シ ョ ン IP_MTU_DISCOVER ま
た は /proc/sys/net/ipv4/ip_no_pmtu_disc
フ ァ イ ル を 使
っ て Path MTU Discovery を 無
効 に す る こ と
も で き る (詳 細
は ip(7) を 参 照 )。
Path MTU Discovery を 無 効 に
し た 場 合 は 、
パ ケ ッ ト サ イ
ズ が イ ン タ ー
フ ェ ー ス の MTU よ
り も 大 き い と UDP
は そ の パ ケ ッ
ト を フ ラ グ メ
ン ト 化 し て 送
出 す る 。 し か
し な が ら 、 性
能 と 信 頼 性 の
理 由 か ら Path MTU Discovery
を 無 効 に す る
の は 推 奨 で き
な い 。 ア ド レ
ス の フ ォ ー マ
ッ ト
UDP は IPv4 の sockaddr_in ア
ド レ ス フ ォ ー
マ ッ ト を 用 い
る 。 こ れ は ip(7)
に 記 述 さ れ て
い る 。 エ ラ ー
処 理 致 命 的 な
エ ラ ー は 、 た
と え ソ ケ ッ ト
が 接 続 さ れ て
い な く て も 、
す べ て エ ラ ー
戻 り 値 と し て
ユ ー ザ ー に 渡
さ れ る 。 こ れ
に は ネ ッ ト ワ
ー ク か ら 受 け
取 る 非 同 期 エ
ラ ー も 含 ま れ
る 。 同 じ ソ ケ
ッ ト を 使 っ て
送 信 し た 昔 の
パ ケ ッ ト に 関
す る エ ラ ー を
受 け 取 る か も
し れ な い 。 こ
の 振 る 舞 い は
他 の BSD ソ ケ ッ ト
の 実 装 の 多 く
と は 異 な る 。
こ れ ら で は ソ
ケ ッ ト が 接 続
さ れ て い な い
場 合 は エ ラ ー
を 全 く 返 さ な
い 。 Linux の 振 る 舞
い は RFC 1122 で の
指 定 に 従 っ た
も の で あ る 。
Linux 2.0 と 2.2 で は 、 古 い コ ー ド と の 互 換 性 の た め に 、 SO_BSDCOMPAT SOL_SOCKET オ プ シ ョ ン を 設 定 す れ ば 、 ソ ケ ッ ト が 接 続 さ れ て い る 場 合 に 限 っ て リ モ ー ト の エ ラ ー を 受 信 す る よ う に で き た (EPROTO と EMSGSIZE を 除 く )。 ロ ー カ ル で 生 成 さ れ た エ ラ ー は 常 に 渡 さ れ る 。 こ の ソ ケ ッ ト オ プ シ ョ ン の サ ポ ー ト は そ れ 以 降 の バ ー ジ ョ ン の Linux で 削 除 さ れ た 。 詳 細 は socket(7) を 参 照 。
IP_RECVERR オ プ シ ョ ン が 有 効 に な っ て い る と 、 す べ て の エ ラ ー は ソ ケ ッ ト の エ ラ ー キ ュ ー に 保 存 さ れ る 。 こ れ は MSG_ERRQUEUE フ ラ グ を セ ッ ト し て recvmsg(2) を 呼 べ ば 受 信 で き る 。
/proc
イ ン タ ー フ ェ
ー ス シ ス テ ム
全 体 の UDP パ ラ メ
ー タ ー 設 定 に
は 、 /proc/sys/net/ipv4/ デ
ィ レ ク ト リ 内
の フ ァ イ ル の
読 み 書 き で ア
ク セ ス で き る
。
udp_mem (Linux 2.6.25 以 降 ) こ
れ は 3 つ の 整 数
か ら な る ベ ク
ト ル 値 で 、 UDP の
全 ソ ケ ッ ト の
キ ュ ー で 利 用
可 能 な ペ ー ジ
数 を 制 御 す る
。
min こ の ペ ー ジ 数 よ り 少 な け れ ば 、 |
UDP は そ の メ モ リ ー 使 用 に 関 |
し て 干 渉 さ れ な い 。 UDP に 割 り 当 て ら れ た メ モ リ ー 総 量 が こ の 値 を 超 過 す る と 、 UDP は メ モ リ ー 使 用 量 を 調 整 し 始 め る 。
pressure こ の 値 は |
tcp_mem の 形 式 (tcp(7) 参 照 ) と 合 わ せ る た め |
に 導 入 さ れ た
max |
UDP の 全 ソ ケ ッ ト の キ ュ ー で 利 用 可 能 な ペ ー ジ 数 。 |
こ れ ら の 3 つ の 値 の デ フ ォ ル ト 値 は 、 ブ ー ト 時 に 利 用 可 能 な メ モ リ ー 総 量 か ら 計 算 さ れ る 。
udp_rmem_min (integer;
デ フ ォ ル ト 値 :
PAGE_SIZE; Linux 2.6.25 以 降 ) メ
モ リ ー 使 用 量
の 調 整 中 に 、 UDP
ソ ケ ッ ト が 使
用 で き る 受 信
バ ッ フ ァ ー の
最 小 値 (バ イ ト
単 位 )。 UDP の 全 ソ
ケ ッ ト の ペ ー
ジ 使 用 量 の 合
計 が udp_mem pressure を 超
過 し て い る 場
合 で あ っ て も
、 各 UDP ソ ケ ッ ト
は デ ー タ の 受
信 に こ の サ イ
ズ 分 だ け は 使
用 す る こ と が
で き る 。
udp_wmem_min (integer; デ フ ォ
ル ト 値 : PAGE_SIZE; Linux 2.6.25
以 降 ) メ モ リ ー
使 用 量 の 調 整
中 に 、 UDP ソ ケ ッ
ト が 使 用 で き
る 送 信 バ ッ フ
ァ ー の 最 小 値
(バ イ ト 単 位 )。 UDP
の 全 ソ ケ ッ ト
の ペ ー ジ 使 用
量 の 合 計 が udp_mem
pressure を 超 過 し て
い る 場 合 で あ
っ て も 、 各 UDP ソ
ケ ッ ト は デ ー
タ の 送 信 に こ
の サ イ ズ 分 だ
け は 使 用 す る
こ と が で き る
。 ソ ケ ッ ト オ
プ シ ョ ン
UDP ソ ケ ッ ト オ プ
シ ョ ン を 設 定
ま た は 取 得 す
る に は 、 取 得
に は getsockopt(2) を 、
設 定 に は setsockopt(2)
を オ プ シ ョ ン
レ ベ ル 引 数 に
IPPROTO_UDP を 指 定 し
て 呼 び 出 す 。
注 釈 が な い 限
り 、 optval は int へ
の ポ イ ン タ ー
で あ る 。
UDP_CORK (Linux 2.5.44 以 降 ) こ
の オ プ シ ョ ン
が 指 定 さ れ る
と 、 こ の ソ ケ
ッ ト の 全 て の
デ ー タ 出 力 は
一 つ の デ ー タ
グ ラ ム に 蓄 積
さ れ 、 こ の オ
プ シ ョ ン が 無
効 化 さ れ た 時
に 送 信 さ れ る
。 こ の オ プ シ
ョ ン は 移 植 性
を 考 慮 し た コ
ー ド で は 用 い
る べ き で は な
い 。
ioctl 以 下 に 示 す ioctl は ioctl(2) を 使 っ て ア ク セ ス で き る 。 正 し い 文 法 は 以 下 の 通 り 。
int
value;
error = ioctl(udp_socket,
ioctl_type, &value);
FIONREAD
(SIOCINQ) 整 数 へ の
ポ イ ン タ ー を
引 き 数 に 取 り
、 そ の ポ イ ン
タ ー に 、 次 の
処 理 待 ち の デ
ー タ グ ラ ム の
サ イ ズ を バ イ
ト 単 位 で 返 す
。 処 理 待 ち の
デ ー タ グ ラ ム
が な い 場 合 は 0
を 返 す 。 警 告
: FIONREAD を 使 っ た
場 合 、 処 理 待
ち の デ ー タ グ
ラ ム が な い 場
合 と 、 次 の 処
理 待 ち デ ー タ
グ ラ ム が 0 バ イ
ト の デ ー タ の
場 合 を 区 別 す
る こ と が で き
な い 。 こ の 両
者 を 区 別 し た
い 場 合 は 、
select(2), poll(2), epoll(7) を
使 う 方 が 安 全
で あ る 。
TIOCOUTQ (SIOCOUTQ) ロ ー カ
ル 送 信 キ ュ ー
に あ る デ ー タ
サ イ ズ を バ イ
ト 単 位 で 返 す
。 Linux 2.4 以 上 で の
み 対 応 し て い
る 。 さ ら に 、
ip(7) と socket(7) で 述
べ ら れ て い る
全 て の ioctl も 対 応
し て い る 。
エ ラ ー
socket(7)
や ip(7) に 記 述 さ
れ て い る 全 て
の エ ラ ー が 、 UDP
ソ ケ ッ ト の 送
受 信 で 返 さ れ
る 可 能 性 が あ
る 。
ECONNREFUSED 行 き 先 ア
ド レ ス に 関 連
づ け ら れ て い
る 受 信 者 が い
な い 。 こ れ は
以 前 の パ ケ ッ
ト が そ の パ ケ
ッ ト を 上 書 き
送 信 し て し ま
っ て い る か ら
で あ る こ と が
多 い 。
バ ー ジ ョ ン
IP_RECVERR は Linux 2.2 の 新 し い 機 能 で あ る 。
関 連 項 目
ip(7), raw(7), socket(7), udplite(7)
RFC 768 :
User Datagram Protocol
RFC 1122 : ホ ス ト の 必
要 条 件
RFC 1191 : path MTU discovery の 記
述
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。