- 技術 💻
OSI参照モデルとは|7層の早見表とTCP/IP対応・パケット実例
結論
OSI参照モデルは、通信の働きを7つの層に分けて考えるための国際標準の枠組みです。ISO/IEC 7498-1(ITU-T X.200)で決められています。
この記事でわかること
- 7層の役割・プロトコル・機器・単位の早見表
- 144バイトのパケットを4つの層に分けた実物
- エラー原文8種から層を特定する切り分け表
送るデータは、上の層から順に「宛名のヘッダー」を前に足されて、最後に信号として流れます。数字は、実際に取った HTTP リクエスト1つの大きさです。
flowchart TD
A[L7 HTTPのデータ<br>78バイト] --> B[L4 TCPヘッダー32バイトを足す<br>セグメント]
B --> C[L3 IPヘッダー20バイトを足す<br>パケット]
C --> D[L2 Ethernetヘッダー14バイトを足す<br>フレーム 144バイト]
D --> E[L1 電気・光・電波の信号<br>ビット]
7つの層は、上から次のとおりです。
| 層 | 名前と役割 | 代表例 |
|---|---|---|
| 第7層 | アプリケーション層:アプリが使う約束ごと | HTTP・DNS・SMTP・SSH |
| 第6層 | プレゼンテーション層:データの表し方 | 文字コード・圧縮・暗号化 |
| 第5層 | セッション層:通信の開始から終了まで | セッションの確立・再開 |
| 第4層 | トランスポート層:アプリ同士を確実につなぐ | TCP・UDP(ポート番号) |
| 第3層 | ネットワーク層:別のネットワークまで届ける | IP・ICMP(IPアドレス) |
| 第2層 | データリンク層:隣の機器まで届ける | Ethernet・Wi-Fi(MACアドレス) |
| 第1層 | 物理層:0と1を信号にして流す | LANケーブル・光ファイバー |
確認環境:Ubuntu 24.04.4・tcpdump 4.99.4(libpcap 1.10.4)・curl 8.5.0・Python 3.11.15・OpenSSL 3.0.13・iproute2(ip・ss)。Linux の network namespace(隔離したネットワーク)2つを仮想の LAN ケーブル(veth)でつなぎ、Python の HTTP サーバーへ curl で1回アクセスした通信を tcpdump で取り、ヘッダーを1バイトずつ読み解いています。障害は同じ環境でわざと起こし、ping・ip・ss・nc・curl の出力を載せています。規格は ISO・ITU-T の公式ページ、TCP/IP の層は RFC 1122、Windows のコマンドは Microsoft Learn で確かめました(確認日 2026年10月17日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「OSI参照モデルとは|7層の早見表とTCP/IP対応・パケット実例」
OSI参照モデルとは
OSI参照モデル(OSI Reference Model)は、コンピューター同士の通信に必要な働きを7つの層に分けて整理した、国際標準の枠組みです。 OSI は Open Systems Interconnection(開放型システム間相互接続)の略です。メーカーが違う機器同士でも通信できるように、ISO(国際標準化機構)と CCITT(いまの ITU-T、国際電気通信連合の標準化部門)が検討し、同じ内容を両方の規格にしています。
| 項目 | 内容 |
|---|---|
| 正式な規格 | ISO/IEC 7498-1:1994(Basic Reference Model: The Basic Model) |
| 同じ内容の勧告 | ITU-T X.200(1994年7月承認、有効) |
| 最初の版 | 1984年(1994年の版が置き換えた) |
| 目的 | 通信の規格づくりを調整するための共通の土台 |
「OSI基本参照モデル」との違い
OSI参照モデルと OSI基本参照モデルは同じものです。 規格の英語名が「Basic Reference Model」なので、訳すと「基本参照モデル」になります。情報処理技術者試験の教科書などでは「OSI基本参照モデル」と書かれることが多く、ふだんは「OSI参照モデル」「OSIモデル」「OSI 7層モデル」と呼ばれます。
実装の手順書ではなく「考え方の地図」
ISO の規格ページには、このモデルは実装の仕様として使うものではない、と書かれています。実際のインターネットで動いているのは、次の節の TCP/IP です。それでも OSI参照モデルが今も使われるのは、「どの層の話か」を短く伝える共通語として便利だからです。「L2スイッチ」「L3スイッチ」「L4ロードバランサー」「L7の攻撃」の L と数字は、この7層の番号です。
OSI参照モデルの7層の早見表
各層が受け持つことと、そこで使われる代表的なプロトコル(通信の約束ごと)・機器・データの単位です。
| 層 | 受け持つこと | 代表的なプロトコル | 主な機器 | データの単位 |
|---|---|---|---|---|
| L7 アプリケーション | アプリが使う通信の中身 | HTTP・DNS・SMTP・IMAP・SSH・FTP | プロキシ・WAF・L7ロードバランサー | データ(メッセージ) |
| L6 プレゼンテーション | 文字コード・圧縮・暗号化など、データの表し方 | 文字コード(UTF-8 等)・画像形式・TLS の暗号化 | ― | データ |
| L5 セッション | 通信の開始・維持・終了、やり直しの区切り | TLS のセッション再開・RPC | ― | データ |
| L4 トランスポート | ポート番号でアプリを区別、順番・再送・流量の調整 | TCP・UDP・QUIC | L4ロードバランサー・ファイアウォール | セグメント(UDP はデータグラム) |
| L3 ネットワーク | IPアドレスで宛先を決め、別のネットワークへ中継 | IPv4・IPv6・ICMP | ルーター・L3スイッチ | パケット |
| L2 データリンク | MACアドレスで同じネットワーク内の隣へ届ける、誤りの検出 | Ethernet・Wi-Fi(IEEE 802.11)・ARP・VLAN | L2スイッチ・ブリッジ・無線LANのアクセスポイント | フレーム |
| L1 物理 | 0と1を電気・光・電波の信号にする、コネクターや電圧の決まり | 10BASE-T・1000BASE-T などの物理規格 | LANケーブル・リピーターハブ・メディアコンバーター | ビット |
表を読むときの注意点です。
- TLS(HTTPS の暗号化)は、どの層かで説明が分かれます。 暗号化は L6、セッションの管理は L5 の働きに近く、TCP/IP モデルではアプリケーション層の一部として扱われます。
- ARP(IPアドレスからMACアドレスを調べる仕組み)は L2 と L3 のあいだで働きます。この記事では L2 の欄に入れています。
- L2 は、IEEE 802 の規格で LLC(論理リンク制御)と MAC(媒体アクセス制御)の2つの副層に分けられています。 OSI参照モデルができた当時は、Ethernet のような LAN が広まる前でした。
- 機器は「その層まで中身を見て判断する」という意味です。L3 のルーターは、L1・L2 の働きも持っています。
送信元・宛先を表す番号は、層ごとに違う
層ごとに「誰に届けるか」を表す番号が違います。障害の切り分けでも、この3つを分けて見ます。
| 層 | 宛先を表すもの | 届く範囲 | 確かめるコマンド(Linux) |
|---|---|---|---|
| L2 | MACアドレス(例 02:58:00:00:00:02) |
同じネットワーク内の隣の機器まで | ip neigh |
| L3 | IPアドレス(例 10.58.0.2) |
ルーターを越えて最終の宛先まで | ip addr・ip route |
| L4 | ポート番号(例 25880) |
宛先のコンピューターの中のアプリまで | ss -ltn |
関連記事「ポート番号一覧【2026年版】well-knownポートと確認コマンドの早見表」で扱っています。
OSI参照モデルの覚え方
7層の名前と順番は、語呂合わせで覚えるのが近道です。番号と「宛先を表すもの」を結びつけると、仕事で使える知識になります。
1上から「アプセトネデブ」
アプリケーション・プレゼンテーション・セッション・トランスポート・ネットワーク・データリンク・ブツリ(物理)。第7層から第1層の順です。
2英語の頭文字で覚える
上から「All People Seem To Need Data Processing」、下から「Please Do Not Throw Sausage Pizza Away」。各単語の頭文字が層の頭文字です。
3L2・L3・L4 は「MAC・IP・ポート」
L2スイッチは MACアドレスで、ルーター(L3)は IPアドレスで、L4ロードバランサーはポート番号で振り分けます。機器の名前と番号が結びつきます。
4単位は下から「ビット・フレーム・パケット・セグメント」
L1 がビット、L2 がフレーム、L3 がパケット、L4 がセグメントです。L5 より上はまとめて「データ」と呼びます。
TCP/IPモデルとの違いと対応表
実際のインターネットで使われているのは TCP/IP モデル(インターネットプロトコルスイート)です。 RFC 1122 は、TCP/IP を4つの層(アプリケーション・トランスポート・インターネット・リンク)で説明しています。OSI参照モデルの7層とは、次のように対応します。
| OSI参照モデル | TCP/IPモデル(RFC 1122) | この層の代表例 |
|---|---|---|
| L7 アプリケーション | アプリケーション層 | HTTP・DNS・SMTP・SSH |
| L6 プレゼンテーション | アプリケーション層 | TLS・文字コード |
| L5 セッション | アプリケーション層 | TLS のセッション |
| L4 トランスポート | トランスポート層 | TCP・UDP |
| L3 ネットワーク | インターネット層 | IP・ICMP |
| L2 データリンク | リンク層 | Ethernet・ARP |
| L1 物理 | リンク層(物理の規格は対象外) | LANケーブル・光ファイバー |
違いをまとめると次のとおりです。
| 比べる点 | OSI参照モデル | TCP/IPモデル |
|---|---|---|
| 層の数 | 7層 | 4層(物理を分けて5層と書く本もある) |
| 決めたところ | ISO・ITU-T | IETF(RFC) |
| 作り方 | 先にモデルを決め、あとからプロトコルを作る考え方 | 動いているプロトコルを、あとから層に整理 |
| 今の使われ方 | 説明・設計・切り分けの共通語 | 実際の通信(インターネット・社内LAN) |
RFC 1122 には、TCP/IP のアプリケーション層は、OSI のプレゼンテーション層とアプリケーション層の働きをまとめたものと書かれています。HTTP のようなアプリのプロトコルが、文字コードや圧縮(L6 の働き)も自分で決めているのはこのためです。
カプセル化とは:送るときにヘッダーが重なる流れ
カプセル化は、上の層のデータの前に、下の層が自分のヘッダー(宛名や制御情報)を足していく仕組みです。 受け取る側は逆に、下の層から順にヘッダーを外していきます(非カプセル化)。
| 順番 | 送る側でしていること | できあがるもの |
|---|---|---|
| 1 | アプリが HTTP のリクエスト文を作る | データ(GET / HTTP/1.1 …) |
| 2 | TCP がポート番号・順番の番号を前に足す | セグメント |
| 3 | IP が送信元・宛先の IPアドレスを前に足す | パケット |
| 4 | Ethernet が送信元・宛先の MACアドレスを前に足す | フレーム |
| 5 | NIC(ネットワークカード)が電気・光の信号にする | ビット |
途中のルーターは L3 まで外して IPアドレスを見て、次の隣へ渡すために L2 のヘッダーを付け替えます。 IPアドレスは最後まで同じで、MACアドレスは区間ごとに変わります。
1回のHTTP通信をtcpdumpで分解する
ここからは、実際に取った通信で各層のヘッダーを見ます。2つのネットワーク空間を仮想の LAN ケーブルでつなぎ、10.58.0.1(クライアント)から 10.58.0.2:25880(Python の HTTP サーバー)へ curl で1回アクセスしました。
取り方のコマンド
# 1つ目の端末:通信を取る(-w でファイルに保存)
sudo tcpdump -i s258c0 -w http.pcap
# 2つ目の端末:HTTPで1回アクセスする
curl -s http://10.58.0.2:25880/
# 取ったファイルを、MACアドレス付き(-e)で表示する
tcpdump -r http.pcap -n -e
手元の PC で試すときは、-i にふだん使っているインターフェース名(ip -br link で見られます)を、-w の前に 'host 宛先 and tcp port 80' のような条件を付けます。-i lo(ループバック)で取ると、MACアドレスはすべて 00:00:00:00:00:00 と表示されました。
1回のアクセスで流れた15個のフレーム
curl 1回で、15個のフレームが流れました。左から、送信元MAC > 宛先MAC、L2 の種類(ethertype)、L3・L4 の中身です(日時と一部の値を短くしています)。
02:58:00:00:00:01 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 10.58.0.2 tell 10.58.0.1, length 28
02:58:00:00:00:02 > 02:58:00:00:00:01, ethertype ARP (0x0806), length 42: Reply 10.58.0.2 is-at 02:58:00:00:00:02, length 28
02:58:00:00:00:01 > 02:58:00:00:00:02, ethertype IPv4 (0x0800), length 74: 10.58.0.1.41730 > 10.58.0.2.25880: Flags [S], ... length 0
02:58:00:00:00:02 > 02:58:00:00:00:01, ethertype IPv4 (0x0800), length 74: 10.58.0.2.25880 > 10.58.0.1.41730: Flags [S.], ... length 0
02:58:00:00:00:01 > 02:58:00:00:00:02, ethertype IPv4 (0x0800), length 66: 10.58.0.1.41730 > 10.58.0.2.25880: Flags [.], ack 1, ... length 0
02:58:00:00:00:01 > 02:58:00:00:00:02, ethertype IPv4 (0x0800), length 144: 10.58.0.1.41730 > 10.58.0.2.25880: Flags [P.], seq 1:79, ... length 78
02:58:00:00:00:02 > 02:58:00:00:00:01, ethertype IPv4 (0x0800), length 66: 10.58.0.2.25880 > 10.58.0.1.41730: Flags [.], ack 79, ... length 0
02:58:00:00:00:02 > 02:58:00:00:00:01, ethertype IPv4 (0x0800), length 183: 10.58.0.2.25880 > 10.58.0.1.41730: Flags [P.], seq 1:118, ... length 117
02:58:00:00:00:01 > 02:58:00:00:00:02, ethertype IPv4 (0x0800), length 66: 10.58.0.1.41730 > 10.58.0.2.25880: Flags [.], ack 118, ... length 0
02:58:00:00:00:02 > 02:58:00:00:00:01, ethertype IPv4 (0x0800), length 76: 10.58.0.2.25880 > 10.58.0.1.41730: Flags [P.], seq 118:128, ... length 10
02:58:00:00:00:01 > 02:58:00:00:00:02, ethertype IPv4 (0x0800), length 66: 10.58.0.1.41730 > 10.58.0.2.25880: Flags [.], ack 128, ... length 0
02:58:00:00:00:02 > 02:58:00:00:00:01, ethertype IPv4 (0x0800), length 66: 10.58.0.2.25880 > 10.58.0.1.41730: Flags [F.], seq 128, ... length 0
02:58:00:00:00:01 > 02:58:00:00:00:02, ethertype IPv4 (0x0800), length 66: 10.58.0.1.41730 > 10.58.0.2.25880: Flags [F.], seq 79, ... length 0
02:58:00:00:00:02 > 02:58:00:00:00:01, ethertype IPv4 (0x0800), length 66: 10.58.0.2.25880 > 10.58.0.1.41730: Flags [.], ack 80, ... length 0
02:58:00:00:00:01 > 02:58:00:00:00:02, ethertype IPv4 (0x0800), length 66: 10.58.0.1.41730 > 10.58.0.2.25880: Flags [.], ack 129, ... length 0
上から順に、層の働きがそのまま見えます。
| 行 | 何をしているか | 層 |
|---|---|---|
| 1〜2 | ARP:10.58.0.2 の MACアドレスを全員宛て(ff:ff:ff:ff:ff:ff)に聞き、本人が答える |
L2(L3との橋渡し) |
| 3〜5 | TCP の3ウェイハンドシェイク([S]→[S.]→[.])で接続を作る |
L4 |
| 6 | HTTP リクエスト(78バイト)を送る | L7 |
| 7〜11 | HTTP 応答のヘッダー(117バイト)と本文(10バイト)を受け取り、受け取りを知らせる(ack) | L7・L4 |
| 12〜15 | [F.](FIN)で両方から接続を閉じる |
L4 |
144バイトのリクエストを1バイトずつ読む
6行目の HTTP リクエストのフレームを、-XX(L2 から全部を16進数で表示)で見ました。
tcpdump -r http.pcap -n -XX 'tcp[tcpflags] & tcp-push != 0'
0x0000: 0258 0000 0002 0258 0000 0001 0800 4500 .X.....X......E.
0x0010: 0082 7f17 4000 4006 a6e8 0a3a 0001 0a3a ....@.@....:...:
0x0020: 0002 a302 6518 c3c4 5469 fe60 de95 8018 ....e...Ti.`....
0x0030: 003f 14eb 0000 0101 080a 4a52 d9e6 c807 .?........JR....
0x0040: b046 4745 5420 2f20 4854 5450 2f31 2e31 .FGET./.HTTP/1.1
0x0050: 0d0a 486f 7374 3a20 3130 2e35 382e 302e ..Host:.10.58.0.
0x0060: 323a 3235 3838 300d 0a55 7365 722d 4167 2:25880..User-Ag
0x0070: 656e 743a 2063 7572 6c2f 382e 352e 300d ent:.curl/8.5.0.
0x0080: 0a41 6363 6570 743a 202a 2f2a 0d0a 0d0a .Accept:.*/*....
左の 0x0000 などは、先頭から何バイト目か(16進数)です。先頭から順に、L2 → L3 → L4 → L7 のヘッダーが並んでいます。 送る側では後から足したヘッダーほど前にある、というカプセル化の結果がそのまま見えます。
| 位置(先頭から) | バイト列 | 層 | 意味 |
|---|---|---|---|
| 0〜5 | 02 58 00 00 00 02 |
L2 | 宛先の MACアドレス |
| 6〜11 | 02 58 00 00 00 01 |
L2 | 送信元の MACアドレス |
| 12〜13 | 08 00 |
L2 | 中身は IPv4(ARP なら 08 06) |
| 14 | 45 |
L3 | IPv4(4)で、ヘッダーは 5×4=20バイト |
| 16〜17 | 00 82 |
L3 | IP から後ろの長さ 130バイト |
| 22 | 40 |
L3 | TTL 64(ルーターを1つ越えるごとに1減る) |
| 23 | 06 |
L3 | 中身は TCP(UDP なら 17) |
| 26〜33 | 0a 3a 00 01・0a 3a 00 02 |
L3 | 送信元 10.58.0.1・宛先 10.58.0.2 |
| 34〜37 | a3 02・65 18 |
L4 | 送信元ポート 41730・宛先ポート 25880 |
| 46 | 80 |
L4 | TCP ヘッダーは 8×4=32バイト |
| 47 | 18 |
L4 | フラグ ACK と PSH |
| 66〜143 | 47 45 54 20 … |
L7 | GET / HTTP/1.1 から始まる HTTP の本文 |
同じ解析を、標準ライブラリだけの Python で書くと次のとおりです。pcap ファイルの n 番目のフレームを、層ごとに分けて表示します。
# layers.py 使い方: python3 layers.py http.pcap 6 (6 = 何番目のフレームか)
import struct, sys
def packets(path):
with open(path, "rb") as f:
f.read(24) # pcap のファイルヘッダー
while h := f.read(16):
_, _, incl, _ = struct.unpack("<IIII", h)
yield f.read(incl)
def mac(b): return ":".join(f"{x:02x}" for x in b)
def ip(b): return ".".join(str(x) for x in b)
data = list(packets(sys.argv[1]))[int(sys.argv[2]) - 1]
print(f"フレーム全体: {len(data)} バイト")
# L2 Ethernet(14バイト)
dst, src, etype = data[0:6], data[6:12], struct.unpack("!H", data[12:14])[0]
print(f"[L2 Ethernet] 14バイト 宛先MAC={mac(dst)} 送信元MAC={mac(src)} type=0x{etype:04x}")
# L3 IPv4(IHL×4 バイト)
p = data[14:]
ihl = (p[0] & 0x0f) * 4
total, ttl, proto = struct.unpack("!H", p[2:4])[0], p[8], p[9]
print(f"[L3 IPv4] {ihl}バイト 版={p[0]>>4} 全長={total} TTL={ttl} proto={proto}(TCP) "
f"送信元={ip(p[12:16])} 宛先={ip(p[16:20])}")
# L4 TCP(データオフセット×4 バイト)
t = p[ihl:]
sport, dport, seq, ack = struct.unpack("!HHII", t[0:12])
off = (t[12] >> 4) * 4
flags = "".join(n for b, n in [(0x10, "ACK "), (0x08, "PSH "), (0x02, "SYN "), (0x01, "FIN ")] if t[13] & b)
print(f"[L4 TCP] {off}バイト 送信元ポート={sport} 宛先ポート={dport} seq={seq} flags={flags.strip()}")
# L7 HTTP(残り全部)
app = t[off:total - ihl]
first = app.split(b"\r\n")[0].decode()
print(f"[L7 HTTP] {len(app)}バイト 先頭行={first!r}")
print(f"ヘッダー合計 {14 + ihl + off} バイト + データ {len(app)} バイト")
6番目(リクエスト)と8番目(応答)、3番目(接続の申し込み SYN)の結果です。
$ python3 layers.py http.pcap 6
フレーム全体: 144 バイト
[L2 Ethernet] 14バイト 宛先MAC=02:58:00:00:00:02 送信元MAC=02:58:00:00:00:01 type=0x0800
[L3 IPv4] 20バイト 版=4 全長=130 TTL=64 proto=6(TCP) 送信元=10.58.0.1 宛先=10.58.0.2
[L4 TCP] 32バイト 送信元ポート=41730 宛先ポート=25880 seq=3284423785 flags=ACK PSH
[L7 HTTP] 78バイト 先頭行='GET / HTTP/1.1'
ヘッダー合計 66 バイト + データ 78 バイト
$ python3 layers.py http.pcap 8
フレーム全体: 183 バイト
[L2 Ethernet] 14バイト 宛先MAC=02:58:00:00:00:01 送信元MAC=02:58:00:00:00:02 type=0x0800
[L3 IPv4] 20バイト 版=4 全長=169 TTL=64 proto=6(TCP) 送信元=10.58.0.2 宛先=10.58.0.1
[L4 TCP] 32バイト 送信元ポート=25880 宛先ポート=41730 seq=4267761301 flags=ACK PSH
[L7 HTTP] 117バイト 先頭行='HTTP/1.0 200 OK'
ヘッダー合計 66 バイト + データ 117 バイト
$ python3 layers.py http.pcap 3
フレーム全体: 74 バイト
[L2 Ethernet] 14バイト 宛先MAC=02:58:00:00:00:02 送信元MAC=02:58:00:00:00:01 type=0x0800
[L3 IPv4] 20バイト 版=4 全長=60 TTL=64 proto=6(TCP) 送信元=10.58.0.1 宛先=10.58.0.2
[L4 TCP] 40バイト 送信元ポート=41730 宛先ポート=25880 seq=3284423784 flags=SYN
[L7 HTTP] 0バイト 先頭行=''
ヘッダー合計 74 バイト + データ 0 バイト
各フレームのうち、どれだけがヘッダーかを並べると次のようになります。
フレームの中身の割合tcpdump で取った実際のフレーム。SYN は TCP のオプションが多く、L3・L4 が60バイト
読み取れることです。
- IPv4 と TCP のヘッダーは、どちらも最小20バイトです。 ここでは TCP にタイムスタンプのオプション(12バイト)が付いて32バイト、SYN では MSS などのオプションが付いて40バイトでした。
- tcpdump で見える Ethernet フレームには、末尾の FCS(誤り検出用の4バイト)が含まれていません。 L1 のプリアンブル(同期用の信号)も見えません。
- 表示の
length 144は L2 から数えた大きさ、length 78は L4 の後ろ(HTTP のデータ)の大きさです。同じ行に2つの length が出るのは、層ごとに数えているためです。
HTTPSにすると、L7の中身は読めなくなる
同じ2台のあいだで、openssl s_server を使った HTTPS のサーバーに curl -k(証明書の確認を省く)でアクセスし、HTTP リクエストを運んだフレームを見ました。
0x0000: 0258 0000 0002 0258 0000 0001 0800 4500 .X.....X......E.
0x0010: 0098 2801 4000 4006 fde8 0a3a 0001 0a3a ..(.@.@....:...:
0x0020: 0002 da26 64f3 acbe 4eeb 65a9 9173 8018 ...&d...N.e..s..
0x0030: 003f 1501 0000 0101 080a d318 0a3f 3e86 .?...........?>.
0x0040: ab77 1703 0300 5fc1 41be 109e f21b f8e1 .w...._.A.......
0x0050: 55cd c03d a081 2170 63c5 b5fe b804 6977 U..=..!pc.....iw
L2・L3・L4 のヘッダーは HTTP のときと同じ形で、そのまま読めます。 変わったのは L4 より後ろです。先頭の 17 03 03 00 5f は TLS の記録の見出し(17 はアプリのデータ、00 5f は長さ 95バイト)で、その後ろは暗号化されています。取ったファイル全体で GET / という文字列を数えると、HTTP では1か所、HTTPS では0か所でした。
tcpdump -r http.pcap -A | grep -c 'GET /' # → 1
tcpdump -r tls.pcap -A | grep -c 'GET /' # → 0
途中の機器(ルーターやスイッチ)が IPアドレス・ポート番号を見て中継できるのは、暗号化が L4 より上だけにかかっているからです。
関連記事「opensslコマンドの使い方|目的別一覧と実行結果・エラー対処【3系】」で扱っています。
通信トラブルを層ごとに切り分ける手順
「つながらない」ときは、下の層から順に確かめると、原因の層を1つずつ消していけます。上と同じ2台の環境で、わざと障害を起こして出た表示を載せます。
L1:リンクが上がっているか
ip -br link の状態が UP で、LOWER_UP が付いているかを見ます。相手側を止めると、こちらは DOWN と NO-CARRIER(信号が来ていない)になりました。
L2:隣の機器の MACアドレスが分かるか
ip neigh で相手(またはデフォルトゲートウェイ)の MACアドレスが出るかを見ます。FAILED や INCOMPLETE なら、ARP に誰も答えていません。
L3:IPアドレスと経路があり、ping が返るか
ip -br addr・ip route で自分のアドレスと経路を確かめ、ping で相手まで届くかを見ます。途中のどこで止まるかは traceroute で分かります。
L4:ポートが開いていて、接続できるか
サーバー側で ss -ltn を見て、そのポートで待っているかを確かめます。クライアント側から nc -zv 宛先 ポート で接続だけ試します。
L5〜L7:名前解決・TLS・アプリの応答
curl -v で、名前解決・TLS の確認・HTTP のステータスコードのどこで止まるかを見ます。DNS だけを確かめるときは nslookup や dig を使います。
実際に起こしたエラーの原文と、層の見分け方
| 出た表示(原文) | 層 | 原因 | 次に見るもの |
|---|---|---|---|
ip -br link が DOWN と NO-CARRIER、ping は 100% packet loss |
L1 | 相手の機器・ケーブル・ポートが止まっている | ケーブル・相手の電源・スイッチのランプ |
From 10.58.0.1 icmp_seq=1 Destination Host Unreachable と ip neigh の FAILED |
L2 | ARP に誰も答えない(相手がいない、別の VLAN) | 相手の IP・VLAN の設定 |
ping: connect: Network is unreachable |
L3 | 宛先への経路が無い(自分のリンクが落ちた場合も) | ip route・デフォルトゲートウェイ |
nc: connect to 10.58.0.2 port 25881 (tcp) failed: Connection refused |
L4 | 相手には届いたが、そのポートで誰も待っていない | サーバーの ss -ltn・アプリの起動 |
curl: (28) Failed to connect to 10.58.0.2 port 25880 after 3002 ms: Timeout was reached(ping は通る) |
L4 | ファイアウォールが接続を捨てている | iptables・セキュリティグループ |
curl: (6) Could not resolve host: nohost.invalid |
L7 | DNS で名前を IPアドレスにできない | nslookup・/etc/resolv.conf |
curl: (60) SSL certificate problem: self-signed certificate |
L6相当 | TLS の証明書を信頼できない | 証明書の発行元・期限・名前 |
HTTP のステータスコード 404 |
L7 | 通信は成功し、アプリが「無い」と答えた | URL・アプリのログ |
見分けるときのポイントです。
- 自分の IP から返る
Destination Host Unreachableは L2 の問題です。 同じネットワーク内の相手に ARP を送っても答えが無いとき、Linux の ping は自分のアドレス(From 10.58.0.1)からこの表示を出しました。ping を3回で止めると、表示が出ないまま100% packet lossで終わったので、5回以上送ると見分けやすくなります。 refusedとtimed outの違いは、L4 で相手が答えたかどうかです。 閉じたポートへの接続では、相手から RST(接続を断る知らせ)がすぐ返りました。ファイアウォールで捨てると何も返らず、待ち時間の3秒で失敗しました。
10.58.0.1.33556 > 10.58.0.2.25881: Flags [S], seq 3519742829, win 64240, ... length 0
10.58.0.2.25881 > 10.58.0.1.33556: Flags [R.], seq 0, ack 3519742830, win 0, length 0
- curl 8.5.0 は、閉じたポートでも
curl: (7) Failed to connect to 10.58.0.2 port 25881 after 0 ms: Couldn't connect to serverと表示し、refusedの文字は出ませんでした。after 0 msのようにすぐ失敗したら拒否、待ち時間ちょうどで失敗したら遮断と見分けられます。
関連記事「Linuxネットワークコマンド一覧|ip/ss/ncで障害切り分け」で扱っています。
層ごとの確認コマンド(Linux・Windows・Mac)
| 層 | Linux | Windows | Mac |
|---|---|---|---|
| L1 | ip -br link |
ipconfig /all(メディアの状態) |
ifconfig(status) |
| L2 | ip neigh |
arp -a |
arp -a |
| L3 | ip -br addr・ip route・ping・traceroute |
ipconfig・route print・ping・tracert |
ifconfig・netstat -rn・ping・traceroute |
| L4 | ss -ltn・ss -tan・nc -zv |
netstat -an・Test-NetConnection -Port |
netstat -an・nc -zv |
| L7 | curl -v・nslookup・dig |
curl.exe -v・nslookup |
curl -v・nslookup・dig |
接続のあと、クライアント側で ss -tan を見ると、閉じた接続が TIME-WAIT(閉じたあとしばらく残る状態)で残っていました。L4 の接続の状態は、このように ss で追えます。
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
TIME-WAIT 0 0 10.58.0.1:32802 10.58.0.2:25880
関連記事「curlコマンドの使い方|よく使うオプションとAPIの確認方法」で扱っています。
よくある質問
Q. OSI参照モデルとは何ですか? A. 通信の働きを、物理(L1)からアプリケーション(L7)までの7つの層に分けて整理した国際標準の枠組みです。ISO/IEC 7498-1 と ITU-T X.200 で決められています。「OSI参照モデルとは」の節にあります。
Q. OSI基本参照モデルと OSI参照モデルは違うものですか? A. 同じものです。規格の英語名「Basic Reference Model」を訳すと「基本参照モデル」になります。
Q. OSI参照モデルの7層の覚え方は? A. 上から「アプセトネデブ」(アプリケーション・プレゼンテーション・セッション・トランスポート・ネットワーク・データリンク・物理)が知られています。L2・L3・L4 を「MAC・IP・ポート」と結びつけると、機器の名前と一緒に覚えられます。
Q. OSI参照モデルと TCP/IP モデルの違いは? A. OSI は7層、TCP/IP は4層です。TCP/IP のアプリケーション層が OSI の L5〜L7、インターネット層が L3、リンク層が L1・L2 にあたります。実際の通信は TCP/IP で動いていて、OSI は説明や切り分けの共通語として使われます。
Q. L2スイッチと L3スイッチの違いは? A. L2スイッチは MACアドレスを見て、同じネットワークの中で転送します。L3スイッチは IPアドレスも見て、別のネットワークへの中継(ルーティング)もします。
まとめ
- OSI参照モデル(OSI基本参照モデル)は、通信の働きを7層に分けた国際標準の枠組み。規格は ISO/IEC 7498-1:1994・ITU-T X.200。
- 実際の通信は TCP/IP の4層で動いている。L5〜L7 が TCP/IP のアプリケーション層、L1・L2 がリンク層にあたる。
- 送るデータには、L4・L3・L2 の順にヘッダーが前に足される。curl 1回の HTTP リクエストは、14+20+32バイトのヘッダーと78バイトのデータで144バイトのフレームだった。
- HTTPS では L4 より後ろだけが暗号化され、L2〜L4 のヘッダーはそのまま読める。
- つながらないときは下の層から。NO-CARRIER は L1、
Destination Host Unreachableと ARP の FAILED は L2、Network is unreachableは L3、refusedとtimed outは L4 で見分けられる。
参考・出典
確認日はいずれも 2026年10月17日です。
- ISO「ISO/IEC 7498-1:1994 Information technology — Open Systems Interconnection — Basic Reference Model: The Basic Model」:https://www.iso.org/standard/20269.html
- ITU-T「X.200 : Information technology - Open Systems Interconnection - Basic Reference Model: The basic model」:https://www.itu.int/rec/T-REC-X.200-199407-I/en
- RFC 1122「Requirements for Internet Hosts -- Communication Layers」:https://www.rfc-editor.org/rfc/rfc1122
- RFC 791「Internet Protocol」:https://www.rfc-editor.org/rfc/rfc791
- RFC 9293「Transmission Control Protocol (TCP)」:https://www.rfc-editor.org/rfc/rfc9293
- tcpdump「tcpdump(1) man page」:https://www.tcpdump.org/manpages/tcpdump.1.html
- Microsoft Learn「Test-NetConnection」:https://learn.microsoft.com/en-us/powershell/module/nettcpip/test-netconnection
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「OSI参照モデルとは|7層の早見表とTCP/IP対応・パケット実例」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。