この時点でクライアントとサーバ双方がコネクション確立の確認応答を受け取ったことになる。リソースの使い方[編集]多くの実装では、テーブルの1エントリを動作中のOSプロセスとのセッションにマッピングする。TCPセグメントにはセッション識別子がないため、通信している双方でクライアントのアドレスとポートでセッションを識別する。パケットを受信すると、TCPソフトウェアはそのテーブルを参照して、対応するプロセスを見つける。サーバ側でのセッション数はメモリ容量にのみ制限され、コネクション確立要求がくるたびに増えていく。クライアントはサーバに最初のSYNセグメントを送る前に無作為にポートを選んで確保しなければならない。このポートはコネクションをクローズするまで確保され続け、実質的にクライアントの持つIPアドレス毎の外に出て行くコネクション数を制限している。アプリケーションが不要になったコネクションをクローズしそこねると、空いているポートが足りなくなり、新たなTCPコネクションを確立できなくなる。通信する双方で確認応答を受け取っていない送信済みデータとアプリケーションに渡す前の受信データを格納しておく領域を確保する必要がある。異なる重要な特徴がある。受信側でシーケンス番号を使って並べ替えを行う[2]。確認応答のないセグメントは再送する[2]。高信頼配送を保証するため、送信側が送出するレートを制限する。受信側は常にどのくらいのデータを受け取れるかを知らせている(スライディングウィンドウで制御している)。受信側のバッファが一杯になると、次の確認応答ではウィンドウサイズを0とするので送信が停止し、バッファ内のデータを処理する余裕ができる[2]。輻輳制御[2]高信頼転送[編集]TCPは「シーケンス番号」を使ってデータの各バイトを識別する。シーケンス番号は双方のホストが送信するバイト列に先頭から振られる番号であり、それによってデータがどう分割されても、順番が入れ替わっても、転送中に失われても、元のデータを復元できる。ペイロードの各バイトを送るたびにシーケンス番号をインクリメントしなければならない。この番号は任意であり、TCPシーケンス番号予測攻撃への防御のために予測不可能な値とすべきである。採用しており、受信側が確認応答を返すとき、そのセグメントで示されている確認応答番号は、対応するシーケンス番号未満のデータを全て受信済みであることを示している。送信側はペイロードの先頭バイトのシーケンス番号をそのセグメントのシーケンス番号として設定する。受信側は次に受信することを期待しているバイトのシーケンス番号を確認応答番号に設定して確認応答を返す。なり、次のパケットで送られてくるペイロードの先頭バイトのシーケンス番号となっている。累積確認応答に加えて、受信側は選択確認応答でさらなる情報を送ることができる。送信側がネットワーク内でデータが失われたと判断した場合、データの再送を行う。誤り検出[編集]後述の#検査合計の計算も参照。シーケンス番号と確認応答は、パケットの重複、喪失パケットの再送、データの順序通りの並べ替えなどを扱っている。受信したパケットの内容が正しいことを確認するため、TCPには検査合計フィールドがある。検査合計フィールドは設定必須の項目であり省略できない。TCP検査合計は、現在の標準から見れば弱い。データリンク層のビット誤り率が高ければ、TCP検査合計とは別の誤り検出訂正機能が必要である。TCP/IPの下層であるデータリンク層には一般にCRCなどのもっと強力な検査機構があり、TCP検査合計の弱さを一部補っている(例えば、PPPやイーサネット)。いって16ビットのTCP検査合計が無駄というわけではない。実際、CRCで保護された通信路でパケットに誤りが残ることはよくあるが、エンドツーエンドの16ビットTCP検査合計がそういった単純な誤りを捉えている[14]。これはエンドツーエンド原理が機能している例である。フロー制御[編集]TCPはエンドツーエンドのフロー制御プロトコルを使い、送信ペースが受信側にとって速すぎる状態になるのを防いでいる。様々な性能の機器が接続されたネットワークでは、フロー制御は欠かせない機構である。PCから性能の劣るPDAにデータを送る場合、PDAの性能に合わせて送信ペースを調整する必要がある[2]。TCPはスライディングウィンドウによるフロー制御を採用している。各TCPセグメントについて、受信側は「ウィンドウサイズ」フィールドで、そのコネクション用のバッファの空き容量に相当する今後受信可能なデータの量(バイト単位)を示す。送信側は確認応答を待ち合わせるまでに、そのフィールドで指定された量までのデータを送り、新たな確認応答でウィンドウサイズ・フィールドを確認してさらに送信できるデータ量を更新する。TCPシーケンス番号と受信ウィンドウサイズは、時計のような振る舞いをする。受信ウィンドウは新たなセグメントのデータを受信したときと確認応答を返したときにずれていく。シーケンス番号は最大値までいくと0に戻る。このタイマは受信側のウィンドウサイズの更新セグメントが喪失してデッドロック状態になるのを防ぐためのものである(受信側がウィンドウサイズを更新しないと送信を再開できないため)。タイマがタイムアウトすると、送信側は小さなパケットを送り、その確認応答で受信側のウィンドウサイズが回復したかを調べる。受信側での受信データの処理が遅いと、ウィンドウサイズの指定は小さいままとなる。(SWS)と呼び、送信側は1度に数バイトのデータしか送れなくなり、TCPヘッダの方が大きな割合を占めるため転送効率が極端に低下する。輻輳制御[編集]TCPは高性能を達成し輻輳崩壊(ネットワーク性能が数桁のオーダーで低下する現象)を防ぐため、輻輳制御機構をいくつか備えている。ネットワークに流入させるデータレートを制御し、崩壊のきっかけとなるようなレート未満でデータを送るよう保つ。おおまかに最大最小公平(英語版)なフロー割り当てを目指す。(確認応答)の有無は、送信側でネットワークの状態を推測する材料となる。これをタイマと組み合わせ、データのフローの振る舞いを変化させることができる。これを一般に輻輳制御またはネットワーク輻輳回避などと呼ぶ。いう4つの相互にからみあったアルゴリズムを使用している。スループットをあげるため輻輳しない限界まで送信側はスライディングウィンドウを大きくする必要があるが、ウィンドウサイズを調整する輻輳回避アルゴリズムは長年研究されている。