TCP/IP
TCP/IPとは
TCP/IPは、インターネットを支える通信プロトコルの集合体です。データを小さなパケットに分割し、住所(IPアドレス)を頼りに相手へ届け、順序どおり組み立て直す仕組みを提供します。
注意したいのは、「TCP/IP」という単体のプロトコルは存在しないことです。TCPとIPという代表格2つの名前を借りて、数十のプロトコルからなる一族全体を指しています。「TCP/IPで通信する」と言うとき、実際に流れているのはIP・TCP・[[DNS]] などの組み合わせです。
4階層モデル
| 層 | 役割 | 代表プロトコル |
|---|---|---|
| アプリケーション層 | アプリ同士の会話 | [[HTTP]], [[DNS]], SMTP |
| トランスポート層 | 通信の信頼性・ポート番号 | TCP, UDP |
| インターネット層 | 宛先までの経路選択 | IP |
| リンク層 | 物理的な伝送 | Ethernet, Wi-Fi |
この表の肝は、上の層が下の層に仕事を任せるだけで、やり方を知らないことです。[[HTTP]] は「この内容を相手へ届けて」と頼むだけで、途中が光ファイバーかWi-Fiかを気にしません。だからこそ回線が光へ入れ替わってもブラウザを作り直さずに済みました。同じ発想を7層に分けた物差しが [[OSI参照モデル]] です。
IPは「届かなくてもよい」配送
初学者がいちばん驚くのは、土台のIPが到達を保証していないことです。IPの仕事は「宛先に向けて次のルーターへ渡す」までで、途中で混雑して捨てられても、順番が入れ替わって着いても、IPは謝りも送り直しもしません。これをベストエフォート(最善は尽くすが保証はしない)と呼びます。
では誰が保証するのか。答えは通信する両端のコンピュータです。届いたかを確認し、抜けを見つけ、足りない分を送り直すのは、途中のルーターではなく端にいるTCPの役目です。ネットワークの中心はできるだけ単純に保ち、賢さを端へ寄せる — この設計方針をエンドツーエンド原則といいます。
この割り切りがあるおかげで、用途に応じて2つの選択肢を持てます。
- TCP — 確認・再送・順序の復元を全部やる。確実さと引き換えに手続きが増える([[TCPの信頼性制御]])
- UDP — それらを一切やらない。多少欠けても構わないから今すぐ届けたい通信向け([[UDP]])
「軽いから何でもUDP」ではありません。1バイト欠けたら壊れるファイル転送にUDPを選ぶと、結局TCPがやっていた再送を自分で実装するはめになります。
初学者向けポイント
- IPアドレス = 機器の住所(例: 192.0.2.1)。ポート番号 = その機器の中の窓口(例: Webは443)
- TCP = 確実に届ける(順序保証・再送あり)。UDP = 速さ優先(動画・ゲーム向き)
- Webアクセスの実際: [[DNS]] で住所を調べる → TCPで接続(3ウェイハンドシェイク)→ [[HTTPS・TLS]] で暗号化 → [[HTTP]] で内容を要求
Webページを1枚開くまで
最後の項目を時間で追うと、層のつながりが体感できます。ブラウザに https://example.com と入れてからHTMLが届き始めるまでに起きるのは次の4段階です。
- [[DNS]] でドメイン名からIPアドレスを調べる(この問い合わせは多くの場合UDPで1往復)
- そのIPアドレス宛にTCPの接続を張る(3ウェイハンドシェイクで1往復)
- [[HTTPS・TLS]] のやり取りで暗号化の準備をする(さらに往復)
- ようやく [[HTTP]] のリクエストが流れ、HTMLが返り始める
注目したいのは、中身のデータが1バイトも流れないうちに何往復もしている点です。相手が地球の裏側なら1往復に200ミリ秒以上かかるため、3〜4往復するこの「送る前の待ち」だけで0.5秒以上が消えます。回線を太くしても縮まない種類の遅さです([[帯域と遅延]])。
トラブルシューティングの入り口
ping example.com # 相手に届くか確認
traceroute example.com # 経路のどこで詰まるか確認
curl -v https://example.com # HTTP層まで含めて確認
3つのコマンドは効く層が違います。ping は [[ICMP]] を使ってIP層まで届くかを確かめ、traceroute は経路のどこまで進めたかを見せ、curl -v はアプリ層の応答まで確認します。下の層から順に上へが切り分けの鉄則で、いきなりアプリの設定を疑うと迷子になります。手順の全体像は [[ネットワーク診断コマンド]] にあります。
次に読む地図
TCP/IPは多くのネットワーク記事の土台で、隣接する記事が多くなります。目的別に並べ直すと次の一歩を選びやすくなります。
層を下から順に埋める — 王道の読み方です。リンク層は [[イーサネット]] と、そこから決まるサイズ上限の [[MTUとフラグメンテーション]]。インターネット層は住所の [[IPアドレスとサブネット]]、経路選択の [[ルーティング]]、エラー通知の [[ICMP]]。トランスポート層は [[TCPの信頼性制御]] と [[UDP]]、アプリを区別する [[ポート番号]] です。
アドレスと経路をもう一段深く — 規模が大きくなると出てくる話題です。IPv4枯渇に答える [[IPv6]] と、ルーター同士が経路を自動交換する [[ルーティングプロトコル(OSPF・BGP)]] です。
上に乗るアプリのプロトコルを知る — 同じTCP/IPの上で、用途ごとに別のプロトコルが動いています。Webの [[HTTP]] とその暗号化 [[HTTPS・TLS]]、名前解決の [[DNS]]、[[メールの仕組み(SMTP・POP3・IMAP)]]、ファイル転送の [[FTP]]、接続を張りっぱなしにする [[WebSocket]]。「どのポートを使い、TCPとUDPのどちらに乗るか」を意識して読むと層の関係が掴めます。
自分のプログラムから通信する — アプリ開発者がTCP/IPに直接触れる窓口が [[ソケット通信]] です。ライブラリの下で何が起きているか知りたくなったらここへ。
通り道に立つものを理解する — 通信はまっすぐ届くとは限りません。IPアドレス・ポート番号・プロトコルの3点でルールを書く [[ファイアウォール]] は、TCP/IPの語彙がそのまま設定項目になる典型例です。
「つながらない」「遅い」を調べる — 入口が [[ネットワーク診断コマンド]]、それで足りないときの精密検査が [[パケットキャプチャ]]、速さの正体を「太さ」と「近さ」に分けるのが [[帯域と遅延]] です。相談するときは [[OSI参照モデル]] の層番号で話すと早いです。
関連技術とのつながり
- [[HTTP]] — TCP/IPの上で動く代表的なプロトコル
- [[DNS]] — ドメイン名をIPアドレスへ変換する
- [[HTTPS・TLS]] — TCPとHTTPの間に入る暗号化層
Q: 「TCP/IP」という呼び方の説明として正しいのはどれ?
- [ ] TCPとIPを合体させて作られた単体のプロトコルの名前
- [x] TCPとIPという代表格の名前を借りて、数十のプロトコルからなる一族全体を指す呼び方
- [ ] TCPの後継として新しく作られたプロトコルの名前
解説: TCP/IPという1本のプロトコルがあるわけではありません。実際に流れているのはIP・TCP・DNSなど複数のプロトコルの組み合わせです。
Q: IPが担う保証について正しいのはどれ?
- [ ] IPが到達も順序も保証するため、上位のプロトコルは何もしなくてよい
- [ ] 経路上のルーターが1台ずつ再送を行って到達を保証している
- [x] IPは到達も順序も保証せず、確認と再送は通信する両端のTCPが担う
解説: IPはベストエフォートの配送です。賢さを端へ寄せるエンドツーエンド原則により、確認・再送・順序の復元は端末側のTCPが引き受けます。
Q: Webページを開くとき、HTMLが流れ始める前に時間を消費する要因として本文が挙げているのはどれ?
- [x] DNSの名前解決・TCPの接続確立・TLSの準備で何往復も発生すること
- [ ] HTMLファイルの容量が必ず非常に大きいこと
- [ ] ブラウザが利用者にIPアドレスを手入力させること
解説: 中身のデータが1バイトも流れないうちに複数回の往復が起きます。相手が遠いほど1往復の時間が伸び、回線を太くしても縮まない遅さになります。