EN JA
TCP(4)
TCP(4) FreeBSD Kernel Interfaces Manual TCP(4)

名称

tcpインターネット送信制御 (トランスミッションコントロール) プロトコル

書式

#include < sys/types.h>
#include < sys/socket.h>
#include < netinet/in.h>

int
socket( AF_INET, SOCK_STREAM, 0);

解説

TCP プロトコルは、信頼性があり、フロー制御された、双方向のデータ送信を提供します。それは、 SOCK_STREAM 抽象化をサポートするために使用されるバイトストリーム型プロトコルです。 TCP は、標準のインターネットアドレス形式を使用し、さらに、ホストごとの“ポートアドレス”の集まりを提供します。したがって、各アドレスは、ピア (相手) エンティティを識別するホストで特定の TCP ポートを備えた、ホストとネットワークを指定するインターネットアドレスで構成されています。

TCP プロトコルを利用するソケットは、“アクティブ” (能動) か“パッシブ” (受動) のいずれかです。アクティブ (能動) のソケットは、パッシブ (受動) のソケットに接続を開始します。デフォルトでは、 TCP ソケットは、アクティブで作成されます。パッシブのソケットを作成するためには、 bind(2) システムコールでソケットをバインドした後に、 listen(2) システムコールを使用しなければなりません。パッシブのソケットだけが着信接続を受け付けるために accept(2) 呼び出しを使用できます。クティブのソケットだけが接続を開始するために connect(2) 呼び出しを使用できます。

パッシブのソケットは、複数のネットワークからの着信接続要求に合わせるために、それらの位置を“あいまいに指定”することができます。この技術は、“ワイルドカードアドレシング”と呼ばれ、単一のサーバが複数のネットワークでクライアントに対するサービスを提供できます。すべてのネットワークで listen する (接続を受け付ける) ソケットを作成するためには、インターネットアドレス INADDR_ANY がバインドされていなければなりません。 TCP ポートは、この時点でも指定できます。ポートが指定されていないと、システムがポートを割り当てます。接続がいったん確立されると、ソケットのアドレスは、ピア (相手側) エンティティの位置によって固定されます。ソケットが割り当てられたアドレスは、パケットが送受信されているネットワークインタフェースに関連しているアドレスです。通常、このアドレスは、ピア (相手側) エンティティのネットワークに一致しています。

TCP は、 setsockopt(2) で設定して getsockopt(2) でテストすることができる多くのソケットオプションをサポートしています:

TCP_INFO
ソケットの基本的な TCP セッションに関する情報は、読み込み専用オプション TCP_INFOgetsockopt(2) に渡すことによって、検索されます。それは、単一の引数を受け付けます: struct tcp_info のインスタンスへのポインタです。

この API は、変更される可能性があります。このオプションによって、どのフィールドが現在書き込まれるかを決定するために、ソースを調べます。 FreeBSD 特有の追加は、ウィンドウサイズの送信、ウィンドウサイズの受信と帯域幅で制御されたウィンドウサイズを含みます。

TCP_CONGESTION
TCP が接続するために使用する輻輳制御アルゴリズムを選択するか、または問い合わせます。詳細については、 mod_cc(4) を参照してください。
TCP_KEEPINIT
この書き込み専用の setsockopt(2) オプションは、新しく確立されなかった TCP 接続のために、秒単位の u_int のソケットごとのタイムアウト引数を受け付けます。ミリ秒単位のグローバルなデフォルトについては、さらに後ろの、 「MIB の変数」 のセクションの keepinit を参照してくさい。
TCP_KEEPIDLE
この書き込み専用の setsockopt(2) オプションは、(有効にされていれば) keepalive プローブがこのソケットの接続のために送信さられる前に、接続がアイドルでなければならない、秒単位の、時間の量のための u_int の引数を受け付けます。 listen している (接続を受け付けている) ソケットで設定されているなら、値は、 accept(2) 上の新しく作成されたソケットによって継承されます。ミリ秒単位のグローバルなデフォルトについては、さらに後ろの、 「MIB の変数」 のセクションの keepinit を参照してくさい。
TCP_KEEPINTVL
この書き込み専用の setsockopt(2) オプションは、ピア (相手側) に送信された keepalive プローブの間で、秒単位のソケットごとの間隔を設定するために u_int の引数を受け付けます。 listen している (接続を受け付けている) ソケットで設定されているなら、値は、 accept(2) 上の新しく作成されたソケットによって継承されます。ミリ秒単位のグローバルなデフォルトについては、さらに後ろの、 「MIB の変数」 のセクションの keepintvl を参照してくさい。
TCP_KEEPCNT
この書き込み専用の setsockopt(2) オプションは、 u_int の引数を受け付け、接続が落される前に、応答なしで、送信されたプローブの数のソケットごとの調整を許可します。 listen している (接続を受け付けている) ソケットで設定されているなら、値は、 accept(2) 上の新しく作成されたソケットによって継承されます。グローバルなデフォルトについては、さらに後ろの、 「MIB の変数」 のセクションの keepcnt を参照してくさい。
TCP_NODELAY
たいていの状況の下で、 TCP は、データが存在するとき、それを送信します。未解決のデータがまだ肯定応答されていないとき、肯定応答がいったん受信されると、単一のパケットで送信するために少量の出力データを集めます。応答を受け取らないマウスイベントのストリームを送信するウィンドウシステムのような少数のクライアントに関しては、このパケット化は、深刻な遅延を引き起こすかもしれません。ブール (論理演算子) オプション TCP_NODELAY は、このアルゴリズムを無効にします。
TCP_MAXSEG
デフォルトでは、送信側-TCP と受信側-TCP は、各接続に使用される最大のセグメントサイズを決定するためにそれら自体の間でネゴシエート (交渉) します。 TCP_MAXSEG オプションで、ユーザは、このネゴシエーション (交渉) の結果を決定し、必要ならそれを減少することができます。
TCP_NOOPT
通常、 TCP は、この実装で提供される様々な TCP 拡張に従って、各パケットでいくつかのオプションを送信します。ブール (論理演算子) オプション TCP_NOOPT は、接続ベースごとに使用される TCP オプションを無効にするために提供されています。
TCP_NOPUSH
慣例により、送信側-TCP は、“push” (プッシュ) ビットを設定して、あらゆるユーザの write(2)writev(2) の呼び出しの終わりで、(許されるなら) 直ちに送信を始めます。このオプションが 0 以外の値に設定されるとき、 TCP は、ソケットがクローズされるか、または内部の送信バッファが満たされるまであらゆるデータの送信を遅らせます。
TCP_MD5SIG
このオプションは、指定されたソケットへの書き込み時に (別名 TCP-MD5 として知られている) MD5 ダイジェストの使用を可能にします。発信トラフィックが、ダイジェスト (要約) されます。着信トラフィックに関するダイジェスト (要約) は、 net.inet.tcp.signature_verify_input sysctl が 0 以外であるなら、検証されます。システムのための現在のデフォルトの振る舞いは、 TCP-MD5 でこのオプションをシステムアドバタイジング (通知) に応答することです。これは、変更するかもしれません。

FreeBSD ルータ展開におけるこの一般的の使用は、基本となるルータをピアとなるポイントで Cisco 機器で相互に作用できるようにすることです。この機能のサポートは、RFC 2385 に適合しています。 IPv4 ( AF_INET) セッションだけがサポートされています。

このオプションを正しく機能するためには、管理者が setkey(8) ユーティリティを使用して tcp-md5 キーエントリをシステムのセキュリティ関連データベース (SADB) に追加するのことが必要です。このエントリは、0x1000 の SPI を持たなければならなくて、そのため、この時点でホストベースごとに指定することだけができます。

宛先 (終点) が SADB エントリに見つけることができないなら、発信トラフィックは、無効のダイジェストオプションを先頭に追加し、次のエラーメッセージがシステムコンソールに現れます: tcp_signature_compute: SADB lookup failed for %d.%d.%d.%d

setsockopt(2) 呼び出しのためのオプションレベルは、 getprotobyname(3) または IPPROTO_TCP から入手できる TCP のプロトコル番号です。すべてのオプションは、 < netinet/tcp.h> で宣言されています。

IP 転送レベルにおけるオプションは、 TCP で使用できます。 ip(4) を参照してください。指定経路制御 (ソースルート) された着信接続要求は、注意すべきです、そして、逆向きの始点経路は、応答で使用されます。

TCP のためのデフォルトの輻輳制御アルゴリズムは、 cc_newreno(4) です。 mod_cc(4) フレームワークを使用して他の輻輳制御アルゴリズムを利用可能にすることができます。

MIB の変数

TCP プロトコルは、 sysctl(3) MIB の net.inet.tcp ブランチでいくつかの変数を実装しています。
TCPCTL_DO_RFC1323
( rfc1323) RFC 1323 のウィンドウのスケーリングとタイムスタンプのオプションを実装します (デフォルトは、真です)。
TCPCTL_MSSDFLT
( mssdflt) MSS ネゴシエーション (交渉) で反対の通知を受信しないとき、デフォルト値は、最大のセグメントサイズ (“MSS”) を使用します。
TCPCTL_SENDSPACE
( sendspace) 最大の TCP 送信ウィンドウ。
TCPCTL_RECVSPACE
( recvspace) 最大の TCP 受信ウィンドウ。
log_in_vain
接続を受け付けるソケットがないポートに試みられるあらゆる接続のログを登録します。 1 の値は、ログの登録を SYN (接続の確立) パケットだけに制限します。 2 の値は、クローズされたポートへのあらゆる TCP パケットをログに登録します。上記に記載されないどんな値もログの登録を無効にします (デフォルトは、0、すなわち、ログの登録は、無効にされます)。
msl
パケットのための、ミリ秒単位の、最大セグメント生存期間。
keepinit
確立されない TCP 接続の、ミリ秒単位の、新しいタイムアウト。デフォルトは、75000 ミリ秒です。
keepidle
接続がキープアライブ (生き続ける) プローブが (可能ならば) 送信される前にアイドルとなるべき時間の合計。デフォルトは、7200000 ミリ秒 (2 時間) です。
keepintvl
keepidle プローブで応答が受信されないとき、キープアライブ (生き続ける) プローブがリモートマシンに送信されるミリ秒単位のインターバル。デフォルトは、75000 ミリ秒です。
keepcnt
接続が落される前に、応答なしで、送信されたプローブの数。デフォルトは、8 パケットです。
always_keepalive
SO_KEEPALIVE がすべての TCP 接続で設定され、カーネルは、接続がまだあるか確かめるためにリモートホストへパケットを定期的に送信すると仮定します。
icmp_may_rst
特定の ICMP 到達不能メッセージは、 SYN-SENT 状態で接続をアボートできます。
do_tcpdrain
システムの mbuf が少ないなら、 TCP 再構築キューでパケットをフラッシュします。
blackhole
接続を受け付けるソケットがないポートに接続を試みるとき、可能であれば、RST の送信を無効にします。 blackhole(4) を参照してください。
delayed_ack
試みるために ACK を遅らせ、データパケットにそれをピギーバック (積んで輸送) します。
delacktime
遅延の ACK が送信される前の、ミリ秒単位の、最大の合計時間。
path_mtu_discovery
パス MTU 発見を有効にします。
tcbhashsize
TCP 制御ブロックハッシュテーブル (読み込み専用) のサイズ。これは、カーネルオプション TCBHASHSIZE を使用するか loader(8)net.inet.tcp.tcbhashsize を設定することによって調整できます。
pcbcount
アクティブなプロセス制御ブロックの数 (読み込み専用)。
syncookies
SYN クッキーが外向きの SYN-ACK パケットのために生成されるかどうかを決定します。 SYN クッキーは、 SYN ラッド (大量送り付け) 攻撃の間にとても役に立ち、デフォルトで有効にされます。 ( syncookies(4) 参照)。
isn_reseed_interval
秘密データが RFC 1948 の初期シーケンス番号計算でどれくらいの頻度で使用したかを指定する間隔 (秒単位) は、再シード (種) されるべきです。デフォルトで、この変数は、再シードが起こらないことを示す 0 に設定されます。再シードは、必要ではなく、数分間 TIME_WAIT リサイクリングをブレークします。
rexmit_min, rexmit_slop
TCP のために再送信タイマ計算を調整します。スロップ (slop) は、最小が絶対最小を指定している間、 SRTT (ラウンドトリップ時間を平滑化 (smoothed round trip time)) が適応することができない、時々の変化を考慮に入れるために生の計算に通常加えられます。多くの TCP RFC が最小の 1 秒を提案している一方、これらの RFC は、ストリーミングの振る舞いに焦点を合わせる傾向があり、それらのケースは、速い再送信コードによってカバーされなかった大変速いが損失の多い接続である、802.11b 無線リンクのように、最小の 1 秒が損失の多いインタラクティブ接続上の深刻で有害な影響があるという事実に対処できません。この理由で、我々は、スロップ (slop) の 200ms と (Linux と同様の) 200ms の有効な最小を我々に与える、near-0 最小を使用します。
rfc3042
RFC 3042 で説明される Limited Transmit アルゴリズムを有効にします。それは、損失の多いリンクで、そして短い転送のときに起こるような輻輳 (混雑) ウィンドウが小さいとき、タイムアウトを避けるのに役立ちます。
rfc3390
最大のセグメントサイズによって、新しい接続のときに可変サイズの開始輻輳 (混雑) ウィンドウを認める、 RFC 3390 のサポートを有効にします。これは、一般的にスループット (処理能力) に役立ちますが、特に短い転送と高帯域の大きい伝播遅延接続に影響します。
sack.enable
受信側がすべての成功して到着したセグメントに関して送付側に通知するのを許し、送付側が欠落したセグメントだけを再送するのを許す、 TCP Selective Acknowledgment オプションである、 RFC 2018 のサポートを有効にします。
sack.maxholes
接続毎の SACK ホールの最大数。デフォルトは、128 です。
sack.globalmaxholes
すべての接続に渡るシステム毎の SACK ホールの最大数。デフォルトは、65536 です。
maxtcptw
TCP 接続が TIME_WAIT 状態に入るとき、わずかなサイズと使用であるので、関連ソケット構造は、解放されます、そして、新しい構造は、圧縮された TCP TIMEXWAIT 状態と呼ばれる、この状態で接続を持続するために必要な最小量の情報を含むように割り付けられます。この構造がソケット構造より小さいので、かなりの量のシステムメモリを節約することができます。 net.inet.tcp.maxtcptw MIB 変数は、割り付けられたこれらの構造の最大数を制御します。デフォルトで、それは、 kern.ipc.maxsockets / 5 に初期化されます。
nolocaltimewait
両方の終点がローカルである接続のために圧縮された TCP TIMEXWAIT 状態の作成を抑制します。
fast_finwait2_recycle
ソケットが SBS_CANTRCVMORE としてマークされるとき、 TCP FIN_WAIT_2 接続を、より速くリサイクルします (ユーザプロセスでは、ソケットがオープンされず、ソケットで受信されたデータは、読み込むことができません)。ここで使用されたタイムアウトは、 finwait2_timeout です。
finwait2_timeout
TCP FIN_WAIT_2 接続の速いリサイクルに使用するタイムアウト。デフォルトは、60 秒です。
ecn.enable
TCP Explicit Congestion Notification (明示的な輻輳通知) (ECN) のサポートを有効にします。 ECN によって、TCP の送信側は、パケットの落下を回避するために転送速度を減少することができます。
ecn.maxretries
特定の接続のとき、ECN を無効にする前の (SYN または SYN/ACK の再送の) 再試行の数。これは、壊れているファイアウォールがネットワーク経路にあるとき、接続の確立に役に立つために必要です。

エラー

ソケット操作は、失敗すれば、次のエラーのうちの 1 つを返します:
[ EISCONN]
既に接続があるソケットに接続を確立しようとしたとき。
[ ENOBUFS]
システムが内部のデータ構造のためのメモリを使い果たすとき。
[ ETIMEDOUT]
接続が過度の再送信のため切れたとき。
[ ECONNRESET]
リモートピア (相手側) が強制的に接続をクローズさせられるとき。
[ ECONNREFUSED]
リモートピア (相手側) が積極的に接続の確立を拒絶するとき (通常、どんなプロセスもポートを listen (接続を受け付け) していないので)。
[ EADDRINUSE]
既に割り付けられたポートがあるソケットを作成する試みをするとき。
[ EADDRNOTAVAIL]
ネットワークインタフェースが存在しないネットワークアドレスでソケットを作成する試みをするとき。
[ EAFNOSUPPORT]
ソケットをマルチキャストアドレスにバインドするか、または接続する試みをするとき。

関連項目

getsockopt(2), socket(2), sysctl(3), blackhole(4), inet(4), intro(4), ip(4), mod_cc(4), siftr(4), syncache(4), setkey(8) V. Jacobson, R. Braden, and D. Borman, TCP Extensions for High Performance, RFC 1323. A. Heffernan, Protection of BGP Sessions via the TCP MD5 Signature Option, RFC 2385. K. Ramakrishnan, S. Floyd, and D. Black, The Addition of Explicit Congestion Notification (ECN) to IP, RFC 3168.

歴史

TCP プロトコルは、 4.2BSD で登場しました。ウィンドウスケーリングとタイムスタンプに関する RFC 1323 拡張は、 4.4BSD で追加されました。 TCP_INFO オプションは、 Linux 2.6 で導入され、 変更される可能性があります
March 7, 2012 FreeBSD