ネットワーク基礎 - TCP/IP・DNS・HTTPSの仕組みをまとめて理解する
ネットワーク通信の基盤であるTCP/IPモデル、IPアドレス、DNS、HTTPS等の仕組みと、実務で使う診断コマンドをまとめる。
ネットワークモデル
OSI参照モデルとTCP/IPモデルの対応
OSI参照モデル(7層)は通信プロトコルを理論的に分類する参照モデル。TCP/IPモデル(4層)は実際のインターネット通信で使われる実装寄りのモデル。
| OSI参照モデル | 層番号 | TCP/IPモデル | 主なプロトコル・技術 |
|---|---|---|---|
| アプリケーション層 | 7 | アプリケーション層 | HTTP, HTTPS, FTP, SMTP, DNS, SSH |
| プレゼンテーション層 | 6 | アプリケーション層 | TLS/SSL, MIME, JPEG, ASCII |
| セッション層 | 5 | アプリケーション層 | NetBIOS, RPC |
| トランスポート層 | 4 | トランスポート層 | TCP, UDP |
| ネットワーク層 | 3 | インターネット層 | IP, ICMP, ARP |
| データリンク層 | 2 | ネットワークインターフェース層 | Ethernet, Wi-Fi (802.11), PPP |
| 物理層 | 1 | ネットワークインターフェース層 | 電気信号, 光ファイバー, 無線 |
データのカプセル化
データは送信時に上位層から下位層へ向かってヘッダーが付加(カプセル化)され、受信時に逆方向でヘッダーが除去される。
flowchart TD
A["アプリケーション層<br/>データ"] --> B["トランスポート層<br/>TCPヘッダー + データ(セグメント)"]
B --> C["インターネット層<br/>IPヘッダー + セグメント(パケット)"]
C --> D["ネットワークインターフェース層<br/>フレームヘッダー + パケット + FCS(フレーム)"]
IPアドレス
IPv4
32ビットのアドレス。ドット区切りの10進数(オクテット表記)で表す。
192.168.1.100
アドレスクラス(クラスフル):
| クラス | 先頭ビット | アドレス範囲 | 用途 |
|---|---|---|---|
| A | 0 | 0.0.0.0 〜 127.255.255.255 | 大規模ネットワーク |
| B | 10 | 128.0.0.0 〜 191.255.255.255 | 中規模ネットワーク |
| C | 110 | 192.0.0.0 〜 223.255.255.255 | 小規模ネットワーク |
| D | 1110 | 224.0.0.0 〜 239.255.255.255 | マルチキャスト |
| E | 1111 | 240.0.0.0 〜 255.255.255.255 | 予約(実験用) |
プライベートIPアドレス(RFC 1918):
| クラス | 範囲 | CIDR表記 |
|---|---|---|
| A | 10.0.0.0 〜 10.255.255.255 | 10.0.0.0/8 |
| B | 172.16.0.0 〜 172.31.255.255 | 172.16.0.0/12 |
| C | 192.168.0.0 〜 192.168.255.255 | 192.168.0.0/16 |
CIDR(Classless Inter-Domain Routing)
クラスに依存しない柔軟なサブネット分割。/ の後ろの数値はネットワーク部のビット数を示す。
192.168.1.0/24
ネットワーク部: 上位24ビット → 192.168.1
ホスト部: 下位8ビット → 0〜255(256個)
使用可能ホスト: 254個(ネットワークアドレスとブロードキャストを除く)
サブネットマスク: 255.255.255.0
CIDR表記とホスト数の対応:
| CIDR | サブネットマスク | ホスト数 |
|---|---|---|
| /32 | 255.255.255.255 | 1(単一ホスト) |
| /28 | 255.255.255.240 | 14 |
| /24 | 255.255.255.0 | 254 |
| /16 | 255.255.0.0 | 65,534 |
| /8 | 255.0.0.0 | 16,777,214 |
IPv6
128ビットのアドレス。コロン区切りの16進数で表す。IPv4のアドレス枯渇問題を解決するために設計された。
2001:0db8:85a3:0000:0000:8a2e:0370:7334
省略形:
2001:db8:85a3::8a2e:370:7334
省略ルール:
- 各グループの先頭の0は省略可能(
0db8→db8) - 連続する
0000グループは::で1回だけ省略可能
特殊なIPv6アドレス:
| アドレス | 用途 |
|---|---|
::1 | ループバック(IPv4の127.0.0.1相当) |
:: | 未指定アドレス(IPv4の0.0.0.0相当) |
fe80::/10 | リンクローカルアドレス |
2001:db8::/32 | ドキュメント用(例示用) |
TCP と UDP
比較
| 特性 | TCP | UDP |
|---|---|---|
| 接続 | コネクション型 | コネクションレス型 |
| 信頼性 | あり(再送制御、順序保証) | なし |
| 速度 | 低い(オーバーヘッドあり) | 高い(オーバーヘッド少) |
| ヘッダーサイズ | 20〜60バイト | 8バイト |
| フロー制御 | あり | なし |
| 用途 | HTTP, HTTPS, FTP, SMTP, SSH | DNS, DHCP, NTP, VoIP, 動画ストリーミング |
TCP 3ウェイハンドシェイク
TCPで通信を開始する際、クライアントとサーバー間で3回のやり取り(SYN → SYN-ACK → ACK)を行い、コネクションを確立する。
sequenceDiagram
participant C as クライアント
participant S as サーバー
Note over C: CLOSED
Note over S: LISTEN
C->>S: SYN (seq=x)
Note over C: SYN_SENT
S->>C: SYN-ACK (seq=y, ack=x+1)
Note over S: SYN_RECEIVED
C->>S: ACK (ack=y+1)
Note over C: ESTABLISHED
Note over S: ESTABLISHED
C->>S: データ送信開始
TCP コネクション切断(4ウェイハンドシェイク)
sequenceDiagram
participant C as クライアント
participant S as サーバー
C->>S: FIN
Note over C: FIN_WAIT_1
S->>C: ACK
Note over C: FIN_WAIT_2
Note over S: CLOSE_WAIT
S->>C: FIN
Note over S: LAST_ACK
C->>S: ACK
Note over C: TIME_WAIT
Note over S: CLOSED
ポート番号
ポート番号は0〜65535の範囲で、トランスポート層でアプリケーションを識別するために使用する。
ウェルノウンポート(0〜1023)
| ポート | プロトコル | 用途 |
|---|---|---|
| 20 | TCP | FTP(データ転送) |
| 21 | TCP | FTP(制御) |
| 22 | TCP | SSH |
| 23 | TCP | Telnet |
| 25 | TCP | SMTP(メール送信) |
| 53 | TCP/UDP | DNS |
| 67/68 | UDP | DHCP |
| 80 | TCP | HTTP |
| 110 | TCP | POP3 |
| 123 | UDP | NTP |
| 143 | TCP | IMAP |
| 443 | TCP | HTTPS |
| 465 | TCP | SMTPS |
| 587 | TCP | SMTP(サブミッション) |
| 993 | TCP | IMAPS |
| 995 | TCP | POP3S |
ポート番号の分類
| 範囲 | 分類 | 説明 |
|---|---|---|
| 0〜1023 | ウェルノウンポート | 標準サービス用(root権限が必要) |
| 1024〜49151 | 登録済みポート | IANAに登録されたアプリケーション用 |
| 49152〜65535 | 動的/プライベートポート | クライアント側で一時的に使用 |
DNS(Domain Name System)
名前解決の仕組み
DNSはドメイン名(example.com)をIPアドレス(93.184.216.34)に変換する分散データベースシステム。
sequenceDiagram
participant U as ユーザーの端末
participant R as リゾルバ(キャッシュDNS)
participant Root as ルートDNSサーバー
participant TLD as TLDサーバー(.com)
participant Auth as 権威DNSサーバー(example.com)
U->>R: example.com のIPは?
Note over R: キャッシュ確認 → なし
R->>Root: example.com のIPは?
Root->>R: .com は TLDサーバーへ
R->>TLD: example.com のIPは?
TLD->>R: example.com は権威サーバーへ
R->>Auth: example.com のIPは?
Auth->>R: 93.184.216.34
R->>U: 93.184.216.34
Note over R: 結果をキャッシュ(TTLまで保持)
DNSレコードタイプ
| レコード | 説明 | 例 |
|---|---|---|
| A | ドメイン → IPv4アドレス | example.com → 93.184.216.34 |
| AAAA | ドメイン → IPv6アドレス | example.com → 2606:2800:220:1:... |
| CNAME | ドメインの別名(エイリアス) | www.example.com → example.com |
| MX | メールサーバーの指定 | example.com → mail.example.com (優先度10) |
| TXT | テキスト情報(SPF, DKIM等) | "v=spf1 include:_spf.google.com ~all" |
| NS | 権威DNSサーバーの指定 | example.com → ns1.example.com |
| SOA | ゾーンの管理情報(シリアル番号, TTL等) | ゾーンの開始レコード |
| PTR | IPアドレス → ドメイン(逆引き) | 34.216.184.93 → example.com |
| SRV | サービスの場所(ホスト+ポート) | _sip._tcp.example.com → sip.example.com:5060 |
| CAA | SSL証明書の発行許可CA指定 | example.com → letsencrypt.org |
DNSキャッシュとTTL
DNSレコードには TTL(Time To Live) が設定されており、リゾルバはTTLの間レコードをキャッシュする。TTLが短いほど変更が速く反映されるが、DNSクエリの頻度が増加する。
# TTLの確認(digコマンド)
dig example.com
;; ANSWER SECTION:
;; example.com. 3600 IN A 93.184.216.34
;; ↑ TTL(秒)= 1時間
HTTP/HTTPS
HTTPの基本構造
# リクエスト
GET /index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html
# レスポンス
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
<html>...</html>
HTTPメソッド
| メソッド | 用途 | 冪等性 | 安全性 |
|---|---|---|---|
| GET | リソースの取得 | あり | あり |
| POST | リソースの作成 | なし | なし |
| PUT | リソースの更新(全体) | あり | なし |
| PATCH | リソースの部分更新 | なし | なし |
| DELETE | リソースの削除 | あり | なし |
| HEAD | ヘッダーのみ取得 | あり | あり |
| OPTIONS | 利用可能なメソッドの確認 | あり | あり |
HTTPS と TLSハンドシェイク
HTTPS = HTTP over TLS。TLS(Transport Layer Security)によって通信を暗号化する。
TLS 1.3 ハンドシェイク(1-RTTで完了):
sequenceDiagram
participant C as クライアント
participant S as サーバー
C->>S: ClientHello(対応暗号スイート, 鍵共有パラメータ)
S->>C: ServerHello(選択した暗号スイート, 鍵共有パラメータ)
S->>C: サーバー証明書 + 署名
S->>C: Finished
Note over C: 証明書の検証
C->>S: Finished
Note over C,S: 暗号化通信開始(アプリケーションデータ)
C->>S: 暗号化されたHTTPリクエスト
S->>C: 暗号化されたHTTPレスポンス
TLS 1.2 と 1.3 の主な違い:
| 項目 | TLS 1.2 | TLS 1.3 |
|---|---|---|
| ハンドシェイク | 2-RTT | 1-RTT(0-RTTも可) |
| 鍵交換 | RSA, DHE, ECDHE | ECDHE, DHEのみ(RSA廃止) |
| 暗号スイート | 多数(脆弱なものも含む) | 5種類に厳選 |
| 前方秘匿性 | オプション | 必須 |
証明書チェーン
HTTPS通信ではサーバー証明書の信頼性を 証明書チェーン で検証する。
flowchart TD
A["ルート認証局(CA)<br/>ブラウザに事前搭載"] --> B["中間認証局<br/>ルートCAが署名"]
B --> C["サーバー証明書<br/>中間CAが署名"]
C --> D["Webサーバー<br/>example.com"]
ファイアウォール
ネットワーク間の通信を監視・制御し、許可されたトラフィックのみを通過させるセキュリティ機構。
フィルタリングの種類
| 種類 | 動作レイヤー | 特徴 |
|---|---|---|
| パケットフィルタリング | L3-L4 | IPアドレス・ポート番号で制御。高速だが内容は検査しない |
| ステートフルインスペクション | L3-L4 | 通信の状態(コネクション)を追跡して制御 |
| アプリケーションゲートウェイ | L7 | HTTP等のアプリケーションプロトコルの内容を検査 |
| WAF | L7 | Webアプリケーション特化。SQLインジェクション等を検知 |
iptables の基本ルール例
# すべての受信をデフォルトで拒否
iptables -P INPUT DROP
# ループバックを許可
iptables -A INPUT -i lo -j ACCEPT
# 確立済みコネクションを許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# SSH(22番ポート)を許可
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# HTTP/HTTPSを許可
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# ICMPを許可(ping)
iptables -A INPUT -p icmp -j ACCEPT
NAT(Network Address Translation)
プライベートIPアドレスとグローバルIPアドレスを変換する技術。1つのグローバルIPで複数のホストがインターネットにアクセスできる。
flowchart LR
A["端末A<br/>192.168.1.10"] --> R["ルーター(NAT)<br/>内側: 192.168.1.1<br/>外側: 203.0.113.1"]
B["端末B<br/>192.168.1.20"] --> R
R --> I["インターネット"]
NATの種類
| 種類 | 説明 |
|---|---|
| 静的NAT | 1対1のアドレス変換。サーバー公開に使用 |
| 動的NAT | プールされたグローバルIPから動的に割り当て |
| NAPT(PAT) | IPアドレス + ポート番号で変換。最も一般的(家庭用ルーター等) |
NAPT(IPマスカレード)の変換テーブル例:
| 内部アドレス | 変換後(外部) | 宛先 |
|---|---|---|
| 192.168.1.10:50001 | 203.0.113.1:10001 | 93.184.216.34:443 |
| 192.168.1.20:50002 | 203.0.113.1:10002 | 93.184.216.34:443 |
プロキシ
クライアントとサーバーの間に立ち、通信を中継するサーバー。
フォワードプロキシとリバースプロキシ
flowchart LR
subgraph フォワードプロキシ
direction LR
C1["クライアント"] --> FP["プロキシ"] --> S1["Webサーバー"]
end
flowchart LR
subgraph リバースプロキシ
direction LR
C2["クライアント"] --> RP["リバースプロキシ<br/>(Nginx, CloudFront等)"] --> S2["オリジンサーバー"]
end
| 種類 | 配置 | 主な用途 |
|---|---|---|
| フォワードプロキシ | クライアント側 | アクセス制御、キャッシュ、匿名化 |
| リバースプロキシ | サーバー側 | 負荷分散、SSL終端、キャッシュ、WAF |
ネットワーク診断コマンド
ping — 疎通確認
ICMPエコーリクエストを送信し、対象ホストとの疎通とラウンドトリップタイム(RTT)を確認する。
ping -c 4 example.com
PING example.com (93.184.216.34): 56 data bytes
64 bytes from 93.184.216.34: icmp_seq=0 ttl=56 time=11.2 ms
64 bytes from 93.184.216.34: icmp_seq=1 ttl=56 time=10.8 ms
traceroute — 経路確認
パケットが宛先に到達するまでに経由するルーターを表示する。
traceroute example.com
1 192.168.1.1 (192.168.1.1) 1.234 ms
2 10.0.0.1 (10.0.0.1) 5.678 ms
3 203.0.113.1 (203.0.113.1) 12.345 ms
...
nslookup / dig — DNS問い合わせ
# nslookup
nslookup example.com
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: example.com
Address: 93.184.216.34
# dig(詳細情報)
dig example.com A +short
93.184.216.34
# 特定のDNSサーバーを指定
dig @8.8.8.8 example.com MX
# 逆引き
dig -x 93.184.216.34
curl — HTTPリクエスト
# GETリクエスト
curl https://example.com
# レスポンスヘッダーを表示
curl -I https://example.com
# 詳細な通信内容を表示
curl -v https://example.com
# TLS証明書の情報を確認
curl -vI https://example.com 2>&1 | grep -A 5 "Server certificate"
# POSTリクエスト(JSON)
curl -X POST https://api.example.com/data \
-H "Content-Type: application/json" \
-d '{"key": "value"}'
netstat / ss — ネットワーク接続の確認
# 待ち受けポートの確認(ss推奨。netstatは非推奨)
ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* sshd
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* nginx
LISTEN 0 128 0.0.0.0:443 0.0.0.0:* nginx
# オプション
# -t: TCPのみ -u: UDPのみ
# -l: LISTENのみ -a: すべて
# -n: 数値表示 -p: プロセス表示
ip — ネットワークインターフェースの確認
# IPアドレスの確認
ip addr show
# ルーティングテーブルの確認
ip route show
# デフォルトゲートウェイ
ip route show default
default via 192.168.1.1 dev eth0
tcpdump — パケットキャプチャ
# 特定インターフェースのパケットをキャプチャ
tcpdump -i eth0
# 特定ポートのみ
tcpdump -i eth0 port 443
# 特定ホストとの通信
tcpdump -i eth0 host 93.184.216.34
# ファイルに保存(Wiresharkで分析可能)
tcpdump -i eth0 -w capture.pcap
コマンド早見表
| コマンド | 用途 | 代表的なオプション |
|---|---|---|
ping | 疎通確認 | -c(回数), -i(間隔) |
traceroute | 経路確認 | -n(名前解決しない), -m(最大ホップ) |
nslookup | DNS問い合わせ(簡易) | — |
dig | DNS問い合わせ(詳細) | +short, @server, -x(逆引き) |
curl | HTTP通信 | -I(ヘッダーのみ), -v(詳細), -X(メソッド) |
ss | ソケット情報 | -t, -u, -l, -n, -p |
ip | インターフェース・ルーティング | addr, route, link |
tcpdump | パケットキャプチャ | -i(IF指定), -w(ファイル保存), port |
参考リンク
- RFC 791 - Internet Protocol (IPv4)
- RFC 8200 - Internet Protocol, Version 6 (IPv6)
- RFC 9293 - Transmission Control Protocol (TCP)
- RFC 768 - User Datagram Protocol (UDP)
- RFC 1035 - Domain Names - Implementation and Specification
- RFC 8446 - The Transport Layer Security (TLS) Protocol Version 1.3
- RFC 1918 - Address Allocation for Private Internets
- MDN - HTTP の概要
- MDN - HTTPS