OSI参照モデルとは、通信を層に分けて考える

回 4-1 道 4 ネットワークと暗号

OSI参照モデルは、コンピューター同士の通信の仕事を、物理層からアプリケーション層までの 7 つの層に分けて考えるための地図です。送る側はデータに層ごとの頭 (ヘッダー) を足して包み、受ける側は外側から順に剥がします。5 バイトのデータでも、UDP の 8 バイト、IPv4 の 20 バイト、Ethernet の 14 バイトの頭を足すと 47 バイトになります。

通信の困りごとを、どの層の話かで切り分けられるようになります。

どの層の話か、なぜ分けて考えるのか

通信の困りごとは、層に分けて考えると「どこで止まっているか」を 1 つずつ確かめられるようになります。OSI参照モデルは、そのための 7 段の地図です。

たとえば、社内の Web の画面が開かないと連絡が来たとします。ケーブルが抜けているのか、相手まで道が無いのか、窓口 (ポート) が閉じているのか、プログラムがエラーを返しているのか。どれを疑うかで、見る道具も頼む相手も変わります。

全部を一度に疑うと手が止まるので、通信の仕事を段に分け、下の段から「ここまでは動いている」を確かめていきます。

OSI参照モデルはどう分かれているのか

OSI参照モデルは、通信の仕事を 7 つの層に分け、各層はすぐ下の層の働きを使って、すぐ上の層に働きを渡す、という決まりで組まれています。

なぜ層に分けるのか

層に分けると、1 つの層の中身を入れ替えても、上と下の層はそのままで済みます。上の層は、下の層がどう運んだかを知らずに、渡された物だけを使えばよいからです。

Oracle の文書は、各層がその上の層に対してサービスを行うと書いています。ケーブルが無線に替わっても Web のプログラムを書き直さずに済むのは、このためです。

役割ごとに分けた層を積み、上の層はすぐ下の層だけを呼ぶ図

7 つの層と、それぞれの役割

7 つの層は、下から物理層、データリンク層、ネットワーク層、トランスポート層、セッション層、プレゼンテーション層、アプリケーション層です。番号は下から 1、2、3 と数えます。

番号層役割例
7アプリケーション利用者が使う通信の中身HTTP、DNS
6プレゼンテーションデータの表し方文字コード
5セッションやり取りの始めと終わり接続の手順
4トランスポートどの窓口の、どんな運び方かTCP、UDP
3ネットワーク別の網をまたいで届けるIP
2データリンク直につながる相手に渡すEthernet
1物理信号とケーブルケーブル、電波

4 層のポート番号は、届いた機械の中のどのプログラムの窓口かを指します。IP アドレスとポートの中身は 4-2 と 4-3 で扱います。

OSI参照モデルは、国際標準化機構 (ISO) の ISO/IEC 7498-1 (初版 1984 年、今の版 1994 年) と ITU-T の勧告 X.200 で決められています。ISO の頁は、このモデルが実装の仕様書ではないと書いています。

下の図で、止める段を動かしてみてください。1 つの段が止まると、その上の段は全部止まり、画面に出るエラーの文も段ごとに変わります。

1 段止まると上は全部止まる

TCP/IP の 4 層とはどう対応するのか

今のインターネットで使われているのは、TCP/IP の 4 層の分け方です。インターネットの機械が守る決まりを書いた RFC 1122 は、層をアプリケーション層、トランスポート層、インターネット層、リンク層の 4 つに分けています。

TCP/IP の層OSI の層運ぶ単位
アプリケーション5〜7メッセージ
トランスポート4セグメント
インターネット3パケット
リンク1〜2フレーム

RFC 1122 は、このアプリケーション層が OSI のプレゼンテーション層とアプリケーション層をまとめた物だと書いています。表ではセッション層もここに入れています。

同じ RFC は、層の分け方は完全なモデルではなく、実際の作りでは層をまたぐこともあると書いています。どちらも考えるための地図です。

OSI の 7 段が TCP/IP の 4 段に畳まれる

頭を足して包む、カプセル化

送る側は、上の層から下の層へ渡すたびに、その層の頭 (ヘッダー) をデータの前に足します。これをカプセル化と呼び、受ける側が外側の頭から順に外していくことを非カプセル化と呼びます。

層頭大きさ
4UDP8 バイト
3IPv4最小 20 バイト
2Ethernet14 バイト

UDP の頭は RFC 768 の図の通り、2 バイトの欄が 4 つで 8 バイトです。IPv4 の頭の長さは RFC 791 の IHL (4 バイトを 1 語とした語の数) で書き、最小は 5 語なので 20 バイトです。Ethernet の頭は、RFC 9542 の図の通り 6 バイトの MAC アドレス (機器に付いた番号) 2 つと 2 バイトの種類の欄で、14 バイトです。

パケットとは何か

パケットは、ネットワークの上を運ばれるデータの小包です。RFC 1122 は、パケットを IP の頭とデータでできた、インターネット層とリンク層の間で渡す単位と定めています。

フレームは、リンク層の頭の後ろにパケットを付けた物です。日常では全部を「パケット」と呼ぶことも多いので、どの層の単位の話かに気を付けます。

動かして確かめる

Python の struct は、値を決まった形のバイト列に詰める道具です。! はネットワークの並び (ビッグエンディアン)、H は 2 バイト、B は 1 バイト、6s は 6 バイトのバイト列を表します。データの hello を、UDP、IPv4、Ethernet の順に包みます。

IP アドレスは、説明の文書に使うよう RFC 5737 が取り置いた 192.0.2.1 と 198.51.100.7、MAC アドレスは RFC 9542 が取り置いた 00-00-5E-00-53-01 と 00-00-5E-00-53-02 を使います。

動かす 頭を足して包む

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

データ 5
UDP 13
IP 33
Ethernet 47
00 00 5e 00 53 02

5 バイトのデータが、8、20、14 バイトの頭を足して 47 バイトになりました。最後の行の通り、フレームは宛先の MAC アドレスから始まります。検算の欄 (チェックサム) は、この例では 0 のままです。

IPv4 の頭の最初の 1 バイト 0x45 は、上の 4 ビットが版の 4、下の 4 ビットが IHL の 5 (5 語で 20 バイト) です。17 は中身が UDP であることを表す番号で、RFC 768 が UDP を 17 番と定めています。Ethernet の 0x0800 は中身が IP であることを表し、RFC 894 が定めています。

次は受ける側です。外側の頭から 1 つずつ剥がし、頭に書いてある長さと種類を頼りに次の層へ進みます。

動かす 外側から剥がす

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

2層 00-00-5e-00-53-02
  type 0800
3層 198.51.100.7
  頭 20
  proto 17
4層 port 9999
中身 b'hello'

種類が 0800 なので中身を IP として読み、頭が 20 バイトで番号が 17 なので、20 バイト先から UDP として読みます。どの層も自分の頭だけを読み、残りを上の層に渡しています。

層の前提が崩れるとき

頭の大きさや長さを決め打ちすると、エラーも出ずに別の値を読みます。

頭の長さは決まっていない

IPv4 の頭の最小は 20 バイトですが、オプション (追加の欄) が付くと長くなります。RFC 791 の IHL は、頭の長さを語の数で書き、データの始まりを指す欄です。20 バイトと決め打ちした読み方と、IHL を読む読み方を比べます。

動かす 頭の長さを決め打ちする

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

決め打ち (257, 256)
IHL 24 (50000, 9999)

決め打ちの読み方は、オプションの 4 バイト (何もしない印の 01 を 3 つと終わりの印の 00) をポート番号として読み、257 と 256 を出しました。IHL を読めば、24 バイト先の正しい 50000 と 9999 が出ます。

1 枚に入る大きさには上限がある

RFC 894 は、Ethernet で送る IP のデータグラムの最大を 1500 バイト、データの欄の最小を 46 バイトとしています。頭の割合と、上限に入るかを数えます。

動かす 頭の割合と上限

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

    5    33 89.4% 入る
  100   128 29.6% 入る
 1472  1500  2.8% 入る
 1473  1501  2.8% 入らない

左から、データのバイト数、IP の長さ、頭の割合です。5 バイトでは 9 割近くが頭です。1473 バイトにすると IP の長さが 1501 になり、1 枚に入りません。そのとき何が起きるかは 4-2 で扱います。

5 バイトの例の IP は 33 バイトで、データの欄の最小 46 バイトに届きません。RFC 894 によると、足りない分は 0 で埋め、その埋め草は IP の長さの欄に数えません。受ける側は IP の頭の長さを見て埋め草を読み捨てます (上の割合は埋め草を数えていません)。

崩れる前提をまとめると、次の通りです。

  • 頭の大きさはいつも同じ。IPv4 はオプションで伸びる
  • どんな大きさでも 1 枚で送れる。IP の長さは 1500 バイトまで
  • 届いたバイトは全部が中身。短いフレームには埋め草が付く

仕事でどう切り分けるか

「つながらない」と言われたら、下の層から順に、どこまで届いているかを確かめます。

確かめる事道具の例主に見る層
相手の機械まで届くかping3
窓口 (ポート) が開いているかnc -vz 相手 4434
HTTP の応答が返るかcurl -I https://相手7

ping は ICMP (IP の一部として働く連絡用の決まり、RFC 1122) の echo (8 番) を送り、echo reply (0 番) が返るかを見ます (RFC 792)。ポート番号を使わないので、ping が通っても 4 層より上が動いているとは限りません。ICMP を通さない網もあるので、通らないだけで「落ちている」とも決めつけません。

切り分けの読み方は、次の通りです。

  • ping が通り、ポートにつながらない (Connection refused など) なら、4 層より上を疑う。プログラムが止まっているか、別のポートで待っている
  • ポートにはつながり、HTTP が 500 番台を返すなら、7 層のプログラムの中を疑う
  • 名前で呼ぶと失敗し、IP アドレスで呼ぶと通るなら、名前を引く DNS (7 層の仕組み) を疑う。中身は 4-4 で扱う

この順なら、担当に「3 層までは届き、443 番が閉じている」と一言で渡せます。

関わる実例

症状が出た層と、原因のある層が違うことがあります。層に分けて考えると、この食い違いに気付けます。

Meta (Facebook) の全面停止 (2021年10月4日)

Meta の技術ブログの 2021年10月5日の記事によると、前日の停止は、データセンターをつなぐ基幹の網の保守で出した命令が、基幹の網のつながりをすべて落としたことから始まりました。命令を止めるはずの点検の道具には不具合がありました。

切り離された DNS のサーバーは、自分への道筋の案内 (BGP の広告) を取り下げました。記事は、DNS のサーバーはまだ動いていたのに外から届かなくなったと書いています。

症状は「名前が引けない」という DNS の困りごとでしたが、原因はその下の、届く道筋の側にありました。崩れた前提は「名前が引けないなら DNS のサーバーが壊れている」です。

よくある問い

OSI参照モデルの覚え方はありますか

上の層から頭の字を取った「アプセトネデブ」がよく使われ、試験で名前と番号を問われるときに役立ちます。仕事では、名前より「その層の頭に何が書いてあるか」を覚えておく方が、切り分けに効きます。

OSI参照モデルと TCP/IP は、どちらを覚えればよいですか

両方の対応を覚えるのが近道です。動いているのは TCP/IP の 4 層ですが、現場では「L3」「L7」のように OSI の番号で層を呼ぶことが多いからです。アプリケーション層が OSI の 5〜7、リンク層が 1〜2 と押さえておけば、どちらの言い方にも付いていけます。

MAC アドレスと IP アドレスは何が違いますか

MAC アドレスは 2 層の番号で、同じ網の中の、すぐ隣の機器に渡すときに使います。IP アドレスは 3 層の番号で、網をいくつもまたいだ先の、最後に届ける相手を指します。網をまたぐたびに、ルーター (3 層で道を選ぶ機器) が外側の 2 層の頭を付け替え、IP の宛先はそのまま運ばれます。同じ網の中で MAC アドレスを見て配るのがスイッチ (2 層の機器) です。

確認クイズ

答えだと思う選択肢を押すと、その場で正誤と理由が開きます。4 問すべてに正しく答えると、この回は修了で、石が緑に変わります (この端末のブラウザに残ります)。間違えた問いは、あとから解き直せます。

1 問目

OSI参照モデルのネットワーク層 (3 層) の説明として、正しいのはどれですか。

2 問目

このコードを動かすと何が出ますか。

IPv4 の頭の形の大きさ

import struct
f = "!BBHHHBBH4s4s"
print(struct.calcsize(f))

3 問目

あるサーバーに ping は通るのに、nc -vz で 443 番につなぐと Connection refused が返りました。まず疑うのはどこですか。

4 問目

TCP/IP の 4 層のうち、アプリケーション層は OSI のどの層にあたりますか。

説明課題

次のことを、自分の言葉で 3 行にまとめてください。書いたら、下の模範解答を開いて比べてください。

  • データが送られるとき、層ごとに何が足され、受ける側で何が起きるか
  • 「Web の画面が開かない」と言われたとき、どの順で、何を確かめるか

模範解答

自分の説明を書いてから開いて、比べてください。

この回の先の一歩

サーバーやアプリが「つながらない」と言われたとき、どの層で止まっているかを先に決めると、調べる場所と頼む相手が絞れます。

もっと深く

この回の続きを、ゆめさくのコースの章や道具で深められます。頁の中の確認クイズに答えたあと、手を動かす量を増やしたいときに使ってください。

一次資料

どれも 2026年10月27日に開いて、題と中身を確かめました。

次へ

道 4 ネットワークと暗号の回

  1. 4-1層に分けて考えるOSI、TCP/IP、パケットこの回
  2. 4-2IP とサブネットIP アドレス、CIDR、ルーティング頁で読む
  3. 4-3TCP と UDP再送、輻輳制御、ポート頁で読む
  4. 4-4HTTP と DNSHTTPS、HTTP/3、名前解決頁で読む
  5. 4-5TLS と暗号の基礎共通鍵、公開鍵、ハッシュ、署名頁で読む

道 4 の頁へ戻るほかの道を見る