名 前
tcp − TCP プ ロ ト コ ル
書 式
#include
<sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
説 明
こ れ は RFC 793, RFC 1122, RFC 2001 で 定 義 さ れ て い る TCP プ ロ ト コ ル を NewReno 拡 張 と SACK 拡 張 を 含 め て 実 装 し た も の で あ る 。 TCP は 、 ip(7) 上 の 二 つ の ソ ケ ッ ト 間 に 、 信 頼 性 の 高 い 、 ス ト リ ー ム 指 向 の 全 二 重 (full−duplex) 通 信 を 提 供 す る 。 v4 と v6 の 両 方 の バ ー ジ ョ ン の ip(7) に 対 応 し て い る 。 TCP は 、 デ ー タ が 順 序 を 守 っ て 到 着 す る こ と 、 途 中 で 失 わ れ た パ ケ ッ ト が 再 送 さ れ る こ と を 保 証 す る 。 ま た 、 パ ケ ッ ト 単 位 に チ ェ ッ ク サ ム を 生 成 、 検 査 す る こ と で 、 転 送 エ ラ ー を 検 知 す る 。 TCP は レ コ ー ド 境 界 (record boundary) を 保 存 し な い 。 新 し く 生 成 さ れ た ば か り の TCP ソ ケ ッ ト は 、 リ モ ー ト ア ド レ ス か ロ ー カ ル ア ド レ ス が な く 、 し た が っ て 詳 細 が 完 全 に 指 定 さ れ た 状 態 で は な い 。 外 部 へ の TCP 接 続 を 生 成 す る に は 、 connect(2) を 用 い て も う 一 方 の TCP ソ ケ ッ ト へ の 接 続 を 確 立 す る 。 外 部 か ら の 新 た な 接 続 を 受 け る に は 、 ま ず bind(2) で ソ ケ ッ ト を ロ ー カ ル な ア ド レ ス と ポ ー ト に 結 び つ け 、 次 に listen(2) を 呼 ん で ソ ケ ッ ト を 接 続 待 ち 受 け 状 態 に す る 。 そ の 後 、 到 着 し た 接 続 要 求 に 対 し て accept(2) を 用 い 、 ソ ケ ッ ト を 新 し く 生 成 す る 。 accept(2) ま た は connect(2) の コ ー ル が 成 功 し た ソ ケ ッ ト は 、 詳 細 が 完 全 に 指 定 さ れ た 状 態 と な り 、 デ ー タ の や り と り が 可 能 と な る 。 接 続 待 ち 受 け 状 態 の (listening) ソ ケ ッ ト や 、 接 続 (connect) さ れ て い な い ソ ケ ッ ト を 通 し て デ ー タ を や り と り す る こ と は で き な い 。
Linux は RFC 1323 の TCP high performance 拡 張 を サ ポ ー ト し て い る 。 こ れ に は 、 Protection Against Wrapped Sequence Numbers (PAWS)、 ウ ィ ン ド ウ ス ケ ー リ ン グ 、 タ イ ム ス タ ン プ な ど が 含 ま れ て い る 。 ウ ィ ン ド ウ ス ケ ー リ ン グ を 利 用 す る と 、 遅 延 ま た は 帯 域 の 大 き な 接 続 で 、 (64K 以 上 の ) 巨 大 な TCP ウ ィ ン ド ウ を 用 い る こ と が 可 能 と な る 。 こ れ を 用 い る に は 、 送 受 信 の バ ッ フ ァ ー サ イ ズ を 大 き く し な け れ ば な ら な い 。 シ ス テ ム 全 体 に 対 す る バ ッ フ ァ ー サ イ ズ の 変 更 は 、 フ ァ イ ル /proc/sys/net/ipv4/tcp_wmem と /proc/sys/net/ipv4/tcp_rmem を 用 い て 行 う こ と が で き る 。 ま た 、 個 々 の ソ ケ ッ ト の み を 大 き く し た い 場 合 に は 、 SO_SNDBUF や SO_RCVBUF ソ ケ ッ ト オ プ シ ョ ン を 用 い て setsockopt(2) コ ー ル を 用 い て 設 定 す れ ば よ い 。
SO_SNDBUF や SO_RCVBUF の メ カ ニ ズ ム で 宣 言 さ れ る ソ ケ ッ ト バ ッ フ ァ ー の 最 大 サ イ ズ は 、 フ ァ イ ル /proc/sys/net/core/rmem_max や /proc/sys/net/core/wmem_max で 指 定 さ れ た シ ス テ ム と し て の 制 限 値 を 超 え る こ と は で き な い 。 TCP は 実 際 に は setsockopt(2) コ ー ル が 要 求 し た バ ッ フ ァ ー サ イ ズ の 二 倍 を 割 り 当 て る 。 そ の た め 、 こ の 後 で getsockopt(2) コ ー ル を 行 う と 、 setsockopt(2) で 要 求 し た バ ッ フ ァ ー サ イ ズ と は 異 な る 値 が 返 る 。 TCP は こ の 余 分 な 空 間 を 、 管 理 目 的 や カ ー ネ ル 内 部 の 構 造 体 に 用 い て い る 。 /proc フ ァ イ ル の 値 は 、 こ れ ら を 反 映 し 、 実 際 の TCP ウ ィ ン ド ウ よ り も 大 き な 値 と な る 。 各 接 続 に お け る ソ ケ ッ ト の バ ッ フ ァ ー サ イ ズ 変 更 を 有 効 に す る に は 、 listen(2) や connect(2) コ ー ル の 前 に 設 定 し な け れ ば な ら な い 。 よ り 詳 し い 情 報 は socket(7) を 見 よ 。
TCP は 緊 急 デ ー タ (urgent data) を サ ポ ー ト し て い る 。 緊 急 デ ー タ は 何 ら か の 重 要 な メ ッ セ ー ジ が デ ー タ ス ト リ ー ム に 含 ま れ て い る こ と 、 そ の デ ー タ を で き る だ け 早 く 処 理 す べ き こ と 、 を 受 信 者 に 伝 え る た め に 用 い ら れ る 。 緊 急 デ ー タ を 送 る に は 、 send(2) に MSG_OOB オ プ シ ョ ン を 指 定 す る 。 緊 急 デ ー タ を 受 信 す る と 、 カ ー ネ ル は SIGURG シ グ ナ ル を 送 信 す る 。 送 信 先 は SIOCSPGRP や FIOSETOWN ioctl (や POSIX.1−2001 で 規 定 さ れ て い る fcntl(2) F_SETOWN 操 作 ) を 用 い て そ の ソ ケ ッ ト の 「 所 有 者 」 と し て 設 定 さ れ た プ ロ セ ス か プ ロ セ ス グ ル ー プ で あ る 。 SO_OOBINLINE ソ ケ ッ ト オ プ シ ョ ン が 有 効 に な っ て い る と 、 緊 急 デ ー タ は 通 常 の デ ー タ ス ト リ ー ム の 中 に 混 ぜ て 送 ら れ る (プ ロ グ ラ ム は 下 記 の SIOCATMARK ioctl を 使 っ て 緊 急 デ ー タ の 場 所 を 調 べ る こ と が で き る )。 無 効 に な っ て い る 場 合 に は 、 recv(2) や recvmsg(2) で MSG_OOB フ ラ グ が セ ッ ト さ れ て い る と き に の み 、 緊 急 デ ー タ を 受 信 で き る 。
Linux 2.4
で は 多 く の 変
更 が な さ れ 、
ス ル ー プ ッ ト
と ス ケ ー リ ン
グ が 向 上 し 、
機 能 も 高 ま っ
た 。 こ れ ら の
機 能 に は 、 ゼ
ロ コ ピ ー
sendfile(2)、 Explicit Congestion
Notification、 TIME_WAIT ソ ケ ッ
ト の 新 し い 管
理 法 、 keep−alive ソ
ケ ッ ト オ プ シ
ョ ン 、 Duplicate SACK 拡 張
の サ ポ ー ト な
ど が あ る 。 ア
ド レ ス の フ ォ
ー マ ッ ト
TCP は IP の 上 層 に 構
築 さ れ て い る
(ip(7) を 参 照 )。
ip(7) に 定 義 さ れ
て い る ア ド レ
ス フ ォ ー マ ッ
ト は TCP に も 適 用
さ れ る 。 TCP は
point−to−point の 通 信
だ け を サ ポ ー
ト す る 。 ブ ロ
ー ド キ ャ ス ト
や マ ル チ キ ャ
ス ト は サ ポ ー
ト し な い 。
/proc
イ ン タ ー フ ェ
ー ス シ ス テ ム
全 体 に 対 す る TCP
パ ラ メ ー タ ー
の 設 定 に は 、
/proc/sys/net/ipv4/ デ ィ レ
ク ト リ 内 の フ
ァ イ ル に よ り
ア ク セ ス で き
る 。 さ ら に 、 IP
に 関 連 す る /proc
イ ン タ ー フ ェ
ー ス の ほ と ん
ど は TCP に つ い て
も 適 用 さ れ る
。 ip(7) を 参 照 の
こ と 。 Boolean は 整
数 値 で 、 0 以 外
の 値 ("true") は 対
応 す る オ プ シ
ョ ン が 有 効 、 0
値 ("false") は 無 効
、 で あ る こ と
を 意 味 す る 。
tcp_abc (Integer; default: 0; Linux 2.6.15 以
降 )
RFC 3465 で 定 義 さ れ て い る Appropriate Byte Count (ABC) を 制 御 す る 。 ABC は 、 部 分 的 な ACK に 応 じ た 輻 輳 ウ ィ ン ド ウ (cwnd) の 増 加 を よ り 緩 や か に す る 方 法 で あ る 。 以 下 の 値 を 指 定 で き る 。
0 |
ACK を 受 信 す る 毎 に cwnd を 増 や す (ABC な し )。
フ ル サ
イ ズ の セ グ メ
ン ト の ACK を 受 信
す る 毎 に cwnd を
増 や す 。 ACK が 遅 延 ACK (delayed acknowledgment) を 相 殺 す る た め の 2 セ グ メ ン ト に 対 す る ACK の 場 合 に 、 cwnd を 2 増 や す こ と が で き る 。 tcp_abort_on_overflow
(ブ ー ル 値 ; デ フ
ォ ル ト : 無 効 ; Linux 2.4
以 降 ) 接 続 を 待
ち 受 け て い る
サ ー ビ ス が 遅
す ぎ て 、 受 信
に つ い て い け
な い 場 合 に 、
接 続 を リ セ ッ
ト で き る よ う
に す る 。 こ れ
を 用 い る と 、
バ ー ス ト に よ
っ て オ ー バ ー
フ ロ ー が 起 こ
っ た と き に 、
接 続 を 回 復 で
き る よ う に な
る 。 こ の オ プ
シ ョ ン を 用 い
る の は 、 受 信
デ ー モ ン を 高
速 化 で き な い
場 合 に 「 限 定
す る 」 こ と 。
こ の オ プ シ ョ
ン を 用 い る と
、 そ の サ ー バ
に 接 続 し て い
る ク ラ イ ア ン
ト に と っ て は
害 に な る こ と
が あ る 。 BIC TCP 輻 輳 制 御 ア ル ゴ リ ズ ム を 有 効 に す る 。 BIC−TCP は 送 信 側 の み の 変 更 で 、 ス ケ ー ラ ビ リ テ ィ と TCP 親 和 性 (friendliness) の 両 方 を 提 供 し つ つ 、 大 き な ウ ィ ン ド ウ の 下 で の 線 形 な RTT 公 平 性 を 保 証 す る も の で あ る 。 こ の プ ロ ト コ ル で は additive increase (追 加 的 な 増 加 ) と binary search increase (二 分 探 索 増 加 ) と い わ れ る 二 つ の 仕 組 み を 組 み 合 わ せ て い る 。 輻 輳 ウ ィ ン ド ウ が 大 き い と き は 、 増 分 の 大 き い additive increase に よ り 、 ス ケ ー ラ ビ リ テ ィ を 確 保 し な が ら 線 形 な RTT 公 平 性 を 保 証 す る 。 輻 輳 ウ ィ ン ド ウ が 小 さ い と き に は binary search increase に よ り TCP 親 和 性 を 達 成 し て い る 。 tcp_bic_low_window
(integer; default: 14; Linux 2.4.27/2.6.6 以 降
BIC TCP が 輻 輳 ウ ィ ン ド ウ の 調 整 を 開 始 す る 閾 値 ウ ィ ン ド ウ (パ ケ ッ ト 単 位 ) を 設 定 す る 。 こ の 閾 値 を 下 回 る 場 合 、 BIC TCP は デ フ ォ ル ト の TCP Reno と 同 じ 動 作 を す る 。 tcp_bic_fast_convergence
(ブ ー ル 値 ; デ フ
ォ ル ト : 有 効 ; Linux BIC TCP が 輻 輳 ウ ィ ン ド ウ の 変 化 に よ り 速 く 反 応 す る よ う に す る 。 同 じ コ ネ ク シ ョ ン を 共 有 す る 二 つ の フ ロ ー が 一 つ に ま と ま る の を よ り 速 く 行 う よ う に す る 。 tcp_congestion_control
(String; default: 説 明 参 照 ;
Linux 2.4.13 以 降 ) 新 規 の
接 続 で 使 用 さ
れ る デ フ ォ ル
ト の 輻 輳 制 御
ア ル ゴ リ ズ ム
を 設 定 す る 。
"reno" ア ル ゴ リ
ズ ム は 常 に 利
用 可 能 だ が 、
カ ー ネ ル 設 定
次 第 で は 別 の
選 択 肢 が 利 用
で き る こ と も
あ る 。 こ の フ
ァ イ ル の デ フ
ォ ル ト 値 は カ
ー ネ ル 設 定 の
一 つ と し て 設
定 さ れ る 。 RFC 2883 の TCP Duplicate SACK の サ ポ ー ト を 有 効 に す る 。 tcp_ecn (ブ ー ル 値 ; デ フ ォ ル ト : 無 効 ; Linux 2.4 以 降 ) RFC 2884 の Explicit Congestion Notification を 有 効 に す る 。 こ れ を 有 効 に す る と 、 間 違 っ た 振 舞 い を す る 古 い ル ー タ ー が 経 路 の 途 中 に あ る よ う な 接 続 先 に 対 し て 影 響 が 生 じ 、 場 合 に よ っ て は 接 続 が 落 ち る か も し れ な い 。 tcp_fack (ブ ー ル 値 ; デ フ ォ ル ト : 有 効 ; Linux 2.2 以 降 ) TCP Forward Acknowledgement の サ ポ ー ト を 有 効 に す る 。 tcp_fin_timeout
(integer; default: 60; Linux 2.2 以 降 )
ソ ケ ッ ト を 強
制 的 に ク ロ ー
ズ す る 前 に 、
最 後 の FIN パ ケ ッ
ト を 待 つ 時 間
を 秒 単 位 で 指
定 す る 。 こ れ
は 厳 密 に は TCP の
仕 様 を 満 た し
て い な い が 、 DoS
攻 撃 (denial of service attack) か
ら 身 を 守 る た
め に 必 要 で あ
る 。 Linux 2.2 で は デ
フ ォ ル ト 値 は 180
で あ っ た 。 F−RTO を 有 効 に す る 。 F−RTO は TCP 再 送 タ イ ム ア ウ ト (RTO) か ら の 復 旧 性 能 を 向 上 さ せ た ア ル ゴ リ ズ ム で あ る 。 こ の 機 能 は 無 線 環 境 で 特 に 効 果 を 発 揮 す る 。 無 線 環 境 で は 、 通 常 は 、 中 間 ル ー タ ー の 輻 輳 で は な く ラ ン ダ ム な 無 線 の 干 渉 に よ り パ ケ ッ ト ロ ス が 発 生 す る 。 詳 細 は RFC 4138 を 参 照 。 こ の フ ァ イ ル は 以 下 の い ず れ か の 値 を 取 る こ と が で き る 。
|