Manpages

名 前

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 オ プ シ ョ ン を 設 定 す れ ば 、 ソ ケ ッ ト が 接 続 さ れ て い る 場 合 に 限 っ て リ モ ー ト の エ ラ ー を 受 信 す る よ う に で き た (EPROTOEMSGSIZE を 除 く )。 ロ ー カ ル で 生 成 さ れ た エ ラ ー は 常 に 渡 さ れ る 。 こ の ソ ケ ッ ト オ プ シ ョ ン の サ ポ ー ト は そ れ 以 降 の バ ー ジ ョ ン の 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 を 指 定 し て 呼 び 出 す 。 注 釈 が な い 限 り 、 optvalint へ の ポ イ ン タ ー で あ る 。
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/ に 書 か れ て い る 。