新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
オプション説明
-tTCPソケットを表示
-nアドレスやポート番号を数値で表示
-aLISTEN状態を含めて全て表示

使用例

[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名前解決を行わずに数値で表示
-tTCP接続のみを表示

使用例

[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の違い

項目TCPUDP
通信方式コネクション型コネクションレス型
信頼性高い(再送・順序制御あり)低い(再送なし)
速度やや遅い(確認応答が必要)高速(応答不要)
使用例Web、メール、SSHDNS、動画ストリーミング、VoIP

💬ポイント
 TCPは「確実に届ける」ことを重視し、UDPは「速さ」を重視します。用途によって使い分けることが大切です。

🔐 TCPのセキュリティ上の注意点

TCPは便利で信頼性が高い一方で、セキュリティ上の脆弱性を狙われることもあります。

攻撃手法内容
SYNフラッド攻撃ハンドシェイクの途中で接続を大量に開始し、サーバ資源を圧迫する攻撃
セッションハイジャック既存のTCPセッションを乗っ取る攻撃
ポートスキャン開いているTCPポートを探索する攻撃

💬ポイント
 ファイアウォール(firewalld)や iptables などで不要なポートを閉じておくことが、基本的な防御策です。

🌈 まとめ

  • TCPは、信頼性と順序性を保証する通信プロトコル。
  • 3ウェイハンドシェイクで接続を確立し、4ウェイハンドシェイクで安全に終了。
  • 再送制御・フロー制御・誤り検出などにより高信頼通信を実現。
  • UDPと比較して遅いが、確実な通信が求められるWebやメールでは不可欠。

 TCPの仕組みを理解すると、ネットワークトラブルの原因特定やサーバチューニングの基礎もぐっとわかりやすくなります。