Transmission Control Protocol

Transmission Control Protocol (TCP) について



Transmission Control Protocol(TCP)は、IPネットワーク上で動作する、コネクション型の信頼性の高い通信プロトコルです。アプリケーション間のデータ伝送において、データの到達保証、順序保証、誤り検出など、さまざまな機能を提供することで、インターネットにおける通信の信頼性を支えています。

概要



TCPは、ポート、ソケット、コネクションといった概念を導入し、IPネットワーク上のアプリケーション同士が、これらの概念を通じてデータのやり取りを行うことを可能にします。確立されたコネクションは、TCPの制御機構によって、データの確実な到着、破壊の検出、流量制御、輻輳制御が実現され、バイトストリームの伝達を可能にします。これにより、ファイル転送、電子メール、Web閲覧など、インターネットの多くのアプリケーションで、信頼性の高いデータ通信が実現されています。

TCPはインターネットプロトコルスイートの一部であり、IPの上位層プロトコルとして機能します。OSI参照モデルではトランスポート層に位置づけられます。その仕様はIETFによってRFC 9293として標準化されています。IPヘッダ内のプロトコル番号は6です。

TCPと対比されるプロトコルとしてUser Datagram Protocol(UDP)があります。UDPは信頼性よりもシンプルさ、低遅延を重視したデータグラム通信を提供します。TCPはより高い信頼性を提供する代わりにオーバーヘッドが発生します。

起源



TCPの起源は、1974年5月にIEEEが出版した論文「A Protocol for Packet Network Interconnection」に遡ります。この論文で、ヴィントン・サーフロバート・カーンは、パケット通信を用いた資源共有のインターネットワーキングプロトコルを提唱しました。当初、Transmission Control Programとして一体化されていた機能は、後にモジュール化され、コネクション指向のTCPとデータグラムサービスのIPに分割されました。このモデルはTCP/IPとして知られるようになりましたが、正式にはインターネットプロトコルスイートと呼ばれています。

機能



TCPはIPネットワーク上で以下の機能を提供します。

アプリケーション間通信



IPはホスト間の通信を可能にしますが、ホスト内の複数のアプリケーションを区別することはできません。TCPはポート機能を提供することで、ホスト内の複数のアプリケーションへの通信振り分けを可能にし、アプリケーション間通信を実現します。

到達保証



IPはパケットの送信を可能にするのみで、その到達は保証しません。TCPは、到達確認とデータ再送要求の機能を提供することで、送信されたデータが確実に宛先に届くようにします。

ストリーム送信



IPは独立したパケットを送信するため、パケット間の関係性を扱いません。TCPは、バイトストリーム入出力機能を提供することで、大きなファイルや連続したデータストリームの送信を可能にします。

順序制御



ネットワークの輻輳などにより、IPパケットは順序が入れ替わって届く可能性があります。TCPは順序制御を提供することで、パケットから元のデータストリームを再構築することを保証します。

コネクション型通信



IPはコネクションの概念を持ちませんが、TCPはソケット対に基づくコネクションを定義し、コネクション型の通信を提供します。これにより、単一のアプリケーションが複数のコネクションを独立して扱うことができます。

流量制御



TCPは、通信先が過剰なデータを受信しないように流量制御を提供します。

輻輳制御



TCPは、ネットワークの混雑(輻輳)を検出し、輻輳が起きにくくなるように制御することで、ネットワーク全体の安定性を保ちます。

特性



TCPは、高速さよりもデータの完全性を重視します。データの到達が保証され、データを正しく並び替えることができるため、高い信頼性が求められるファイル転送などに適しています。一方、リアルタイム性が求められるVoIPなどのアプリケーションには、UDPなどの別のプロトコルが推奨されます。

利用



TCPは、Web閲覧(WWW)、電子メール、ファイル転送プロトコル(FTP)、セキュアシェル(SSH)、ファイル共有、一部のストリーミングなど、多くのインターネットアプリケーションで利用されています。

TCPセグメント構造



TCPにおける送受信単位はTCPセグメントと呼ばれます。TCPは、上位層から受け取ったデータを分割し、TCPヘッダを付与してTCPセグメントを作成します。TCPセグメントはさらにIPデータグラムにカプセル化されて送信されます。

TCPセグメントの構造



TCPセグメントは、セグメントヘッダとデータ部分から構成されます。TCPヘッダには、必須フィールドとオプションの拡張フィールドが含まれます。データ部は、アプリケーションに渡されるデータです。

主要なヘッダフィールド



送信元ポート(16ビット: 送信側のポート番号。
送信先ポート(16ビット: 受信側のポート番号。
シーケンス番号(32ビット: データストリームにおけるバイトの位置を示す番号。
確認応答番号(32ビット: 受信側が次に期待するシーケンス番号。
ヘッダ長(4ビット: TCPヘッダの長さを32ビットワード単位で示す。
予約(3ビット: 将来の利用のために予約されたビット列。
フラグ(9ビット: コントロールビット列で、接続確立、終了、緊急データなどを制御する。
ウィンドウサイズ(16ビット: 受信側が受信可能なデータ量を示す。
チェックサム(16ビット: ヘッダとデータの誤り検出に使う。
緊急ポインタ(16ビット: 緊急データがある場合、その位置を示す。
オプション(可変長): TCPの拡張機能に利用される。
パディング: ヘッダが32ビット境界で終わるようにするために使われる。

プロトコル操作



TCPのプロトコル操作は、コネクションの確立、データ転送、コネクションの終了の3つのフェーズに分けられます。コネクションは、3ウェイハンドシェイクというプロセスで確立され、データ転送後、仮想回線が閉じられます。

コネクションの確立(3ウェイ・ハンドシェイク)



1. SYN: クライアントがサーバにSYNパケットを送信し、接続を要求します。
2. SYN-ACK: サーバはSYN-ACKパケットを返信し、接続要求を受け付けます。
3. ACK: クライアントはACKパケットを返信し、コネクションが確立されます。

コネクションの状態遷移



TCPコネクションは、以下のような状態の間を遷移します。LISTENING, SYN-SENT, SYN-RECEIVED, ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, LAST-ACK, TIME-WAIT, CLOSED。

データ転送



データ転送中、TCPは以下の機能を提供します。

順序保証: シーケンス番号を使ってデータの順序を保証します。
到達保証/再送: 応答のないセグメントは再送します。
誤りのないデータ転送: チェックサムを使ってデータのエラーを検出します。
フロー制御: スライディングウィンドウを使ってデータの流量を制御します。

コネクションの終了



コネクションの終了は、4ウェイハンドシェイクまたは3ウェイハンドシェイクで行われます。FINパケットを交換し合い、コネクションを終了します。

リソースの使い方



TCPは、セッションをOSのプロセスとマッピングします。パケットを受信すると、TCPソフトウェアはテーブルを参照して対応するプロセスを特定します。サーバ側のセッション数はメモリ容量に制限されますが、クライアントはポートを確保する必要があるため、接続数に制限が生じる場合があります。

誤り検出



TCPは、チェックサムフィールドを使用してデータのエラーを検出します。TCPチェックサムは現在では弱いとされていますが、エンドツーエンドの誤り検出には有効です。

フロー制御



TCPは、スライディングウィンドウという仕組みを使ってフロー制御を行います。受信側は、ウィンドウサイズを通知することで、送信側が過剰なデータを送信しないように制御します。

輻輳制御



TCPは、スロースタート、輻輳回避などのアルゴリズムを使ってネットワーク輻輳を制御します。送信データに対するACKの有無を基に、ネットワークの状態を判断し、送信レートを調整します。

最大セグメントサイズ (MSS)



MSSは、単一のセグメントで受信できる最大データ量です。適切なMSSを設定することで、IPフラグメンテーションを避けることができます。

選択確認応答(SACK)



選択確認応答(SACK)は、パケットのロス発生時、失われたパケットのみを再送する機能を提供します。これにより、再送効率が向上します。

ウィンドウスケーリング



ウィンドウスケーリングは、TCPウィンドウサイズを拡張するためのオプションです。これにより、広帯域ネットワークでも効率的なデータ転送が可能になります。

TCPタイムスタンプ



TCPタイムスタンプは、パケット送出の順序をTCPレベルで知るために使用されます。これにより、再送パケットの識別や、パケットロスの原因の特定が可能になります。

帯域外データ



帯域外データは、通常のデータストリームに割り込んで緊急データを送信するために使用されます。リモートログインセッションの強制アボートなどに利用されます。

強制的データ送出



TCPは通常、データがMSSまで溜まるか、一定時間経過するまで送信を遅延させますが、`TCP_NODELAY`オプションを使うことで、送信遅延をなくすことが可能です。

脆弱性



TCPにはDoS攻撃、コネクション乗っ取りなどの脆弱性が存在します。これらの攻撃に対処するためのさまざまな対策が提案されています。

TCPポート



TCPポートは、ホスト内アドレスとして機能します。ポート番号は0から65535までの範囲で、Well-knownポート、Registeredポート、Dynamic/Privateポートの3つのカテゴリに分類されます。ポートは、アプリケーションとコネクションを関連付けるために使用されます。

発展



TCPは、初期のRFC 675から多くの改良が加えられてきました。近年では、マルチパスTCP、TCP Cookie Transactions、tcpcryptなどの拡張機能が提案されています。

無線ネットワークでのTCP



TCPは有線ネットワーク向けに最適化されていますが、無線ネットワークでは、パケットロスが輻輳以外の原因で発生することがあります。この問題に対処するため、様々な対策が研究されています。

デバッグ



LANアナライザやソケットオプションを使用することで、TCPの動作をデバッグできます。

代替となる選択肢



TCPが適さない場合は、UDPやSCTPなどの代替プロトコルが使用されることがあります。UDPは、リアルタイム性を重視するアプリケーションに、SCTPは信頼性とリアルタイム性を両立する必要があるアプリケーションに適しています。

チェックサムの計算



TCPチェックサムは、IPv4IPv6で計算方法が異なります。擬似ヘッダを含めて計算されます。また、チェックサムの計算をネットワークカードにオフロードすることで、CPUの負荷を軽減できます。

まとめ



TCPは、インターネットにおける信頼性の高い通信を実現するために不可欠なプロトコルです。その複雑な仕組みと高度な機能によって、今日のインターネット社会を支えています。TCPの理解は、ネットワークエンジニアにとって必須の知識であり、より安全で効率的なネットワーク構築に繋がります。

参考文献



W. Richard Stevens. TCP/IP Illustrated, Volume 1: The Protocols.
W. Richard Stevens and Gary R. Wright. TCP/IP Illustrated, Volume 2: The Implementation.
W. Richard Stevens. TCP/IP Illustrated, Volume 3: TCP for Transactions, HTTP, NNTP, and the UNIX Domain Protocols.

学習用参考書



小口正人:「コンピュータネットワーク入門―TCP/IPプロトコル群とセキュリティ」、サイエンス社
村公保:「基礎からわかるTCP/IP ネットワークコンピューティング入門 第3版」、オーム社
安永遼真、中山悠、丸田一輝:「TCP技術入門 ――進化を続ける基本プロトコル」、技術評論社
みやたひろし:「図解入門TCP/IP 仕組み・動作が見てわかる」、SBクリエイティブ

関連項目



ポート番号
最大伝送ユニット (MTU)
最大セグメントサイズ (MSS)
SYN flood
SYN cookies
ユーザデータグラムプロトコル (UDP)
ストリーム制御伝送プロトコル (SCTP)
データグラム輻輳制御プロトコル (DCCP)
トランスポート層
エンドツーエンド原理
二人の将軍問題
ウィンドウサイズ
スライディングウィンドウ
フロー制御
Bufferbloat

外部リンク



RFC 675
RFC 1122
RFC 7323
RFC 2018
RFC 6298
RFC 3390
RFC 6582
RFC 7414
RFC 5681
RFC 9293
Robert E. Kahnの口述歴史インタビュー
John Kristoff's Overview of TCP
TCP, Transmission Control Protocol
Compute 16-bit One's Complement Sum
TCP tutorial
Linktionary on TCP segments

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。