🐕

TCPの基本概念と用語解説

2024/09/17に公開

はじめに

こんにちは、クラウドエースの SRE チームに所属している申です。

今回は、 TCP についてご紹介します。

TCP とは?

TCP (Transmission Control Protocol) は、インターネットプロトコルスイートの主要なプロトコルの一つです。
インターネットプロトコルスイート(Internet Protocol Suite) は、インターネットや他のネットワークでデータ通信を行うための標準的なプロトコルの集まりです。
主なプロトコルには、

  • TCP (Transmission Control Protocol)
  • IP (Internet Protocol)
  • UDP (User Datagram Protocol)

などがあります。

TCP はデータ転送の信頼性を確保するために使用されます。 TCP は、データパケットを順序通りに送信し、失われたパケットを再送し、データの整合性を保証する役割を果たします。

TCP の特徴

1. 信頼性のあるデータ通信を可能にします(シーケンス番号、確認応答番号)

シーケンス番号 (Sequence Number)
シーケンス番号は、 TCP セグメント内の各バイトに割り当てられる番号です。これにより、受信側はデータの順序を正しく再構築できます。また、シーケンス番号はデータの一部が失われた場合に再送要求を行うためにも使用されます。

確認応答番号 (Acknowledgment Number)
確認応答番号は、受信側が送信側に対して受信したデータの確認を行うための番号です。具体的には、受信側が次に受信したいシーケンス番号を示します。これにより、送信側はどのデータが正しく受信されたかを把握し、再送が必要かどうかを判断できます。

2. データの境界を区別しません(バイトストリームサービス)

バイトストリームサービス (Byte Stream Service)
バイトストリームサービスとは、 TCP がデータを一連のバイト(8 ビット単位)として扱う通信方式です。これにより、送信側と受信側はデータの境界を意識せずに、連続したバイトの流れとしてデータを送受信できます。具体的には、送信側が送ったデータが受信側に同じ順序で届くことを保証します。

3. データの送信順序を保証します(順序を維持するために各バイトに番号を付与)

  • シーケンス番号の付与
    送信側は、送信する各バイトにシーケンス番号を付与します。このシーケンス番号は、データが送信される順序を示すためのものです。

  • 確認応答番号の使用
    受信側は、受信したデータのシーケンス番号を確認し、次に受信したいシーケンス番号を確認応答番号として送信側に返します。これにより、送信側はどのデータが正しく受信されたかを把握できます。

  • 再送機能
    もしデータが失われるか順序が乱れた場合、受信側は期待するシーケンス番号を送信側に通知し、送信側はそのデータを再送します。

  • バッファリング
    受信側は受信したデータをバッファに一時的に保存し、シーケンス番号に基づいて正しい順序でアプリケーションに渡します。これにより、データの順序が保証されます。

4. データのフロー制御(受信バッファのオーバーフロー防止)および輻輳制御(パケット数が過度に増加することを防止)

バッファオーバーフロー(Buffer Overflow)
バッファオーバーフローは、プログラムが固定サイズのバッファ(メモリ空間)よりも多くのデータを書き込もうとする際に発生します。これはメモリの他の部分を上書きする可能性があり、セキュリティの脆弱性を引き起こすことがあります。

5. 接続の確立(3-way handshake)および解除(4-way handshake)

3 - way handshake

3 - way handshakeは、TCP 接続を確立するために使用される手順です。

4 - way handshake

4 - way handshakeは、TCP 接続を終了するために使用される手順です。

6. 全二重(フルデュプレックス)、点対点(ポイントツーポイント)サービス

全二重(フルデュプレックス, Full Duplex)
全二重通信は、データが同時に双方向に送信できる通信方式です。つまり、送信と受信が同時に行えるため、通信効率が高まります。例えば、電話通話は全二重通信の良い例です。両方の人が同時に話したり聞いたりできるからです。

ポイント対ポイント(ポイントツーポイント, Point-to-Point)サービス
ポイント対ポイントサービスは、二つのネットワークデバイス間で直接接続を通じてデータを送信する通信方式です。
この方式は、中間に他のネットワークデバイスや経路を通らないため、データ送信が速くて安定しています。
例えば、二つのコンピュータがイーサネットケーブルで直接接続されている場合が、ポイント対ポイント接続の一例です。

TCP ポートとは何か?

TCP ポート は、ネットワーク上でデータを特定のサービスやアプリケーションにルーティングするために使用される論理的な通信単位です。
TCP ポート は、ネットワーク通信において非常に重要な役割を果たします。

TCP ポートの役割

  • データのルーティング : ポートはデータパケットが到着したとき、それを正しいアプリケーションやサービスに転送する役割を果たします。例えば、ウェブブラウザがウェブサーバに接続する際にポート番号を使用してデータを送受信します。

  • サービスの識別 : 各ポート番号は特定のサービスやアプリケーションに対応しています。例えば、ポート 80 は HTTP 、ポート 443 は HTTPS 、ポート 25 は SMTP に対応しています。これにより、ネットワーク上で複数のサービスが同時に動作することが可能になります。

  • 通信の管理 : ポート番号を使用することで、同じ IP アドレスでも異なるサービスやアプリケーションが識別され、適切に管理されます。これにより、ネットワーク通信の効率と信頼性が向上します。

カテゴリ

ポート番号 : ポート番号は 0 から 65535 までの範囲を持ち、特定のサービスやアプリケーションに割り当てられます。

  • Well-known Ports (0-1023) : 主にシステムやよく知られたサービスに使用されます。例: ポート 80 (HTTP)、ポート 22 (SSH)。
  • Registered Ports (1024-49151) : 特定のアプリケーションやサービスに登録されたポートです。
  • Dynamic or Private Ports (49152-65535) : 一時的な目的やユーザー定義のアプリケーションに使用されます。
ポート 説明
20 FTP データ転送
21 FTP 制御 (コマンド転送)
22 SSH リモートログインおよびコマンド実行
23 Telnet リモートログイン
25 SMTP メール送信
80 HTTP ウェブトラフィック
110 POP3 メール受信
143 IMAP メール受信および管理
443 HTTPS セキュアウェブトラフィック
445 SMB ファイル共有
3389 RDP リモートデスクトップ接続

TCP Header

TCP ヘッダーは、データ通信において信頼性を確保するために必要な情報を含んでいます。以下に TCP ヘッダーの各フィールドについて説明します。

TCP Header

ビット (Bit) と バイト (Byte) とは?

ビット (Bit)

ビット (Bit) は、情報の最小単位です。ビットは 「 0 」 または 「 1 」 の 2 つの値を取ることができます。ビットはデジタル通信やコンピュータの内部表現において基本的な単位として使用されます。

1 ビット = 0 または 1
8 ビット = 1 バイト

バイト (Byte)

バイト (Byte) は、データの基本単位であり、通常 8 ビットで構成されます。バイトは文字や小さなデータの表現に使用されます。例えば、 1 バイトは 1 つの文字(ASCIIコード)を表すのに十分です。

1バイト = 8 ビット
データのサイズや容量を表す際に使用されます。

各フィールドの詳細

1. ソースポート (Source Port) : パケットを送信する側のポート番号。 16 ビットのフィールド。

2. デスティネーションポート (Destination Port) : パケットを受信する側のポート番号。 16 ビットのフィールド。

3. シーケンス番号 (Sequence Number) : パケット内のデータの順序を示すための番号。 32 ビットのフィールド。

データの順序を管理し、再送を容易にします。

4. 確認応答番号 (Acknowledgment Number) : 受信側が次に期待するシーケンス番号。 32 ビットのフィールド。

信頼性のあるデータ転送を実現するために使用されます。

5. データオフセット (Data Offset) : ヘッダーの長さを示すフィールド。 4 ビットのフィールド。

ヘッダーの長さを 32 ビットワード単位で示します。

6. 予約 (Reserved) : 将来の使用のために予約されているフィールド。 4 ビットのフィールド。

7. フラグ (Flags) : 制御フラグ。 9 ビットのフィールド。

TCPフラグフィールドの最初の 3 つの NS 、 CWR 、 ECE フラグは特定の状況でのみ使用されるため、一般的な説明では省略されることが多いです。

  • NS : ECN nonce を使用してデータ転送の完全性を確認します。
  • CWR : 送信側が輻輳ウィンドウサイズを減らしたことを受信側に通知します。
  • ECE : 受信側が ECN をサポートしており、輻輳状態を送信側に通知します。

  • URG : 緊急ポインタが有効であることを示します。
  • ACK : 確認応答番号が有効であることを示します。
  • PSH : データをすぐに上位層に渡すよう指示します。
  • RST : 接続をリセットします。
  • SYN : 接続の確立を開始します。
  • FIN : 接続の終了を示します。

8. ウィンドウサイズ ( Window Size ) : 受信側が受け入れることができるデータの量を示す。 16 ビットのフィールド。

フロー制御に使用されます。

9. チェックサム ( Checksum ) : ヘッダーとデータのエラーチェックを行うためのフィールド。 16 ビットのフィールド。

10. 緊急ポインタ ( Urgent Pointer ) : 緊急データの終了位置を示す。 16 ビットのフィールド。

URG フラグがセットされている場合に有効です。


ここまでが header で、全部合わせて 20 bytes です。

11. オプショナルデータ (Optional Data) : 説明の為 Option と Data を合わせたものになります。

オプション (Options)

オプション (Options) : 拡張機能を提供するための可変長フィールドです。このフィールドは必須ではなく、必要に応じて使用されます。オプションは、 TCP ヘッダーの柔軟性を高め、特定の要件に応じた追加情報を提供します。

  • NOP (No Operation) : オプションフィールドのパディングに使用されます。
  • MSS (Maximum Segment Size) : 一度に送信できる最大セグメントサイズを指定します。
  • ウィンドウスケーリング (Window Scaling) : ウィンドウサイズフィールドの拡張を可能にします。
  • SACK (Selective Acknowledgment) : 特定のデータブロックの確認を可能にします。

データ (Data)

データ (Data) : 実際のデータペイロードで、アプリケーションデータがここに含まれます。データフィールドは可変長であり、 TCP ヘッダーの後に続きます。

アプリケーション層からのデータがこのフィールドに含まれます。
データの長さは、TCPセグメントの総長さからヘッダーの長さを引いたものになります。

MTU (Maximum Transmission Unit)とは?

MTU (Maximum Transmission Unit) は、ネットワークインターフェースが一度に送信できる最大パケットサイズを指します。このサイズには IP ヘッダーと TCP ヘッダーを含むすべてのプロトコルヘッダーと実際のデータが含まれます。 MTU 値はネットワークの性能と効率に重要な影響を与えます。

MSS (Maximum Segment Size) : MTU - (IPヘッダー + TCPヘッダー)

例えば、一般的なイーサネット MTU が 1500 バイトの場合、 IP ヘッダーが 20 バイト、 TCP ヘッダーが 20 バイトであれば、 MSS は 1460 バイトになります。

GCPでの活用

Google Cloud では Packet Mirroring を使うことで実際のパケットを確認できます。

https://cloud.google.com/vpc/docs/packet-mirroring

確認方法

まず Packet Mirroring が設定されたインスタンスに接続します。

sudo apt-get update
sudo apt-get install tcpdump

tcpdump は、ネットワークインターフェースを通じて送信されるパケットをキャプチャし、分析するために使用されるコマンドラインベースのネットワークトラフィック分析ツールです。
tcpdump を使用すると、リアルタイムでネットワークトラフィックを監視したり、特定の条件に合ったパケットをフィルタリングしてキャプチャしたりすることができます。キャプチャされたパケットはファイルに保存して、後で分析することもできます。

ネットワークインターフェースの確認

ネットワークインターフェースを確認して、パケットをキャプチャするインターフェースを識別します。 ifconfig または ip addr コマンドを使用します。

ifconfig

または

ip addr

基本的なパケットキャプチャ

基本的なネットワークインターフェースからすべてのパケットをキャプチャし、リアルタイムで画面に表示します。

sudo tcpdump -i eth0

パケットをファイルに保存

キャプチャされたパケットをファイルに保存します。

sudo tcpdump -i eth0 -w capture.pcap

このコマンドは、eth0インターフェースからパケットをキャプチャし、それを capture.pcap ファイルに保存します。

capture.pcap
reading from file capture.pcap, link-type EN10MB (Ethernet)
12:34:56.789012 IP 192.168.1.1.12345 > 192.168.1.2.80: Flags [S] , seq 123456789 , win 65535 , options [mss 1460 , sackOK , TS val 123456789 ecr 0 , nop , wscale 7], length 0
12:34:56.789456 IP 192.168.1.2.80 > 192.168.1.1.12345: Flags [S.], seq 987654321 , ack 123456790 , win 65535 , options [mss 1460 , sackOK , TS valzd 987654321 ecr 123456789 , nop , wscale 7], length 0
12:34:56.789789 IP 192.168.1.1.12345 > 192.168.1.2.80: Flags [.], ack 987654322 , win 65535 , options [nop , nop , TS val 123456790 ecr 987654321], length 0

例として3つのPacketを確認することができます。

Packet を分析

一つの Packet だけを詳しく分析します。

capture.pcap
reading from file capture.pcap, link-type EN10MB (Ethernet)
12:34:56.789012 IP 192.168.1.1.12345 > 192.168.1.2.80: Flags [S], seq 123456789, win 65535, options [mss 1460,sackOK , TS val 123456789 ecr 0 , nop , wscale 7], length 0

順を追って、説明します。

2 番目の行が説明している部分です。

タイムスタンプ

位置 : 出力の最初の部分
説明 : パケットがキャプチャされた時間

capture.pcap
EOF
12:34:56.789012

プロトコル

位置 : タイムスタンプの次
説明 : 使用されたネットワークプロトコル

capture.pcap
12:34:56.789012 
IP

宛先IPおよびポート

位置 : 送信元IPおよびポートの次
説明 : パケットの宛先IPアドレスとポート番号

capture.pcap
12:34:56.789012 IP 
192.168.1.1.12345 > 192.168.1.2.80

フラグ

位置 : 宛先IPおよびポートの次、コロン(:)の後
説明 : TCPフラグ (SYNフラグ)

capture.pcap
12:34:56.789012 IP 192.168.1.1.12345 > 192.168.1.2.80: 
Flags [S]

シーケンス番号

位置 : フラグの次、カンマ(,)の後
説明 : TCPシーケンス番号

capture.pcap
12:34:56.789012 IP 192.168.1.1.12345 > 192.168.1.2.80: Flags [S], 
seq 123456789

ウィンドウサイズ

位置 : シーケンス番号の次、カンマ(,)の後
説明 : TCPウィンドウサイズ

capture.pcap
12:34:56.789012 IP 192.168.1.1.12345 > 192.168.1.2.80: Flags [S], seq 123456789, 
win 65535

オプション

位置 : ウィンドウサイズの次、カンマ(,)の後
説明 : TCPオプション (例: mss 1460 (Maximum Segment Size))

capture.pcap
12:34:56.789012 IP 192.168.1.1.12345 > 192.168.1.2.80: Flags [S], seq 123456789 , win 65535 , 
options [mss 1460 , sackOK , TS val 123456789 ecr 0 , nop , wscale 7]

長さ

位置 : オプションの次、カンマ(,)の後
説明 : TCPペイロードの長さ

capture.pcap
12:34:56.789012 IP 192.168.1.1.12345 > 192.168.1.2.80: Flags [S], seq 123456789 , win 65535 , options [mss 1460 , sackOK , TS val 123456789 ecr 0 , nop , wscale 7], 
length 0

まとめた例

再度整理すると、与えられた例のパケットで各フィールドの位置は次の通りです

capture.pcap
12:34:56.789012 IP 192.168.1.1.12345 > 192.168.1.2.80: Flags [S], seq 123456789 , win 65535 , options [mss 1460 , sackOK , TS val 123456789 ecr 0 , nop , wscale 7] , length 0

要するに クライアント(192.168.1.1)がサーバー(192.168.1.2)に TCP 接続を開始するための SYN パケットです。

まとめ

TCP は、インターネットや他のネットワークでデータ通信を行うための基盤となるプロトコルであり、その信頼性と効率性により、さまざまなアプリケーションで広く使用されています。
本記事が TCP の理解を深める一助となれば幸いです。

Discussion