ネットワーク基礎 - 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

アドレスクラス(クラスフル):

クラス先頭ビットアドレス範囲用途
A00.0.0.0 〜 127.255.255.255大規模ネットワーク
B10128.0.0.0 〜 191.255.255.255中規模ネットワーク
C110192.0.0.0 〜 223.255.255.255小規模ネットワーク
D1110224.0.0.0 〜 239.255.255.255マルチキャスト
E1111240.0.0.0 〜 255.255.255.255予約(実験用)

プライベートIPアドレス(RFC 1918):

クラス範囲CIDR表記
A10.0.0.0 〜 10.255.255.25510.0.0.0/8
B172.16.0.0 〜 172.31.255.255172.16.0.0/12
C192.168.0.0 〜 192.168.255.255192.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サブネットマスクホスト数
/32255.255.255.2551(単一ホスト)
/28255.255.255.24014
/24255.255.255.0254
/16255.255.0.065,534
/8255.0.0.016,777,214

IPv6

128ビットのアドレス。コロン区切りの16進数で表す。IPv4のアドレス枯渇問題を解決するために設計された。

2001:0db8:85a3:0000:0000:8a2e:0370:7334

省略形:
2001:db8:85a3::8a2e:370:7334

省略ルール:

  • 各グループの先頭の0は省略可能(0db8db8
  • 連続する0000グループは :: で1回だけ省略可能

特殊なIPv6アドレス:

アドレス用途
::1ループバック(IPv4の127.0.0.1相当)
::未指定アドレス(IPv4の0.0.0.0相当)
fe80::/10リンクローカルアドレス
2001:db8::/32ドキュメント用(例示用)

TCP と UDP

比較

特性TCPUDP
接続コネクション型コネクションレス型
信頼性あり(再送制御、順序保証)なし
速度低い(オーバーヘッドあり)高い(オーバーヘッド少)
ヘッダーサイズ20〜60バイト8バイト
フロー制御ありなし
用途HTTP, HTTPS, FTP, SMTP, SSHDNS, 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)

ポートプロトコル用途
20TCPFTP(データ転送)
21TCPFTP(制御)
22TCPSSH
23TCPTelnet
25TCPSMTP(メール送信)
53TCP/UDPDNS
67/68UDPDHCP
80TCPHTTP
110TCPPOP3
123UDPNTP
143TCPIMAP
443TCPHTTPS
465TCPSMTPS
587TCPSMTP(サブミッション)
993TCPIMAPS
995TCPPOP3S

ポート番号の分類

範囲分類説明
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等)ゾーンの開始レコード
PTRIPアドレス → ドメイン(逆引き)34.216.184.93 → example.com
SRVサービスの場所(ホスト+ポート)_sip._tcp.example.com → sip.example.com:5060
CAASSL証明書の発行許可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.2TLS 1.3
ハンドシェイク2-RTT1-RTT(0-RTTも可)
鍵交換RSA, DHE, ECDHEECDHE, DHEのみ(RSA廃止)
暗号スイート多数(脆弱なものも含む)5種類に厳選
前方秘匿性オプション必須

証明書チェーン

HTTPS通信ではサーバー証明書の信頼性を 証明書チェーン で検証する。

flowchart TD
    A["ルート認証局(CA)<br/>ブラウザに事前搭載"] --> B["中間認証局<br/>ルートCAが署名"]
    B --> C["サーバー証明書<br/>中間CAが署名"]
    C --> D["Webサーバー<br/>example.com"]

ファイアウォール

ネットワーク間の通信を監視・制御し、許可されたトラフィックのみを通過させるセキュリティ機構。

フィルタリングの種類

種類動作レイヤー特徴
パケットフィルタリングL3-L4IPアドレス・ポート番号で制御。高速だが内容は検査しない
ステートフルインスペクションL3-L4通信の状態(コネクション)を追跡して制御
アプリケーションゲートウェイL7HTTP等のアプリケーションプロトコルの内容を検査
WAFL7Webアプリケーション特化。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の種類

種類説明
静的NAT1対1のアドレス変換。サーバー公開に使用
動的NATプールされたグローバルIPから動的に割り当て
NAPT(PAT)IPアドレス + ポート番号で変換。最も一般的(家庭用ルーター等)

NAPT(IPマスカレード)の変換テーブル例:

内部アドレス変換後(外部)宛先
192.168.1.10:50001203.0.113.1:1000193.184.216.34:443
192.168.1.20:50002203.0.113.1:1000293.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(最大ホップ)
nslookupDNS問い合わせ(簡易)
digDNS問い合わせ(詳細)+short, @server, -x(逆引き)
curlHTTP通信-I(ヘッダーのみ), -v(詳細), -X(メソッド)
ssソケット情報-t, -u, -l, -n, -p
ipインターフェース・ルーティングaddr, route, link
tcpdumpパケットキャプチャ-i(IF指定), -w(ファイル保存), port

参考リンク