TCP/IP通信
TCP/IPプロトコルスタックとコネクション管理の仕組み
OSI参照モデル
| 層 | Name | 日本語名 | プロトコル例 |
|---|---|---|---|
| 7 | Application | アプリケーション層 | HTTP, HTTPS, FTP, SMTP, DNS |
| 6 | Presentation | プレゼンテーション層 | SSL/TLS, JPEG, MPEG |
| 5 | Session | セッション層 | NetBIOS, RPC |
| 4 | Transport | トランスポート層 | TCP, UDP |
| 3 | Network | ネットワーク層 | IP, ICMP, ARP |
| 2 | Data Link | データリンク層 | Ethernet, PPP |
| 1 | Physical | 物理層 | Ethernet cable, Wi-Fi |
HTTPは第7層(アプリケーション層)で動作し、TCPは第4層(トランスポート層)で信頼性のある通信を提供します。
TCP 3ウェイハンドシェイク
TCP接続を確立するための3段階のプロセスです。両端が通信可能であることを確認し、初期シーケンス番号を交換します。
Client
SYNSeq=1000
→
←
SYN+ACKSeq=5000, Ack=1001
ACKAck=5001
→
Server
ハンドシェイクの各ステップ
| Step | 方向 | フラグ | 説明 |
|---|---|---|---|
| 1 | Client → Server | SYN | クライアントが接続要求。初期シーケンス番号(ISN)を送信 |
| 2 | Server → Client | SYN + ACK | サーバーが接続承認。自身のISNを送信し、クライアントのISN+1を確認 |
| 3 | Client → Server | ACK | クライアントがサーバーのISN+1を確認。接続確立 |
TCPフラグ
| フラグ | 正式名称 | 説明 |
|---|---|---|
| SYN | Synchronize | 接続開始要求。3ウェイハンドシェイクの開始 |
| ACK | Acknowledgment | 受信確認。データ受信を送信者に通知 |
| FIN | Finish | 接続終了要求。データ送信完了を通知 |
| RST | Reset | 接続強制切断。異常時に使用 |
| PSH | Push | バッファリングせず即座にデータを渡す |
| URG | Urgent | 緊急データの存在を示す |
シーケンス番号とACK番号
Seq(シーケンス番号)
送信するデータの最初のバイトの位置を示します。 初期値(ISN: Initial Sequence Number)はランダムに生成され、データ送信ごとにバイト数分増加します。
Ack(確認応答番号)
次に受信を期待するバイトの位置を示します。 「ここまで受け取った」という確認であり、相手のSeq番号 + 受信バイト数 となります。
計算例
Client ISN: 1000
Server ISN: 5000
1. Client → Server: SYN, Seq=1000
2. Server → Client: SYN+ACK, Seq=5000, Ack=1001 (1000+1)
3. Client → Server: ACK, Seq=1001, Ack=5001 (5000+1)
データ送信時:
Client sends 100 bytes: Seq=1001
Server responds: Ack=1101 (1001+100)TCP 4ウェイクローズ
TCP接続を終了するための4段階のプロセスです。双方向の通信を個別に終了します。
| Step | 方向 | フラグ | 説明 |
|---|---|---|---|
| 1 | Client → Server | FIN + ACK | クライアントが接続終了を要求 |
| 2 | Server → Client | ACK | サーバーがFINを確認 |
| 3 | Server → Client | FIN + ACK | サーバーも接続終了を要求 |
| 4 | Client → Server | ACK | クライアントがFINを確認。接続終了 |
TIME_WAIT状態
接続終了後、クライアントは約2分間(2MSL)TIME_WAIT状態を維持します。 これは遅延パケットの処理と、相手のFINの再送に対応するためです。