2026年9月8日
2026年9月8日
TCP/IPの基本概念とIPアドレス体系をサーバー運用目線で解説
TCP/IPは「宛先を決めて届けるIP」と「届いたデータを正しくアプリに渡すTCP/UDP」の組み合わせで、Webサイトの通信はすべてこの上で動いています。この記事では、4つの階層の役割、TCPとUDPの違い、IPv4/IPv6のアドレス体系(プライベート・グローバル・特殊用途)を整理し、WordPressサーバーで「つながらない」ときにどの層を疑えばよいか判断できるようになることを目指します。
TCP/IPの4階層と、それぞれの役割
TCP/IPは通信の仕事を4つの層に分けて考えます。層ごとに責任範囲が決まっているので、トラブル時に「どこまでは正常か」を切り分けやすくなります。
- アプリケーション層:HTTP、HTTPS(HTTP over TLS)、DNS、SMTP、SSH など、アプリが話す約束事です。WordPressのページ表示はHTTP、メール送信はSMTPがこの層にあたります。
- トランスポート層:TCPとUDPです。ポート番号で「サーバー上のどのプログラム宛てか」を区別します。Webサーバーは通常TCP 80番と443番で待ち受けます。
- インターネット層:IP(IPv4/IPv6)とICMPです。IPアドレスで「どのホスト宛てか」を決め、ルーターを経由して目的地まで運びます。ping が使うのはこの層のICMPです。
- リンク層(ネットワークインターフェース層):Ethernetや無線LANなど、隣の機器までフレームを届ける部分です。MACアドレスはここで使われます。
よく比較されるOSI参照モデルは7層ですが、実務ではTCP/IPの4層で考えたほうが実際のプロトコルと対応づけやすいです。「L4ロードバランサー」「L7のWAF」のように、OSIの層番号が用語として使われる場面だけ覚えておけば困りません。
ブラウザからWordPressが表示されるまで
ひとつのページ表示を層の動きで追うと、各要素の関係が見えてきます。
- ブラウザがドメイン名をIPアドレスに変換するため、DNSリゾルバーに問い合わせます(DNSは主にUDP 53番、応答が大きい場合などはTCP 53番)。
- 得られたIPアドレスの443番ポートへ、TCPの3ウェイハンドシェイク(SYN → SYN/ACK → ACK)で接続を確立します。
- TCPの上でTLSのハンドシェイクを行い、暗号化された通信路を作ります。
- HTTPリクエストを送り、Webサーバー(nginx や Apache)がPHP経由でWordPressを実行して応答を返します。
なお、HTTP/3はTCPではなくUDP上のQUICを使います。HTTP/3を有効にしたサーバーではUDP 443番も開けておく必要がある、という点はファイアウォール設定でつまずきやすいところです。
この流れを知っていると、症状から層を推測できます。「ドメインでは開けないがIPアドレス直指定なら届く」ならDNS、「pingは通るがブラウザで接続できない」ならTCPポートかファイアウォール、「接続はできるが500エラー」ならアプリケーション層(PHPやWordPress側)、という具合です。
TCPとUDPの違い
TCPは接続を確立してから通信し、届かなかったデータの再送、順序の並べ替え、送信量の調整(フロー制御・輻輳制御)を行います。Webページやファイル転送のように「欠けると困る」通信に向いています。その代わり、接続確立の往復や再送待ちのぶん遅延が増えます。
UDPは接続を作らず、データグラムを送りっぱなしにします。再送も順序保証もしないため軽量で、DNSの問い合わせ、時刻同期(NTP)、音声・映像のストリーミングなどに使われます。信頼性が必要な場合はアプリ側(QUICなど)で補います。
ポート番号は0〜65535の範囲で、0〜1023がウェルノウンポート、1024〜49151が登録済みポート、49152〜65535が動的・プライベートポートとIANAが区分しています。クライアント側の送信元ポートは、OSが一時的なポートを自動で割り当てます。
IPv4アドレスの仕組み
IPv4アドレスは32ビットの数値で、8ビットずつ4つに区切って 203.0.113.10 のように10進数で書きます。アドレスは「ネットワーク部」と「ホスト部」に分かれ、その境目をサブネットマスク(255.255.255.0)またはCIDR表記(/24)で示します。
かつてはクラスA・B・Cという固定の区切りが使われていましたが、現在はCIDRで任意の長さに区切るのが前提です。「192.168で始まるからクラスC」という覚え方は、今の設定作業ではほとんど役に立ちません。
用途が決められている主なIPv4アドレス
| 範囲 | 用途 |
|---|---|
| 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 | プライベートアドレス(RFC 1918)。LAN・VPC内で使う |
| 100.64.0.0/10 | キャリアグレードNAT(CGNAT)用の共有アドレス |
| 127.0.0.0/8 | ループバック(自分自身) |
| 169.254.0.0/16 | リンクローカル。DHCPで取得できないときに自動で付くことがある |
| 192.0.2.0/24、198.51.100.0/24、203.0.113.0/24 | ドキュメント・説明用。この記事の例もこの範囲 |
プライベートアドレスはインターネット上では経路が流れないため、外部と通信するときはルーターやクラウドのNATがグローバルアドレスに変換します。VPSでWordPressを動かす場合、OSのネットワーク設定にはプライベートアドレスしか見えず、公開IPはクラウド側で割り当てられている構成もあります。「サーバーで ip addr を見ても公開IPが無い」のは、こうした構成ではよくあることです。
172.16.0.0/12 は172.16.0.0〜172.31.255.255と範囲が広く、Dockerの既定ネットワークもこの中から割り当てられます。社内ネットワークやVPNと重なると通信できなくなるため、重複しない範囲を選ぶのが安全です。
IPv6アドレスの仕組み
IPv6は128ビットで、16ビットずつ8つに区切り16進数で書きます(例: 2001:db8::10)。連続する0のブロックは :: で1回だけ省略できます。2001:db8::/32 もドキュメント用の範囲です。
::1:ループバックfe80::/10:リンクローカル。インターフェースごとに自動で付きますfc00::/7(実際の利用はfd00::/8):ユニークローカルアドレス。IPv4のプライベートアドレスに近い位置づけです2000::/3:グローバルユニキャスト。インターネットで使うアドレス
IPv6では一般にLANひとつに /64 を割り当て、NATを使わずに各機器がグローバルアドレスを持つ設計が基本です。そのぶん、ファイアウォールで受け付ける通信を絞ることが重要になります。IPv4だけ許可設定をしてIPv6は全開放、という状態にならないよう、ufw や nftables のルールが両方に効いているか確認してください。
家庭向け・モバイル回線ではIPv6で接続する利用者が増えています(2026年10月現在)。DNSにAAAAレコードを登録しているのに、サーバー側でIPv6の待ち受けやファイアウォールが整っていないと、IPv6環境の利用者だけ接続が遅い・つながらないという分かりにくい障害になります。
自分のサーバーで確認するコマンド
Linuxサーバーでは、次のコマンドで各層の状態を順に確かめられます。
# インターフェースとIPアドレス(リンク層・インターネット層)
ip addr show
# ルーティングテーブル(既定の出口 = default via ...)
ip route show
ip -6 route show
# 待ち受けているTCP/UDPポートとプロセス(トランスポート層)
sudo ss -tulpn
# 名前解決からHTTP応答まで(アプリケーション層)
curl -sv -o /dev/null https://example.com/ 2>&1 | grep -E "Trying|Connected|HTTP/"
ss -tulpn で 0.0.0.0:443 や [::]:443 が表示されていれば、IPv4・IPv6の全アドレスで待ち受けています。127.0.0.1:3306 のようにループバックだけで待ち受けているのは、MySQLを外部に公開しない設定として正常な状態です。
curl -v の出力では、どのIPアドレスに接続を試みたか(Trying)、TCP接続が成立したか(Connected)、HTTPのステータスは何か、を順に読めます。どの行で止まるかによって、原因の層を絞り込めます。
まとめ
- TCP/IPはアプリケーション層・トランスポート層・インターネット層・リンク層の4層で考えると、障害の切り分けがしやすくなります。
- TCPは信頼性重視、UDPは軽さ重視。HTTP/3はUDP上のQUICを使うため、UDP 443番の扱いに注意が要ります。
- IPv4は32ビット、IPv6は128ビット。プライベート・ループバック・ドキュメント用など、用途が決まった範囲を覚えておくと設定ミスに気づきやすくなります。
- CIDRで区切るのが現在の前提で、クラスによる区分は過去のものです。
ip addr、ip route、ss、curl -vで、層ごとに状態を確認できます。