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 プロトコルを利用しているソケットは “能動型” および “受動型” の 2 種類があります。 能動型のソケットは、受動型のソケットに対しコネクションを開始します。 デフォルトでは TCP ソケットは能動型のものが作成されます。 受動型ソケットを作成するには、 bind(2) システムコールでソケットをバインドした後、 listen(2) システムコールを使う必要があります。 受動型ソケットのみが、 accept(2) コールを使用して、入力されるコネクション要求を受け付ける ことができます。 また、能動型ソケットのみが、 connect(2) コールを使用してコネクションを開始することができます。 TCP はさらに、トランザクション TCP と呼ばれるデータグラムの様なモードもサポートしています。 本件に関しては ttcp(4) で述べられています。

受動型ソケットは 複数のネットワークから来るコネクション要求に対処するために、 その位置を “明確に指定しない” ことができます。 この技術は “ワイルドカードアドレッシング” と呼ばれ、 単一のサーバが複数のネットワーク上のクライアントに サービスを提供することができます。 全ネットワークからのコネクション要求に応答するソケットを 作成するには、 インターネットアドレス INADDR_ANY をバインドする必要があります。 この時点でも、 TCP ポートを指定できます。 もしポートが指定されていない場合はシステムがポートを割り当てます。 コネクションが一度確立されると、 ソケットのアドレスはピアエンティティの場所により固定されます。 ソケットが割り当てられたアドレスは、 ネットワークインタフェースと 結び付けられており、このネットワークインタフェースを通して パケットが送受信されます。 普通、このアドレスはピアエンティティのネットワークと一致します。

TCP はソケットのオプションをいくつかサポートしており、それらは setsockopt(2) により設定できます。また、 getsockopt(2) によりオプションの設定を調べることができます:

TCP_NODELAY
    大抵の状況下において、 TCP はデータが現れるとそれを送信します。 確認応答されていないデータが残っている場合は、 確認応答が受信された時すぐに一つのパケットで送信するために 少量の出力データを集めておきます。 応答を受け取らないマウスイベントのストリームを送信する ウィンドウシステムのような 少数のクライアントにとっては、 このパケット化は重大な遅延の原因となります。 ブールオプション TCP_NODELAY によりこのアルゴリズムを無効にすることができます。

TCP_MAXSEG
    デフォルトでは、送信側及び受信側の TCP 間の各コネクションで 各々最大セグメントサイズの取り決めを行います。 TCP_MAXSEG オプションにより この取り決めの結果をユーザが決定することができ、 また要求があればその値を減らすことができます。

TCP_NOOPT
    TCP は普通、 本実装において提供される様々な TCP 拡張機能に従って、 各パケット中でいくつかオプションを送信します。 ブールオプション TCP_NOOPT は各コネクションで使用される TCP オプションを無効化するために提供されています。

TCP_NOPUSH
    慣例により、送信側の TCP は “push” ビットをセットし、(もし許可されていれば) write(2) または writev(2) が呼ばれる度に即座に送信します。 TCP_NOPUSH オプションは トランザクション TCP ( ttcp(4) を参照) をサーバが簡単に利用するために提供されています。 本オプションが 0 以外の値にセットされると、 TCP はソケットがクローズされるか内部の送信バッファがいっぱいになるまで、 あらゆるデータの送信を遅らせます。

setsockopt(2) コールにおけるオプションレベルは TCP のプロトコルナンバであり、 getprotobyname(3) あるいは IPPROTO_TCP から得ることができます。 オプションは、すべて <netinet/tcp.h> で定義されています。

IP トランスポートレベルでのオプションは TCP で使用可能です。本件は ip(4) を参照してください。 ソースルートの入力コネクション要求が記載されており、 また逆向きのソースルートが応答で使用されます。

MIB の変数
tcp プロトコルは、 sysctl(3) MIB の net.inet ブランチで 3 つの変数を実装しています。

TCPCTL_DO_RFC1323
    (tcp.rfc1323) RFC 1323 のウィンドウスケーリング及び タイムスタンプのオプションの実装 (デフォルトは真)。

TCPCTL_DO_RFC1644
    (tcp.rfc1644) トランザクション TCP の実装。 RFC 1644 で述べられています。

TCPCTL_MSSDFLT
    (tcp.mssdflt) 最大セグメントサイズ (“MSS”) のデフォルト値。 MSS の取り決めの際に特に指示が無い場合に使用されます。

診断
ソケット操作の失敗の際には次のエラーのうちの一つが返されます:

[EISCONN]
    既にコネクションが確立されているソケットに対し さらにコネクションを確立させようとした時

[ENOBUFS]
    内部的なデータ構造のためのメモリが不足した時

[ETIMEDOUT]
    過度の再送信によりコネクションが落ちた時

[ECONNRESET]
    リモートピアが強制的にコネクションをクローズした時

[ECONNREFUSED]
    リモートピアが意識的にコネクションの確立を拒否してきた時 (大抵はそのポートを監視しているプロセスが無いためです)

[EADDRINUSE]
    既に割り当てられているポートに対しソケットを作成しようとした時

[EADDRNOTAVAIL]
    対応したネットワークインタフェースが存在しない ネットワークアドレスを指定し、ソケットを作成しようとした時

[EAFNOSUPPORT]
    マルチキャストアドレスに対し ソケットをバインドまたは接続しようとした時

関連項目
getsockopt(2), socket(2), sysctl(3), inet(4), intro(4), ip(4), ttcp(4) V. Jacobson, R. Braden, and D. Borman, TCP Extensions for High Performance, RFC 1323. R. Braden, T/TCP - TCP Extensions for Transactions, RFC 1644.

歴史
tcp プロトコルは 4.2BSD から登場しました。 ウィンドウスケーリング及びタイムスタンプに関する RFC 1323 の拡張機能は 4.4BSD で追加されました。