
新Linux入門|TCPとは:信頼性通信を支える3ウェイハンドシェイクとデータ転送の仕組み
今回のテーマは、インターネット通信の“心臓”ともいえる TCP(Transmission Control Protocol) です。
みなさんがWebページを開いたり、メールを送受信したりするとき、その裏ではTCPが黙々とデータを正しく届ける仕事をしています。
ここでは、TCPの基本的な仕組みから、3ウェイハンドシェイクによる接続確立の流れ、そしてデータ転送の信頼性を支える仕組みまで、やさしく解説します。

🚀 TCPの基本概念
TCPは 「コネクション指向型のプロトコル」 です。
通信を行う前に相手との“接続”を確立し、その後にデータを送受信します。これにより、通信中のパケットが欠落したり順序が入れ替わっても、正しく再構築できるようになっています。

| 項目 | 内容 |
|---|---|
| プロトコル名 | TCP(Transmission Control Protocol) |
| 特徴 | コネクション指向・信頼性・順序制御・フロー制御 |
| 使用例 | Web(HTTP/HTTPS)、メール(SMTP/POP3/IMAP)など |
| 通信単位 | セグメント |
| 利用ポート範囲 | 0〜65535(Well-known: 0–1023) |
💬ポイント
TCPは、通信前に「ハンドシェイク(握手)」を行い、送信側と受信側が“お互いに準備できている”ことを確認してからデータを送ります。
🧩 TCPヘッダーの構造
TCPでは、データは「セグメント」という単位で送受信されます。
セグメントの先頭には「TCPヘッダー」があり、通信を制御するための重要な情報が格納されています。
| フィールド名 | 説明 |
|---|---|
| 送信元ポート番号 | 通信を開始したアプリケーションを特定 |
| 宛先ポート番号 | 受信アプリケーションを特定 |
| シーケンス番号 | データの順序を識別する番号 |
| ACK番号 | 受信確認(Acknowledgment)を表す番号 |
| フラグ(SYN/ACK/FIN) | 通信状態を表す制御ビット |
| ウィンドウサイズ | フロー制御に使用される受信可能バッファ量 |
| チェックサム | データの誤り検出に使用 |
| オプション | 最大セグメントサイズ(MSS)などの拡張情報 |
💬ポイント
これらの情報があることで、TCPは信頼性を高く保ち、パケット損失や順序入れ替えにも対応できるのです。
🔁 3ウェイハンドシェイクとは
TCP接続を確立する際には、3ウェイハンドシェイク(3-way handshake) と呼ばれる3段階のやり取りを行います。
| 手順 | 送信側の動作 | 受信側の動作 | フラグ |
|---|---|---|---|
| ① SYN | 接続要求を送信 | 受信待ち | SYN |
| ② SYN-ACK | 接続要求を受理し、応答を返す | 応答を送信 | SYN + ACK |
| ③ ACK | 受信確認を返し、通信開始 | 接続確立 | ACK |
💬ポイント
この3回のやり取りにより、送信側・受信側の双方が“お互いに通信できる状態”であることを確認してからデータのやり取りを始めます。
図で見る3ウェイハンドシェイク

📤 データ転送と信頼性
TCPは、データを「確実に」「順序通りに」届けるための仕組みを持っています。
主な機能
| 機能 | 説明 |
|---|---|
| 順序制御 | シーケンス番号でパケット順を管理し、正しく再構築 |
| 再送制御 | ACK応答がない場合、自動的に再送 |
| 誤り検出 | チェックサムで通信中のデータ破損を検出 |
| フロー制御 | 受信側の処理能力に合わせて送信速度を調整 |
| 輻輳制御 | ネットワークの混雑状況を検知し、送信量を制限 |
💡ポイント
これらの機能により、TCPは「信頼性が求められる通信」(たとえばウェブ閲覧やメール)に最適化されています。
⚙️ TCP接続の終了(4ウェイハンドシェイク)
通信を終えるときは、TCPは「4ウェイハンドシェイク(4-way handshake)」によって双方が接続終了を確認します。
| 手順 | 送信側の動作 | 受信側の動作 | フラグ |
|---|---|---|---|
| ① FIN | データ送信終了を通知 | 受理 | FIN |
| ② ACK | 終了要求を確認 | 応答 | ACK |
| ③ FIN | 受信側も終了要求 | 応答 | FIN |
| ④ ACK | 受信確認で完了 | 接続終了 | ACK |
💬ポイント
これにより、送信・受信の両方が「もう通信するデータはない」ことを確認して安全に接続を切断します。
🔍 TCP通信を確認するコマンド(AlmaLinux 9.6)
TCP接続の状態を確認したり、疎通をチェックするには、次のコマンドを使用します。
➀ ssコマンド(socket statistics)
ss -tna| オプション | 説明 |
|---|---|
| -t | TCPソケットを表示 |
| -n | アドレスやポート番号を数値で表示 |
| -a | LISTEN状態を含めて全て表示 |
使用例
[suzuki@AlmaLinux ~]$ ss -tna
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:631 0.0.0.0:*
ESTAB 0 0 10.0.2.15:40884 35.190.72.216:443
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 4096 [::1]:631 [::]:*💬ポイント
この出力から、SSHポート(22)がLISTEN状態にあり、192.168.1.100との接続が確立されていることが分かります。
② netstatコマンド(旧ツール)
netstat -ant| オプション | 説明 |
|---|---|
| -a | 全てのソケットを表示 |
| -n | 名前解決を行わずに数値で表示 |
| -t | TCP接続のみを表示 |
使用例
[suzuki@AlmaLinux ~]$ netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 10.0.2.15:40884 35.190.72.216:443 ESTABLISHED
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:631 :::* LISTEN💬ポイント
ESTABLISHED 状態が、TCP通信が確立済みであることを示しています。
③ pingコマンド(ICMP通信)
TCPではありませんが、接続先ホストの応答確認に便利です。
ping 192.168.1.100| オプション | 説明 |
|---|---|
| -c 回数 | 指定した回数だけ送信 |
| -i 秒数 | 送信間隔を指定 |
使用例
[suzuki@AlmaLinux ~]$ ping -c 4 192.168.1.100
PING 192.168.1.100 (192.168.1.100) 56(84) bytes of data.
64 bytes from 192.168.1.100: icmp_seq=1 ttl=64 time=0.427 ms
64 bytes from 192.168.1.100: icmp_seq=2 ttl=64 time=0.321 ms
--- 192.168.1.100 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3050ms💬ポイント
pingの応答が返ってくれば、ネットワーク上でTCP接続が行える可能性が高いことを示します。
⚔️ TCPとUDPの違い
| 項目 | TCP | UDP |
|---|---|---|
| 通信方式 | コネクション型 | コネクションレス型 |
| 信頼性 | 高い(再送・順序制御あり) | 低い(再送なし) |
| 速度 | やや遅い(確認応答が必要) | 高速(応答不要) |
| 使用例 | Web、メール、SSH | DNS、動画ストリーミング、VoIP |
💬ポイント
TCPは「確実に届ける」ことを重視し、UDPは「速さ」を重視します。用途によって使い分けることが大切です。
🔐 TCPのセキュリティ上の注意点
TCPは便利で信頼性が高い一方で、セキュリティ上の脆弱性を狙われることもあります。
| 攻撃手法 | 内容 |
|---|---|
| SYNフラッド攻撃 | ハンドシェイクの途中で接続を大量に開始し、サーバ資源を圧迫する攻撃 |
| セッションハイジャック | 既存のTCPセッションを乗っ取る攻撃 |
| ポートスキャン | 開いているTCPポートを探索する攻撃 |
💬ポイント
ファイアウォール(firewalld)や iptables などで不要なポートを閉じておくことが、基本的な防御策です。
🌈 まとめ
- TCPは、信頼性と順序性を保証する通信プロトコル。
- 3ウェイハンドシェイクで接続を確立し、4ウェイハンドシェイクで安全に終了。
- 再送制御・フロー制御・誤り検出などにより高信頼通信を実現。
- UDPと比較して遅いが、確実な通信が求められるWebやメールでは不可欠。
TCPの仕組みを理解すると、ネットワークトラブルの原因特定やサーバチューニングの基礎もぐっとわかりやすくなります。
