書式
#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
の通信だけをサポートする。
ブロードキャストやマルチキャストはサポートしない。
システム全体に対する
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 なし)。
- 1
- フルサイズのセグメントの
ACK を受信する毎に cwnd
を増やす。
- 2
- ACK が遅延 ACK (delayed acknowledgment)
を相殺するための 2
セグメントに 対する
ACK の場合に、 cwnd を 2
増やすことができる。
- tcp_abort_on_overflow
(ブール値; デフォルト:
無効; Linux 2.4 以降)
- 接続を待ち受けているサービスが遅すぎて、受信についていけない場合に、
接続をリセットできるようにする。
これを用いると、バーストによってオーバーフローが起こったときに、
接続を回復できるようになる。このオプションを用いるのは、
受信デーモンを高速化できない場合に「限定する」こと。
このオプションを用いると、そのサーバに接続しているクライアント
にとっては害になることがある。
- tcp_adv_win_scale
(integer; default: 2; Linux 2.4 以降)
- バッファーリングのオーバーヘッドの計算方法を、
tcp_adv_win_scale が正の場合は
bytes/2^tcp_adv_win_scale に、 tcp_adv_win_scale
が負か 0 の場合は
bytes-bytes/2^(-tcp_adv_win_scale) とする。
ソケットの受信バッファー空間はアプリケーションとカーネルで共有される。
TCP
はバッファーの一部を
TCP
ウィンドウとして管理し、
これを受信ウィンドウとして接続の他端に通知する。
空間の残りは「アプリケーション」バッファーとして用いられ、
スケジューリングやアプリケーションの遅延からネットワークを隔離する。
tcp_adv_win_scale
のデフォルト値は 2
であり、
この場合アプリケーションバッファーは全体の
1/4 になる。
- tcp_allowed_congestion_control
(String; default: see text; Linux 2.4.20 以降)
- 非特権プロセスで利用できる輻輳制御アルゴリズムの選択肢を表示/設定する
(TCP_CONGESTION
ソケットオプションの説明を参照のこと)。
このリストの要素はホワイトスペースで区切られ、改行文字で終端される。
このリストは
tcp_available_congestion_control
で表示されるリストの部分集合となる。
このリストのデフォルト値は、"reno"
と tcp_congestion_control
のデフォルト設定をあわせたものとなる。
- tcp_autocorking
(ブール値; デフォルト:
有効; Linux 3.14 以降)
- このオプションを有効にすると、
送信総パケット数を減らすため、
カーネルは小さな write
(連続する write(2) や
sendmsg(2) の呼び出し)
を可能な限り結合しようとする。
パケットの結合が行われるのは、そのフローの前のパケットが少なくとも一つは
qdisc
キューかデバイスの送信キューで送信待ちの場合である。
このオプションが有効な場合でも
TCP_CORK
オプションを使うことができ、アプリケーションがソケットの「コルク解除」(送信待ち状態の解除)
をいつどのように行えばよいか分かっている場合には、最適な動作をさせることができる。
- tcp_available_congestion_control
(String; read-only; Linux 2.4.20 以降)
- 登録されている輻輳制御アルゴリズムのリストを表示する。
このリストの要素はホワイトスペースで区切られ、改行文字で終端される。
このリストに載っているものだけが、
tcp_allowed_congestion_control
に表示される。
他の輻輳制御アルゴリズムがモジュールとして利用可能だが、
モジュールがロードされていないこともある。
- tcp_app_win
(integer; default: 31; Linux 2.4 以降)
- この変数は、TCP
ウィンドウの何バイト分を
バッファーリングのオーバーヘッド用に予約するかを指定する。
そのウィンドウの
window/2^tcp_app_win と mss
の大きいほう
(バイト単位)
がアプリケーションバッファーとして予約される。
0
を指定すると一切予約領域を取らない。
- tcp_base_mss
(Integer; default: 512; Linux 2.6.17 以降)
- パケット化レイヤの
Path MTU discovery (MTU probing) で、 search_low
の初期値と使用される値。
MTU probing
が有効な場合、この値はその接続の
MSS の初期値となる。
- tcp_bic
(ブール値; デフォルト:
無効; Linux 2.4.27/2.6.6 から 2.6.13
まで)
- 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 以降 2.6.13
まで)
- BIC TCP
が輻輳ウィンドウの調整を開始する閾値ウィンドウ
(パケット単位)
を設定する。この閾値を下回る場合、BIC
TCP はデフォルトの TCP Reno
と
同じ動作をする。
- tcp_bic_fast_convergence
(ブール値; デフォルト:
有効; Linux 2.4.27/2.6.6 以降 2.6.13
まで)
- BIC TCP
が輻輳ウィンドウの変化により速く反応するようにする。
同じコネクションを共有する二つのフローが一つにまとまるのを
より速く行うようにする。
- tcp_congestion_control
(String; default: 説明参照; Linux 2.4.13
以降)
- 新規の接続で使用されるデフォルトの輻輳制御アルゴリズムを設定する。
"reno"
アルゴリズムは常に利用可能だが、
カーネル設定次第では別の選択肢が利用できることもある。
このファイルのデフォルト値はカーネル設定の一つとして設定される。
- tcp_dma_copybreak
(integer; default: 4096; Linux 2.6.24 以降)
- システムに DMA
コピーエンジンが存在し、カーネルで
CONFIG_NET_DMA
オプションが有効になっている場合に、
DMA
コピーエンジンにオフロードされるソケットの読み込みサイズの下限値
(バイト単位)。
- tcp_dsack
(ブール値; デフォルト:
有効; Linux 2.4 以降)
- 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 であった。
- tcp_frto
(integer; default: 0; Linux 2.4.21/2.6 以降)
- F-RTO を有効にする。F-RTO
は TCP
再送タイムアウト (RTO)
からの
復旧性能を向上させたアルゴリズムである。
この機能は無線環境で特に効果を発揮する。
無線環境では、通常は、中間ルーターの輻輳ではなくランダムな無線の干渉
によりパケットロスが発生する。
詳細は RFC 4138 を参照。
このファイルは以下のいずれかの値を取ることができる。
- 0
- F-RTO を無効にする。
- 1
- 基本版の F-RTO
アルゴリズムを有効にする。
- 2
- そのフローで SACK
を使用する場合、SACK
拡張版の F-RTO
を有効にする。
基本版の F-RTO も SACK
が使用されている場合にも使用できるが、
基本版の場合には F-RTO
が SACK が有効になった TCP
フローでの
パケット数計測と、相性が悪く相互干渉が起こる場面が存在する。
- Linu 2.6.22
より前では、このパラメーターはブール値であり、
上記の 0 と 1
のみをサポートしていた。
- tcp_frto_response
(integer; default: 0; Linux 2.6.22 以降)
- F-RTO が TCP
再送タイムアウトが偽物だと検出した場合
(つまり、TCP
がもっと長い再送タイムアウトを設定していれば
タイムアウトが避けられた場合)、
次にどうするかに関して選択肢がいくつかある。
以下の値を選択できる。
- 0
- レートを元の半分にする。
滑らかで、保守的な反応を行い、RTT
1回分の時間後に
輻輳ウィンドウ (cwnd)
とスロースタートの閾値
(ssthresh)
が半分になる。
- 1
- 非常に保守的な反応。このオプションの使用は推奨されない。
反応が正しかった場合であっても、Linux
TCP の他の部分と
うまく連携できないからである。
cwnd と ssthresh
は直ちに半分にされる。
- 2
- 積極的な反応。
不要と判明した輻輳制御の測定情報を取り消す
(TCP
がもっと注意深く扱うべき再送が失われる可能性を無視する)。
。 cwnd と ssthresh
はタイムアウト前の値に戻される。
- tcp_keepalive_intvl
(integer; default: 75; Linux 2.4 以降)
- TCP keep-alive
のプローブを送る間隔
(秒単位)。
- tcp_keepalive_probes
(integer; default: 9; Linux 2.2 以降)
- TCP keep-alive
プローブの最大回数。
この回数だけ試しても接続先から反応が得られない場合は、
あきらめて接続を切断する。
- tcp_keepalive_time
(integer; default: 7200; Linux 2.2 以降)
- 接続がアイドル状態になってから、keep-alive
プローブを送信するまでの時間を秒単位で指定する。
SO_KEEPALIVE
ソケットオプションが有効になっている場合のみ
keep-alive は送信される。
デフォルト値は 7200 秒 (2
時間)。 keep-alive
が有効になっている場合、
さらにおよそ 11 分 (75
秒間隔の 9
プローブ分)
経過するとアイドル状態の接続は終了させられる。
下層にある接続追跡機構やアプリケーションでのタイムアウトは、
もっとずっと短いかもしれない。
- tcp_low_latency
(ブール値; デフォルト:
無効; Linux 2.4.21/2.6 以降)
- 有効にすると、TCP
スタックはスループットを高くするよりも
遅延を少なくすることを優先して判断を行う。
このオプションを無効にすると、スループットを高くすることが優先される。
このデフォルト値を変更した方がよいアプリケーションの例としては
Beowulf
コンピュータクラスタが挙げられるだろう。
- tcp_max_orphans
(integer; default: see below; Linux 2.4 以降)
- システムが許容する、
orphan な
(どのユーザーファイルハンドルにもアタッチされていない)
TCP
ソケットの最大数。
この数を越えると、orphan
な接続はリセットされ、警告が表示される。
この制限が存在するのは、単純な使用不能
(denial-of-service) 攻撃を
防ぐために過ぎない。この値を小さくすることは推奨しない。
ネットワークの条件によっては、この数値を大きくしないといけないかもしれないが、
orphan
なソケットひとつあたり
64K
程度のスワップ不可能なメモリーを消費することも注意せよ。
デフォルトの初期値はカーネルパラメーターの
NR_FILE と等しい。
この初期デフォルト値はシステムのメモリーに応じて調整される。
- tcp_max_syn_backlog
(integer; default: 下記参照; Linux 2.2
以降)
- 接続してきているクライアントから
ack
を受信していない状態の接続リクエストをキューに置ける最大数。
この数値を越えると、カーネルはリクエストを捨て始める。
デフォルトの値は 256
で、
システムに充分なメモリーがある
(128Mb 以上) 場合は 1024
になり、
メモリーが非常に少ない場合
(32 Mb 以下) は 128 になる。
この数値を 1024
以上に増やしたい場合は、
include/net/tcp.h の TCP_SYNQ_HSIZE を
TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog
のように修正し、
カーネルを再コンパイルすることを奨める。
- tcp_max_tw_buckets
(integer; default: 下記参照; Linux 2.4
以降)
- システムが許容する
TIME_WAIT
状態にあるソケットの最大数。
この制限が存在するのは、
単純な使用不能
(denial-of-service)
攻撃を防ぐために過ぎない。
デフォルト値は NR_FILE*2
で、システムのメモリーに応じて調整される。
この数値を越えると、そのようなソケットはクローズされ、警告が表示される。
- tcp_moderate_rcvbuf
(ブール値; デフォルト:
有効; Linux 2.4.17/2.6.7 以降)
- 有効にすると、TCP
は受信バッファーの自動調整を行う。
具体的には、 (tcp_rmem[2]
を超えない範囲で)
バッファーの大きさを自動的に変化させ、
その経路で最大のスループットを達成するのに必要な大きさに合わせようとする。
- tcp_mem (Linux
2.4 以降)
- これは 3 つの整数 [low,
pressure, high]
からなるベクトル値である。
これらは TCP
がメモリー使用量を追跡するために用いられる
(使用量はシステムのページサイズ単位で計測される)。
デフォルトはブート時に利用できるメモリーの量から計算される。
(実際には、TCP は low memory
のみを使用する。値は
32ビットシステムでは約
900
メガバイトに制限される。
64
ビットシステムではこの制限はない。)
- low
- TCP
は、グローバルにアロケートしたページがこの数値以下の場合は、
メモリーアロケーションを調整しない。
- pressure
- TCP
がアロケートしたメモリーがこの数値分のページ数を越えると、
TCP
はメモリー消費を抑えるようになる。
アロケートしたページ数が
low
以下になると、このメモリー圧迫状態から脱する。
- high
- TCP
がグローバルに割り当てるページ数の最大値。
この値はカーネルによって課されるあらゆる制限よりも優先される。
- tcp_mtu_probing
(integer; default: 0; Linux 2.6.17 以降)
- このパラメーターは、TCP
のパケット化レイヤの
Path MTU discovery を制御する。
このファイルには以下の値を設定できる。
- 0
- 無効にする。
- 1
- デフォルトでは無効だが、ICMP
ブラックホールが検出された場合は有効にする。
- 2
- 常に有効にする。 MSS
の初期値として
tcp_base_mss
が使用される。
- tcp_no_metrics_save
(ブール値; デフォルト:
無効; Linux 2.6.6 以降)
- デフォルトでは、TCP
は接続クローズ時に各種の接続パラメーターを
ルートキャッシュ (route
cache)
に保存し、近い将来に接続が確立された際に
これらの情報を初期状態として使用できるようになっている。
通常は、これにより全体として性能が向上するが、
時として性能の劣化を引き起こすこともある。
tcp_no_metrics_save
を有効にすると、TCP
は接続クローズ時に接続パラメーターをキャッシュ
しなくなる。
- tcp_orphan_retries
(integer; default: 8; Linux 2.4 以降)
- こちらからクローズした接続について、
先方をプローブする最大試行数。
- tcp_reordering
(integer; default: 3; Linux 2.4 以降)
- TCP
パケットストリームでパケット順序の逆転が発生しただけであり、
パケットロスが起こったとはみなさない、パケット数の最大値。
この値を超えてパケットの順序逆転が起こると、パケットロスが生じたと
みなし、slow start
に入る。
この数値は変更しないほうが良い。
これは、接続中のパケットの並び替えによって生じる
不必要な速度低下や再送を最小化するように設計された、
パケット並び替え (packet
reordering)
の検知メトリックなのである。
- tcp_retrans_collapse
(ブール値; デフォルト:
有効; Linux 2.2 以降)
- 再送の際にフルサイズのパケットを送ろうとする。
- tcp_retries1
(integer; default: 3; Linux 2.2 以降)
- 普通に確立されている接続上に、
TCP
がネットワーク層を巻き込まずに再送を試みる回数。
再送がこの回数を越えると、まず最初に、
新しい再送を送る前に可能ならネットワーク層に経路を更新させる。
デフォルトは RFC
が指定している最少数である
3。
- tcp_retries2
(integer; default: 15; Linux 2.2 以降)
- 確立状態の接続に、この回数
TCP
パケットの再送信を
行なってもだめな場合はあきらめる。
デフォルト値は 15
で、これは
(再送のタイムアウトに依存するが)
およそ 13〜30
分程度の期間に対応する。
RFC 1122 は最小の限界を
100
秒と置いているが、
これはたいていの場合には短すぎると思われる。
- tcp_rfc1337
(ブール値; デフォルト:
無効; Linux 2.2 以降)
- TCP の動作を RFC 1337
に準拠させる。
無効にすると、TIME_WAIT
状態のときに RST
が受信された場合、
TIME_WAIT
期間の終了を待たずにそのソケットを直ちにクローズする。
- tcp_rmem (Linux
2.4 以降)
- これは 3 つの整数 [min, default,
max]
からなるベクトル値である。
これらは TCP
が受信バッファーサイズを調整するために用いられる。
TCP
は、システムで利用できるメモリーに応じて、
受信バッファーのサイズをこれらの変数の範囲で
以下に示すデフォルトから動的に調整する。
- min
- 各 TCP
ソケットが用いる受信バッファーの最小サイズ。
デフォルト値はシステムのページサイズである
(Linux 2.4
では、デフォルト値は
4K バイトで、
メモリーの少ないシステムでは
PAGE_SIZE
バイトに減らされる)。
この値は、メモリー圧迫モードにおいても、
このサイズの割り当てが成功することを保証するために用いられる。
これは、 SO_RCVBUF
を用いてソケットの最低受信バッファーサイズを宣言する際には用いられない。
- default
- TCP
ソケットの受信バッファーのデフォルトサイズ。
この値は、すべてのプロトコルに対して定義されている、
ジェネリックなグローバルのデフォルトバッファーサイズ
net.core.rmem_default
より優先される。
デフォルト値は 87380
バイトである (Linux 2.4
では、メモリーの少ないシステムの場合
43689 まで減らされる)。
大きな受信バッファーサイズが必要な場合は、
この値を増やすべきである
(すべてのソケットに影響する)。
大きな TCP
ウィンドウを用いるには、
net.ipv4.tcp_window_scaling
を有効にしておかなければならない
(デフォルトは有効)。
- max
- 各 TCP
ソケットで用いる受信バッファーの最大サイズ。
この値よりもグローバルの
net.core.rmem_max
が優先される。
これは、 SO_RCVBUF
を用いてソケットの受信バッファーサイズ制限を宣言する際には用いられない。
デフォルト値は以下の式で計算される。
max(87380, min(4MB, tcp_mem[1]*PAGE_SIZE/128))
(Linux 2.4
では、デフォルト値は
87380*2 バイトで、
メモリーの少ないシステムでは
87380
まで減らされる。)
- tcp_sack
(ブール値; デフォルト:
有効; Linux 2.2 以降)
- RFC 2018 の TCP Selective Acknowledgements
を有効にする。
- tcp_slow_start_after_idle
(ブール値; デフォルト:
有効; Linux 2.6.18 以降)
- 有効にすると、RFC 2861
の動作が行われ、
アイドル時間経過後に輻輳ウィンドウをタイムアウトさせる。
アイドル時間は現在の
RTO (再送タイムアウト)
で定義される。
無効にすると、輻輳ウィンドウはアイドル時間経過後もタイムアウトされない。
- tcp_stdurg
(ブール値; デフォルト:
無効; Linux 2.2 以降)
- このオプションを有効にすると、
TCP 緊急ポインター
(urgent-pointer) フィールドを
RFC 1122
に従った解釈を行う。
この解釈に従うと、緊急ポインターは緊急データの最後のバイトを指す。
このオプションを無効にすると、緊急ポインターの解釈が
BSD 互換の方法で
行われる:
緊急ポインターは緊急データの後の最初のバイトを指す。
このオプションを有効にすると、相互運用性に問題が生じるかもしれない。
- tcp_syn_retries
(integer; default: 5; Linux 2.2 以降)
- アクティブな TCP
接続に初期 SYN
の再送を試みる最大回数。
この数値は 255
よりも大きくすべきではない。
デフォルトの値は 5
で、およそ 180
秒に対応する。
- tcp_synack_retries
(integer; default: 5; Linux 2.2 以降)
- passive な TCP 接続の SYN/ACK
セグメントで再送を試みる最大数。
この数値は 255
よりも大きくすべきではない。
- tcp_syncookies
(Boolean; Linux 2.2 以降)
- TCP syncookies
を有効にする。カーネルは
CONFIG_SYNCOOKIES
をつけてコンパイルしておかなければならない。
ソケットのバックログキューがオーバーフローすると、
syncookies が送信される。
syncookies 機能は、SYN flood
攻撃からソケットを守ろうとする。
これはいずれにしても、最終手段として用いるべきである。
これは TCP
プロトコルに違反しており、
TCP 拡張のような、TCP
の他の部分と衝突してしまう。
クライアントやリレーで問題が起こることもある。
過負荷や設定間違いによって負荷の大きな状態にあるサーバを調整して救うための
機構とみなすべきではない。
そのような用途には、代わりに
tcp_max_syn_backlog, tcp_synack_retries,
tcp_abort_on_overflow
などの使用を考えること。
- tcp_timestamps
(ブール値; デフォルト:
有効; Linux 2.2 以降)
- RFC 1323 の TCP timestamps
を有効にする。
- tcp_tso_win_divisor
(integer; default: 3; Linux 2.6.9 以降)
- このパラメーターは、一つの
TCP Segmentation Offload (TSO) フレームで
消費できる輻輳ウィンドウの割合
(パーセント)
を制御する。
バースト性と、どれだけ大きな
TSO
フレームを構築するかのはトレードオフであり、
このパラメーターはその度合いを設定する。
- tcp_tw_recycle
(ブール値; デフォルト:
無効; Linux 2.4 以降)
- TIME_WAIT
ソケットの素早い再利用
(fast recycling) を有効にする。
通常のインターネットと通信したり
NAT
(ネットワークアドレス変換)
を使うデバイスでは、
このオプションを有効にするのは推奨されない。
いくつかの NAT
ゲートウェイでは IP
タイムスタンプをそのまま通過させるので、
一つの IP
が増加しないタイムスタンプを持つように見える。
RFC 1323 (PAWS), RFC 6191 を参照。
- tcp_tw_reuse
(ブール値; デフォルト:
無効; Linux 2.4.19/2.6 以降)
- プロトコルの面から見て問題ない場合に新規コネクションに
TIME_WAIT
状態のソケットを再利用することを許可する。技術的に詳しい人の助言や
要請なしにこのオプションを変更すべきではない。
- tcp_vegas_cong_avoid
(ブール値; デフォルト:
無効; Linux 2.2 から 2.6.13
まで)
- TCP Vegas
輻輳制御アルゴリズムを有効にする。
TCP Vegas
は帯域を推測することで輻輳の起こり始めを予想するように
TCP
の送信側のみに変更を加えたものである。
TCP Vegas
は輻輳ウィンドウを修正することで、送信レートを調整する。
TCP Vegas は TCP Reno
と比べてパケットロスは少ないが、
TCP Reno
ほど積極的な挙動はしない。
- tcp_westwood
(ブール値; デフォルト:
無効; Linux 2.4.26/2.6.3 から 2.6.13
まで)
- TCP Westwood+
輻輳制御アルゴリズムを有効にする。
TCP Westwood+ は TCP
輻輳制御の性能を最適化するように
TCP Reno の
プロトコルスタックの送信側のみに修正を加えたものである。
輻輳が起こった後で、輻輳ウィンドウや
slow start の閾値を
通信両端間の帯域の推測に基づいて設定する。
この推測を使って、TCP
Westwood+
は輻輳が発生した時に使っていた
帯域を考慮に入れた
slow start
の閾値と輻輳ウィンドウを設定する。
TCP Westwood+
は、有線ネットワークにおける
TCP Reno の公平性 (fairness)
と、無線リンクでのスループットを大きく向上する。
- tcp_window_scaling
(ブール値; デフォルト:
有効; Linux 2.2 以降)
- RFC 1323 の TCP
ウィンドウスケーリングを有効にする。
この機能を用いると、接続先が対応していれば、
TCP 接続で大きな (64K
以上の)
ウィンドウが使えるようになる。
通常は TCP
ヘッダーのウインドウ長フィールドは
16 ビットなので、
ウィンドウサイズは
64K
バイト以下に限られる。
もっと大きなウィンドウを使いたい場合は、
アプリケーションはソケットバッファーのサイズを増やして、
ウィンドウスケーリングのオプションを利用すればよい。
tcp_window_scaling
を無効にしていると、
TCP
は他端との接続設定の際に、
ウィンドウスケーリングのネゴシエーションを行なわない。
- tcp_wmem (Linux
2.4 以降)
- これは 3 つの整数 [min, default,
max]
からなるベクトル値である。
これらは TCP
が送信バッファーサイズを調整するために用いられる。
TCP
は、システムで利用できるメモリーに応じて、送信バッファーのサイズを
これらの変数の範囲で以下に示すデフォルトから動的に調整する。
- min
- 各 TCP
ソケットが用いる送信バッファーの最小サイズ。
デフォルト値はシステムのページサイズである
(Linux 2.4
では、デフォルト値は
4K である)。
この値は、メモリー圧迫モードにおいても、
このサイズ以下の割り当てが成功することを保証するために用いられる。
これは、 SO_SNDBUF
を用いてソケットの最低送信バッファーサイズを宣言する際には用いられない。
- default
- TCP
ソケットの送信バッファーのデフォルトサイズ。
この値は、すべてのプロトコルに対して定義されている、
ジェネリックなグローバルのデフォルトバッファーサイズ
/proc/sys/net/core/wmem_default
より優先される。
デフォルト値は 16K
バイトである。
大きな送信バッファーサイズが必要な場合は、
この値を増やすべきである
(すべてのソケットに影響する)。
大きな TCP
ウィンドウを用いるには、
/proc/sys/net/ipv4/tcp_window_scaling を 0
以外の値
(デフォルト値)
にしておかなければならない。
- max
- 各 TCP
ソケットで用いる送信バッファーの最大サイズ。
この値よりも
/proc/sys/net/core/wmem_max
が優先される。
これは SO_SNDBUF
を用いてソケットの送信バッファーサイズ制限を宣言する際には用いられない。
デフォルト値は以下の式で計算される。
max(65536, min(4MB, tcp_mem[1]*PAGE_SIZE/128))
(Linux 2.4
では、デフォルト値は
128K バイトで、
メモリーの少ないシステムでは
64K
にまで減らされる。)
- tcp_workaround_signed_windows
(ブール値; デフォルト:
無効; Linux 2.6.26 以降)
- 有効にすると、ウィンドウスケーリングオプションを受信しないのは、
接続相手の TCP
が壊れていると考え、ウィンドウを符号付きの量とみなす。
無効にすると、接続相手からウィンドウスケーリングオプションを受信しなかった
場合であっても、接続相手の
TCP
が壊れているとはみなさない。
ソケットオプション
TCP
ソケットのオプションは、
オプションレベル引数に
IPPROTO_TCP を指定した
setsockopt(2) で設定でき、
getsockopt(2)
で取得できる。
注釈がない限り、
optval は int
へのポインターである。
さらに、ほとんどの
IPPROTO_IP
ソケットオプションも
TCP
ソケットに対して有効である。詳細は
ip(7) を見よ。
- TCP_CONGESTION
(Linux 2.6.13 以降)
- このオプションの引き数は文字列である。
このオプションを使うと、呼び出し元がソケット単位に使用する
TCP
輻輳制御アルゴリズムを設定することができる。
非特権プロセスが使用できるアルゴリズムは
(上述の) tcp_allowed_congestion_control
で設定されたものだけに制限される。
特権プロセス (CAP_NET_ADMIN)
は任意の輻輳制御アルゴリズムを選択することができる
(上記の tcp_available_congestion_control
の説明を参照)。
- TCP_CORK (Linux
2.2 以降)
- セットされると、 partial
フレームを送信しない。
このオプションが解除されると、
キューイングされた
partial
フレームが送られる。これは
sendfile(2)
を呼ぶ前にヘッダーを前置したり、
スループットを最適化したい場合に便利である。
現在の実装では、
TCP_CORK
で出力を抑えることができる時間の上限は
200 ミリ秒である。
この上限に達すると、キューイングされたデータは自動的に送信される。
Linux 2.5.71
以降においてのみ、このオプションを
TCP_NODELAY
と同時に用いることができる。
移植性の必要なプログラムではこのオプションを用いるべきではない。
- TCP_DEFER_ACCEPT
(Linux 2.4 以降)
- これを用いると、リスナはデータがソケットに到着した時のみ目覚めるようになる。
整数値 (秒) をとり、 TCP
が接続を完了しようと試みる回数を制限できる。
移植性の必要なプログラムではこのオプションを用いるべきではない。
- TCP_INFO (Linux
2.4 以降)
- このソケットの情報を収集するのに用いる。
カーネルは /usr/include/linux/tcp.h
ファイルで定義されている
struct tcp_info を返す。
移植性の必要なプログラムではこのオプションを用いるべきではない。
- TCP_KEEPCNT
(Linux 2.4 以降)
- 接続を落とす前に TCP
が試みる keepalive
プローブの最大回数。
移植性の必要なプログラムではこのオプションを用いるべきではない。
- TCP_KEEPIDLE
(Linux 2.4 以降)
- この時間 (秒単位)
を越えて接続がアイドル状態に留まっていると、
このソケットに
SO_KEEPALIVE
ソケットオプションが設定されている場合、
TCP は keepalive
プローブを送りはじめる。
移植性の必要なプログラムではこのオプションを用いるべきではない。
- TCP_KEEPINTVL
(Linux 2.4 以降)
- 各 keepalive
プローブの間隔
(秒単位)。
移植性の必要なプログラムではこのオプションを用いるべきではない。
- TCP_LINGER2
(Linux 2.4 以降)
- orphan された FIN_WAIT2
状態のソケットの寿命。
このオプションを用いると、システム全体に適用されるファイル
/proc/sys/net/ipv4/tcp_fin_timeout
の値を、このソケットに対してのみ変更できる。
socket(7)
レベルのオプション
SO_LINGER
と混同しないこと。
移植性の必要なプログラムではこのオプションを用いるべきではない。
- TCP_MAXSEG
- 送出 TCP
パケットの最大セグメントサイズ。
Linux 2.2 以前と Linux 2.6.28
以降では、このオプションを接続確立の前に設定すると、初期パケット
で他端にアナウンスする
MSS
の値も変化する。インターフェースの
MTU より も大きな
(あるいは大きくなってしまった)
値は効果を持たない。
また TCP
は、この値よりも最小・最大の制限の方を優先する。
- TCP_NODELAY
- 設定すると Nagle
アルゴリズムを無効にする。
すなわち、データ量が少ない場合でも
各セグメントは可能な限り早く送信される。
設定されていないと、
送信する分だけ溜まるまでデータはバッファーされ、
小さなパケットを頻繁に送らずにすみ、
ネットワークを有効に利用できる。
このオプションは
TCP_CORK
により上書きされる。しかしながら、
TCP_CORK
が設定されている場合であっても、このオプションを設定すると、
送信待ちの出力を明示的に掃き出す
(flush) ことになる。
- TCP_QUICKACK
(Linux 2.4.4 以降)
- 設定されていると quickack
モードを有効にし、クリアされると無効にする。
通常の TCP 動作では ack
は必要に応じて遅延されるのに対し、
quickack モードでは ack
はすぐに送信される。
このフラグは永続的なものではなく、
quickack
モードから/モードへ切り替えるためのものである。
これ以降の TCP
プロトコルの動作によっては、
内部のプロトコル処理や、遅延
ack
タイムアウトの発生、
データ転送などの要因によって、
再び quickack
から出たり入ったりする。
移植性の必要なプログラムではこのオプションを用いるべきではない。
- TCP_SYNCNT
(Linux 2.4 以降)
- 接続の試行を中止させる前に
TCP が送る SYN
再送数を設定する。
これは 255
より大きくはできない。
移植性の必要なプログラムではこのオプションを用いるべきではない。
- TCP_USER_TIMEOUT
(Linux 2.6.37 以降)
- このオプションは
unsigned int
型の引き数を取る。
値が 0
より大きい場合、その値は、
どのくらいの時間、送信されたデータが
ACK
を受信しないままの状態が続くと、
TCP
がその接続を強制的にクローズし、アプリケーションに
ETIMEDOUT を返すかを、
ミリ秒単位で指定する。
オプションの値が 0
の場合、TCP
はシステムのデフォルト値を使用する。
ユーザータイムアウトを長くすると、
通信の両端での接続性がない場合でも長い時間
TCP
接続が維持されるようになる。
ユーザータイムアウトを短くすると、
アプリケーションは必要であれば「早く失敗」できるようになる。
設定しなかった場合は、
通常の WAN
環境では現在のシステムのデフォルトの
20
分で失敗することになる。
このオプションは
TCP
接続がどの状態の場合でも設定することができるが、
接続が同期状態 (ESTABLISHED,
FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK)
の場合のみ効果がある。
また、 TCP keepalive (SO_KEEPALIVE)
オプションとともに使用された場合、
TCP_USER_TIMEOUT は keepalive
失敗による接続クローズを判定するための
keepalive
値を上書きする。
このオプションは
TCP
がパケットを再送する際や
keepalive
プローブを送信する際には影響を及ぼさない。
他の多くのオプション同様、リッスン中のソケットでこのオプションがセットされていれば
accept(2)
が返すソケットにオプションが継承される。
ユーザータイムアウト機能の詳細は
RFC 793 と RFC 5482 ("TCP User Timeout
Option")
に書かれている。
- TCP_WINDOW_CLAMP
(Linux 2.4 以降)
- 広報するウィンドウのサイズをこの値に固定する。
カーネルによって最小サイズは
SOCK_MIN_RCVBUF/2
に制限されている。
このオプションは移植性の必要なコードでは用いるべきでない。
ソケット API
TCP は帯域外データ
(out-of-band data)
を限定的にサポートしており、
(1 バイトの)
緊急データという形である。
つまり Linux
においては、
接続先が
(新しいやり方の)
帯域外データを送ってきた場合、
(古いやり方の)
緊急データは通常のデータとしてストリームに挿入されることになる
(これは SO_OOBINLINE
がセットされている場合でも同様である)。
これは BSD
ベースのスタックとは異なる。
Linux
は、デフォルトでは
urgent
ポインターフィールドの解釈に
BSD
互換の方法を用いる。これは
RFC 1122
に反しているが、
他のスタックと同時に動作させるにはやむを得ない。これは
/proc/sys/net/ipv4/tcp_stdurg
によって変更できる。
recv(2) の MSG_PEEK
フラグを使うと、帯域外データを覗き見することができる。
Linux 2.4 以降では、 recv(2)
(や recvmsg(2)) の flags
引き数に MSG_TRUNC
を使うことができる。
このフラグを指定すると、受信データは、呼び出し元から渡されたバッファー
にコピーされて返されるのではなく、廃棄されるようになる。
Linux 2.4.4 以降では、 MSG_TRUNC
を、帯域外データを受信するための
MSG_OOB
と組み合わせて使った場合にも、これと同じ効果を持つようになっている。
以下の ioctl(2)
呼び出しは value
に情報を入れて返す。
正しい書式は以下の通り。
int value;
error = ioctl(tcp_socket, ioctl_type, &value);
ioctl_type
は以下のいずれか一つである:
- SIOCINQ
- 受信バッファーのキューにある、まだ読んでいないデータの量を返す。ソケットは
LISTEN
状態にあってはならず、さもないとエラー
(EINVAL) が返る。 SIOCINQ は
<linux/sockios.h>
で定義されている。
代わりに、<sys/ioctl.h>
で定義されている、同義語の
FIONREAD
を使うこともできる。
- SIOCATMARK
- 受信データストリームが緊急マークの位置であれば、真を返す
(つまり value が 0
以外)。
SO_OOBINLINE
ソケットオプションが設定されていて、
SIOCATMARK
が真を返した場合、次のソケットからの読み込みでは緊急データが
返される。 SO_OOBINLINE
ソケットオプションが設定されておらず、
SIOCATMARK
が真を返した場合、次のソケットからの読み込みでは緊急データに
続くデータが返される
(実際に緊急データを読み込むには
recv(MSG_OOB)
とフラグをつける必要がある)。
データの一回の読み込みでは緊急マークを跨がっての読み込みは行われない。
アプリケーションが緊急データの存在を
(exceptfds
引き数を使って)
select(2) 経由または SIGURG
シグナルの配送を通じて知らされた場合、
SIOCATMARK
のチェックと読み込み
(何バイト読み込み要求をしてもよい)
を SIOCATMARK
が偽を返さなくなるまで繰り返し行うことで、緊急マークの位置まで
読み進めることができる。
- SIOCOUTQ
- ソケットの送信キューに残っている未送信データの量を返す。ソケットは
LISTEN 状
態にあってはならない。
LISTEN
状態の場合にはエラー
(EINVAL) となる。 SIOCOUTQ は
<linux/sockios.h>
で定義されている。
代わりに、<sys/ioctl.h>
で定義されている、同義語の
TIOCOUTQ を
使うこともできる。
エラー処理
ネットワークエラーが起こると、
TCP
はパケットの再送を試みる。
何回かやっても成功しなければ、この接続に対して
ETIMEOUT
エラーか最後に受信したエラーが返される。
アプリケーションによっては、もっと早くエラーを知らせてほしい場合がある。
これには IPPROTO_IP
レベルの IP_RECVERR
ソケットオプションを用いると良い。このオプションが有効になっていると、
到着したエラーはすべてただちにユーザープログラムに渡される。
このオプションは慎重に用いること
—
ルーティングの変更など、
通常ありうるネットワーク状態に対して
TCP
をより脆弱にしてしまう。
エラー
- EAFNOTSUPPORT
- sin_family
に渡されたソケットアドレスのタイプが
AF_INET
ではなかった。
- EPIPE
- 接続先が予期しなかったかたちでソケットをクローズした。
またはシャットダウンされたソケットに読み込みが実行された。
- ETIMEDOUT
- 接続先が、何回かデータを再送しても反応しない。
ip(7)
で定義されているエラーや、ジェネリックなソケット層におけるエラーも
TCP
に返されることがある。
バージョン
Explicit Congestion Notification、zero-copy の
sendfile(2)、
並び替えのサポート、SACK
拡張 (DSACK)
などのサポートは 2.4
で導入された。
フォワード確認
(FACK)、TIME_WAIT
リサイクル、接続ごとの
keepalive
に対するソケットオプションは
2.3 で導入された。
バグ
まだ説明されていないエラーがある。
IPv6
に関する記述がない。
関連項目
accept(2), bind(2), connect(2),
getsockopt(2), listen(2), recvmsg(2),
sendfile(2), sendmsg(2), socket(2), ip(7),
socket(7)
RFC 793: TCP の仕様。
RFC 1122: TCP の要求事項と Nagle
アルゴリズムの記述。
RFC 1323: TCP
のタイムスタンプ・ウィンドウスケーリング各オプション。
RFC 1337: TIME_WAIT assassination hazard
に関する説明。
RFC 3168: Explicit Congestion Notification
に関する説明。
RFC 2581: TCP
輻輳制御アルゴリズム。
RFC 2018 と RFC 2883: SACK
とその拡張。
この文書について
この man ページは Linux
man-pages
プロジェクトのリリース
3.79 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。