プロトコル、TCP)は、伝送制御プロトコルといわれ、インターネット・プロトコル・スイートの中核プロトコルのひとつ。そのため、スイート全体を一般に「TCP/IP」と呼ぶ。TCPは、送信元のコンピュータ上のプログラムから別のコンピュータ上の別のプログラムへと信頼できる順序通りのオクテット列の転送を行う。主要なインターネット・アプリケーションはTCPを利用している。UDPは信頼性よりもレイテンシ低減を重視したデータグラムサービスを提供する。OSI参照モデルのトランスポート層にあたる。ネットワーク層のプロトコルであるIPの上位プロトコルとして使われる。IPヘッダでのプロトコル番号は6である。TCPは、セッションという形で1対1の通信を実現し、パケットシーケンスチェックによる欠損パケット再送などのエラー訂正機能などを持ち、データ転送などの信頼性の必要な場面でよく使用される。他のトランスポート層プロトコルに比べ、プロトコル上のオーバヘッドが大きい為、比較的低速となる。技術仕様を規定している。上位プロトコルとして、HTTP、FTP、Telnet、SSHなどがある。題した論文を出版[1]。著者はヴィントン・サーフとロバート・カーンで、ノード間でパケット通信を使い資源を共有するインターネットワーキングのプロトコルを記述したものである。ホスト間のコネクション指向のリンクとデータグラムサービスの両方を含んでいた。呼ぶが、公式にはインターネット・プロトコル・スイートと呼ぶようになった。中間の層で通信サービスを提供する。アプリケーションプログラムがIPを使って大きなデータの塊を送信したいという場合、直接そのデータをIPのサイズで分割して一連のIP要求を発行するのではなく、TCPに1度要求を発行するだけで、TCPにIPの詳細を任せることができる。IPはパケットと呼ばれる情報の断片をやり取りする形で機能する。パケットは、ヘッダ部に本体が続く形で構成されるオクテット列である。ヘッダ部には、そのパケットの宛先があり、その宛先に到達するために中継で使用すべきルーターを指定することもある。本体にはIPが転送すべきデータが格納される。ネットワークが混雑(輻輳)したり、トラフィックを負荷分散させようとしたり、その他ネットワークの予測できない振る舞いにより、IPパケットは喪失したり、重複したり、順序がばらばらで届いたりする。TCPはそれらの問題を検出し、喪失データの再送を要求し、データの順序を正しく並べ替え、さらにネットワークの混雑が起きにくくなるよう制御して他の問題が発生する可能性を低くする。TCPの受信側は、オクテット列の順序を元通りに再現すると、それをアプリケーションプログラムに渡す。したがってTCPは、アプリケーションに対してネットワークの詳細を隠蔽して抽象化しているといえる。TCPはインターネットの様々な主要アプリケーションで広く使われている。Shell、ファイル共有、一部のストリーミングなどがある。TCPは高速さよりも正確さに最適化されており、そのためメッセージの順序がばらばらだったり、喪失したメッセージの再送を待ったりすることがあると、秒のオーダーの比較的長い遅延が生じることがある。これはリアルタイム性を求められるVoIPなどのアプリケーションには向いていない。プロトコルが推奨される[2]。TCPは高信頼ストリーム配送サービスであり、重複したり喪失したりすることなく、あるホストから別のホストにデータを配送することを保証する。パケット転送は信頼できないので、確認応答と再送という技法でパケット転送の信頼性を保証している。この基本的技法では、受信側がデータを受信するたびに確認応答メッセージを送り返す必要がある。送信側は送信した各パケットの記録を保持しておき、次のパケットを送信する前に確認応答を待つ。送信側はまたパケット送信時からのタイマーを保持しており、規定時間以内に確認応答がなければ再送を行う。これは、パケットが喪失した場合や内容が壊れていて確認応答もできない場合に必要とされる[2]。TCPには一連の規則がある。組合わせて使う際の規則、インターネット上のホスト間で「メッセージ単位の形式で」データを送信するためのIPの規則である。(segment)」と呼ばれるデータ単位の転送を扱う。セグメントはネットワーク内での効率的ルーティングのためにメッセージを分割したものである。WebサーバがHTMLファイルを送信する場合、そのサーバのTCP層(トランスポート層)でそのファイルのオクテット列を一連のセグメントに分割し、セグメント毎にIP層(ネットワーク層)に渡す。IP層はTCPセグメントに宛先IPアドレスなどを含むIPヘッダを付与して、IPパケットにカプセル化する。各パケットは同じ宛先アドレスを付与されているが、ネットワーク内の転送経路はパケット毎に異なる可能性がある。宛先のコンピュータ上のクライアントプログラムがそれらを受信すると、TCP層はセグメント群に誤りがないことを確認し、それらを正しい順序で再結合し、アプリケーションに渡す。TCPセグメント構造[編集]TCPは上位から受け取ったデータを分割し、それにTCPヘッダを付与してTCPセグメントを作成する。データグラムにカプセル化される。TCPセグメントは「データを相手と交換するためにTCPが使う情報の束」である[3]。「データグラム」[4]、データリンク層のPDUは「フレーム」と呼ぶのが一般的である。プロセスはTCPを呼び出し、データを格納したバッファを引数で渡すことでデータを送信する。TCPはそれらのバッファ内のデータをセグメント群にパッケージし、インターネット・モジュール(例えばIP)を呼び出すことで宛先のTCPへ各セグメントを送信する。[5]TCPセグメントは、セグメント・ヘッダとデータ部分から成る。TCPヘッダは10の必須フィールドとオプションの拡張フィールドを含む(テーブルではオプション部分をオレンジで示している)。データ部はヘッダ部の後に続いている。その内容はアプリケーションに渡すべきデータである。データ部の長さはTCPセグメントのヘッダには記されておらず、IPヘッダにあるIPデータグラム長からIPヘッダとTCPヘッダの長さを差し引いて計算できる。(1)、初期シーケンス番号である。実際の先頭データバイトのシーケンス番号と対応する確認応答の確認応答番号は、このシーケンス番号に1を加えた値になる。(0)、このセッションにおけるこのパケットの先頭データバイトの累積シーケンス番号である。ACKフラグがセットされている場合、受信側が期待する次のシーケンス番号を格納している。(もしあれば)それまでの全バイト列の受信を確認済みであることを示す。最初に互いにACKを送る際は、相手側の初期シーケンス番号を確認するだけで、データは含めない。TCPヘッダのサイズを32ビットワード単位で表す。ヘッダの最小サイズは5ワードで、最大サイズは15ワードである。ヘッダ部は20バイトから60バイトまでの大きさであり、21バイトめからの40バイトはオプションとなる。TCPセグメント内の実際にデータが始まる位置を示すことにもなるため、データオフセットとも呼ぶ。9個の1ビットのフラグがある。ECEフラグがセットされたTCPセグメントを受信した際、輻輳制御機構で応答するときにセットする。(1)、ECN(英語版)を利用可能であることを示す。フラグがセットされたパケットを受信したことを示す。緊急ポインタ・フィールドが有効であることを示す。確認応答番号フィールドが有効であることを示す。最初のSYNパケットを除く以降の全パケットでこのフラグをセットする。バッファに蓄えたデータをアプリケーションにプッシュする(押しやる)ことを依頼する。コネクションをリセットする。シーケンス番号の同期。通信する両方で最初のパケットだけ、このフラグをセットする。他のフラグはこのフラグの値によって意味が変化したり、このフラグの値によって有効/無効が決まる。受信ウィンドウの大きさ。このセグメントの送信側がその時点(確認応答番号フィールドにあるシーケンス番号以降)で受信可能なバイト数を指定する。詳しくはフロー制御の節とウィンドウスケーリングの節を参照。ヘッダおよびデータの誤り検出用の16ビット検査合計。後述の#誤り検出と#検査合計の計算も参照。URGフラグがセットされている場合、最新の緊急データバイトのシーケンス番号からのオフセットを示す。ヘッダ長フィールドによって、このフィールドの長さが決まる。個々のオプションは、オプション種別(1バイト)、オプション長(1バイト)、オプションデータ(可変)から成る。オプション種別フィールドはオプションの種類を示し、オプションとしては必ず存在するフィールドである。オプションの種類によって扱い方が違い、後続の2つのフィールドの有無も異なる。存在する場合、オプション長フィールドはそのオプションの全長が格納されており、オプションデータ・フィールドにはオプションに関わる値が格納されている。オプションであることを意味し、オプション長やオプションデータは存在しない。オプションであることを意味し、この場合も1バイトだけである。この長さはオプションの全長であるため、オプション種別フィールドとオプション長フィールドのぶんも含んでいる。従って、MSS値は通常2バイトで表され、オプション長は4(バイト)となる。TCPヘッダが32ビット境界で終わるようにするために使われる。パディングは常に0である[6]。一部のオプションはSYNがセットされているときだけ送信される。オプション値](全ビット数)」の形式で示す。何もしない(NOP、パディング)。オプション・フィールドを32ビット境界に揃えるのに使う。