TCP
TCPは"Transmission Control Protocol"の略で、トランスポート層のプロトコルの一つです。TCPは、信頼性の高い通信を提供するために設計されており、以下のような特徴を持っています。
コネクション指向: 通信を開始する前に、接続を確立する必要があります。これにより、データの送受信が確実に行われます。
信頼性: データの順序が保証され、パケットの損失や重複が検出され、再送信が行われます。
TCPの概要
それではTCPの概要について確認しましょう。
TCPでは情報は連続して入出力されるということで、UDPにおける『データグラム』とは違う『ストリーム(stream)』という概念で扱われます。 ストリームは、データの連続的な流れを表し、TCPはこのストリームを確実に送受信するための機能を提供します。
ストリームには順序(最初に送信されたデータが最初に届く)を保証する必要があります。
ストリームは、データの断片化を行わず、連続したデータとして扱います。つまり、アプリケーション層でのデータの分割や結合は必要ありません。
分割は必要であればTCPの層が行うため、アプリケーション側では考えなくて良いということです。
ストリームは、データの到達確認を行い、パケットの損失や重複を検出し、再送信を行います。これにより、信頼性の高い通信が実現されます。
順序の保証
TCPにおいて、送出されるデータは順序が保証されるようになっています。 これは、断片化が発生する際に『この断片はストリームの何番目』という情報を付与して送信されるためです。
受信側はこの情報を利用して、受信したデータを正しい順序で再構築します。
信頼性の保証
TCPは、信頼性の高い通信を提供するために、以下のような機能を持っています。
再送信: パケットが損失した場合、TCPはそのパケットを再送信します。これにより、データの完全性が保証されます。
フロー制御: TCPは、送信側と受信側のバッファサイズを考慮して、データの送信速度を調整します。これにより、受信側が処理できる範囲内でデータが送信され、輻輳を防ぎます。
コネクションの確立と終了
信頼性のひとつとしても考えられますが、どこから通信が開始され、どこで終了するのかが明確にしておかないといけません。 そのために、接続(コネクション)の確立と終了の際に、3ウェイハンドシェイクと呼ばれる手順が用いられます。
接続時の確立フロー
接続の確立の前にある意味確認とも言える『接続要求』の信号を送信します、これをSYNと呼びます。 受け取った相手側は双方向通信を行うため、ACKと呼ばれる『承認』の信号と共にSYNも返します(SYN-ACK)。 受け取った側(すなわち本来の接続要求側)も、ACKを返すということになります。 これにより双方から通信の承認が下り、双方向回線が開くということになります。
接続終了のフロー
接続を終了する際には、FINと呼ばれる『ここで通信は終わります』に相当する信号を送信します。これは『接続終了要求』の意味を持ちます。 こちらでも、受け取った側からACK(承認)と共にFINを返します。 送信元もこれに応じてACKを返すことで、双方のFINが成立して切断となります。
もちろん実際にはFINの処理が行われる前に『強制的に回線が切られる』などの問題も起こりえますが、正常な終了という意味ではこの流れとなっています。
フロー制御
フロー制御は、TCPの重要な機能の一つであり、送信側と受信側の間でデータの流れを調整する役割を果たします。これにより、受信側が処理できる範囲内でデータが送信され、輻輳を防ぎます。
TCPでは、ウィンドウサイズという概念を用いてフロー制御を実現しています。ウィンドウサイズは、送信側が一度に送信できるデータの量を制限するもので、受信側のバッファサイズに基づいて動的に調整されます。
具体的には、受信側は自分のバッファの空き状況を送信側に通知し、送信側はその情報をもとにデータの送信速度を調整します。これにより、受信側がオーバーフローすることなく、スムーズなデータ転送が実現されます。
この部分をいかに効率的に行うかというのが輻輳制御(ふくそうせいぎょ)というものです。 輻輳制御のアルゴリズムなどまではこの授業では取り扱いません。
TCPのヘッダー構造
以下の図は、基本となるTCPのヘッダー構造です。
それぞれを簡単に説明します。
Source Port(送信元ポート番号): 送信元のアプリケーションが使用するポート番号です。
Destination Port(宛先ポート番号): 宛先のアプリケーションが使用するポート番号です。
Sequence Number(シーケンス番号): 送信されたデータの順序を識別するための番号です。これにより、受信側はデータの順序を正しく再構築できます。
Acknowledgment Number(確認応答番号): 受信側が受け取ったデータの最後のシーケンス番号を示します。これにより、送信側はどのデータが受信されたかを確認できます。
Data Offset(データオフセット): ヘッダーの長さを示すフィールドで、ヘッダーのサイズを4の倍数で表します。
ここだけは少しややこしくて、4バイトを1つのかたまりと考えてn倍という形で表現します。
標準的なTCPヘッダは20バイトのため、ここの値は(20/4で)5です。
オプションがある場合は32ビット単位のパディングで入力するキマリのため、必ず4の倍数です。
Reserved(予約領域): 将来の拡張のために予約されたビットです。
Flags(コントロールフラグ): TCPの制御フラグを示すビットフィールドで、接続の確立や終了、データの確認応答などの状態を示します。
Window Size(ウィンドウサイズ): 受信側のバッファサイズを示し、送信側が一度に送信できるデータの量を制限します。
Checksum(チェックサム): データの整合性を確認するためのフィールドで、送信されたデータに対するチェックサムが含まれます。
Urgent Pointer(緊急ポインタ): 緊急データの位置を示すためのフィールドで、緊急データが含まれている場合に使用されます[1]。
シーケンス番号により、上位レイヤーから送られたデータが分割されている状態において『どの位置か』がわかる仕組みとなっています。 そして確認応答番号により『受信側がどのデータを受け取ったのか』がわかる仕組みとなっています[2]。
再送について
TCPにおいては、送信側が『受信側がどこまで受信できているか』を確認応答番号で把握します。 そのため、受信側が確認応答を返さない場合、送信側はそのデータが失われたと判断し、再送信を行います。
再送が発生するまでの時間(いわゆる『タイムアウト』)をどうするかはOSによる違いがあります。 一般的なUNIXでは、初期のタイムアウトを0.5秒単位で制御しており、タイムアウトは0.5秒の整数倍とされていることが多いです。ただし最初は多め(6秒程度)に設定されていることが多いです。
再送しても確認応答が戻らない場合は、繰り返し送信していきますが、タイムアウトが倍々となっていきます(0.5秒→1秒→2秒→4秒…)。さらにタイムアウトが増えていくことで、最終的には『再送をやめる』となります。 回線の正常な切断が行われなければ、いずれ再送が起きなくなり、回線は切れた状態となります。
ウィンドウサイズとバースト送信
ひとつパケットを送るたびにACKを待っていると非常に効率が悪いため、実際にはある程度まとめて送信を行っています。 このまとめて送る際に重要となるのがウィンドウサイズです。 確認応答パケットにあるウィンドウサイズを利用して、TCPパケットの分割された状態(セグメント、分割されたIPパケットとざっくり考えておくとよい)をまとめて送信します。 このウィンドウサイズは、受信側のバッファサイズに基づいて動的に調整されます。送信側は、ウィンドウサイズを考慮して、同時に送信できるデータの量を制限します。
この場合の確認応答は『受信の完了したデータの最後のシーケンス番号(+1)』となります。 もし途中のシーケンスが損失した場合は多少問題が発生します。
ACKにより足りないシーケンス番号が返されるため、それ以降の再送となります。
そもそもACKが帰ってこない場合は、まとめて送り直しということになります。
TCPの利用例
TCPは、信頼性が重要なアプリケーションで広く使用されています。以下は、TCPの利用例です。
ウェブブラウジング: HTTPやHTTPSプロトコルは、TCPを基盤として動作します。ウェブページのデータが正確に順序通りに送信されることが求められます。ただし最近はQUICというプロトコルに置き換えられる状況が出ています(HTTP/3)。
電子メール: SMTP、POP3、IMAPなどの電子メールプロトコルは、TCPを使用して信頼性の高いメールの送受信を実現します。
ファイル転送: FTP[3](File Transfer Protocol)やSFTP(Secure File Transfer Protocol)などのファイル転送プロトコルは、TCPを使用してファイルの正確な転送を行います。
現代的なTCP技術
2025年現在、TCPは従来の基本機能から大幅に発展し、現代のネットワーク環境に適応した新しい技術が導入されています。
QUIC プロトコル
QUIC (Quick UDP Internet Connections) は、Googleが開発しHTTP/3の基盤となるトランスポートプロトコルです。
UDP上でのTCP機能: QUICはUDPの上に構築されていますが、TCPの信頼性機能(再送制御、順序保証、輻輳制御)を実装しています
統合暗号化: TLSとの統合により、接続確立時に暗号化も同時に行われます
低レイテンシ: ハンドシェイクが高速化され、0-RTT(ゼロラウンドトリップ)接続が可能です
接続マイグレーション: モバイル環境でのIPアドレス変更に対応し、接続を維持できます
TCP拡張技術
TCP Fast Open (TFO)
TCP Fast Openは、接続確立時のレイテンシを削減する技術です。
初回接続時にクライアントがCookieを取得
以降の接続では、SYNパケットにデータとCookieを含めることで、3-wayハンドシェイクの完了を待たずにデータ送信が可能
Webアプリケーションなどで接続開始の高速化を実現
TCP BBR (Bottleneck Bandwidth and Round-trip propagation time)
GoogleとNAS (Networks API Solutions)が開発した輻輳制御アルゴリズムです。
従来の問題: 従来のTCP輻輳制御は、パケット損失を輻輳の指標としており、高品質な現代ネットワークでは効率が悪化
BBRの特徴: 帯域幅とRTTを測定し、最適なウィンドウサイズを動的に調整
高速・低レイテンシ: 特に高速・低遅延のネットワーク環境でのスループット改善に効果
Multipath TCP (MPTCP)
複数のネットワーク経路を同時に活用する技術です。
複数接続の統合: Wi-Fiとモバイル回線など、複数のネットワークインターフェースを同時に利用
冗長性: 一つの経路が切断されても通信を継続
帯域幅集約: 複数経路の帯域幅を合計して利用可能
モバイル環境: スマートフォンなどでの応用が期待されています
TCPセキュリティの強化
TCP MD5 Signature Option と TCP-AO
BGPルーティングなどのクリティカルな通信でのTCP認証技術です。
TCP MD5: 共有秘密鍵を用いたメッセージ認証
TCP-AO: より強力な暗号化アルゴリズムをサポートする後継技術
TCP性能監視と分析
注釈
この部分は高度な専門技術に関する内容です。応用情報技術者試験レベルを超える内容のため、初学者の方はスルーしても構いません。
TCP情報のエクスポート
現代のTCPスタックは詳細な統計情報を提供します。
ss コマンド: 従来のnetstatに代わる高機能な接続状況確認ツール
TCP プローブポイント: eBPFを活用したリアルタイム性能監視
輻輳ウィンドウ監視: cwnd、ssthresh等の内部状態の可視化
エッジコンピューティングとTCP
注釈
この部分は高度な専門技術に関する内容です。応用情報技術者試験レベルを超える内容のため、初学者の方はスルーしても構いません。
CDN(Content Delivery Network)およびエッジコンピューティング環境でのTCP最適化が進んでいます。
TCP最適化プロキシ: エッジサーバーでのTCP加速技術
Adaptive Bitrate Streaming: 動画配信でのTCP輻輳制御との連携
IoT向けTCP: 低電力デバイス向けの軽量TCP実装
これらの技術により、TCPは従来の信頼性を保ちながら、現代のネットワーク環境の要求に応えています。