賢くなりたいトイプードルの日記

データサイエンス系の話をメインにしていきます

通信の基礎の基礎、OSI参照モデルに入門

現在のデファクトTCP/IPだが、今でもネットワークエンジニアはOSI参照モデルをもとに話をするらしい。それだけ優秀なモデルだということだろう。

ということでOSI参照モデルについて勉強してできるだけ短く説明してみた。

OSI参照モデルなぜ階層化されているのか

OSI参照モデルでは通信処理を7つの層に分けている。人間に近い方から

という構成になっているわけだが、このように階層化している理由は、それぞれの作業を得意なやつに特化させたほうが効率が良いということと、エラーやバグや処理時間の遅さといった不都合があった場合、その原因がどこの層にあるかを特定できればそこにフォーカスして修正・改善すれば良いからである。

ちなみにそれぞれの層は以下のような仕事を行う。WEBブラウザを使うときの通信を例にとっている。

7層 アプリケーション層 … 打ち込んだURLをプレゼンテーション層以下が処理できる形に変換

6層 プレゼンテーション層 … 渡された文字列が文字化けしないように変換。(文字コードや画像、動画などの表示形式を変換)

5層 セッション層 … webブラウザとwebサーバー間で論理的な通信路(セッション)を確立・維持・終了する。webブラウザを開きながらメールアプリでメールを送信した場合に、webブラウザにメールサーバからのデータを送信されないようにするための層

4層 トランスポート層 … ケーブルの中の電気信号や光信号がノイズなどによって波形が変わったりして元のデータが破損したり欠損したりしないようにしたり、また破損・欠損した場合にもう一度送ってもらったりする。

3層 ネットワーク層 … LANごとの番号(論理アドレス)をもとに送信する機器が属するネットワークを識別して、経路を選択して、データを送信する。

2層 データリンク層 … 隣接する機器間の通信を可能にするための層。ネットワーク層では論理アドレスをもとにLANを識別していたが、データリンク層ではMACアドレスをもとに識別する。具体的にはデータを送り出すタイミング、データのエラー検出と対処方法、データの構造、データの送信元、宛先の識別方法を定める。

1層 物理層 … ビットを信号に変換したり、信号をビットに変換する層。実際にケーブルなどにデータを送る場合は、「0」と「1」の羅列を電気信号や光の点滅などに変換する。

カプセル化とは

異なるコンピュータ間のやり取りは各層ごとに行われている。

たとえばAというコンピュータのアプリケーション層と、Bというコンピュータのアプリケーション層がやり取りをする。

しかし実際につながっているのは信号を送受信できる物理層のみ。ではデータリンク層より上の階層はどうやってやり取りをしているのか。

それは下の層にデータの送信を依頼することによって行うことができる。

具体的には、まずアプリケーション層がデータを処理してプレゼンテーション層に

「はい、これ処理したデータ。」

データにはL7ヘッダー(目印)がついている。それをプレゼンテーション層は受け取って、さらに下のセッション層に

「はい、これ処理したデータ」

と依頼。プレゼンテーションからのデータにはL7ヘッダーとL6ヘッダーがついている。セッション層は下のトランスポート層

「はい、これ処理したデータ。」

このデータにはL7ヘッダーとL6ヘッダーとL5ヘッダーがついている。このようにヘッダーをつける作業を「カプセル化」という。

データリンク層から物理層にデータを渡す際には、ヘッダーを追加すると同時に、トレイラも追加する。トレイラにはデータのエラーをチェックするための情報が記録されている。

そして物理層は、処理したデータを、ヘッダーと一緒に信号を通じて相手のコンピュータに送信。

カプセル化とは

データを受信した相手のコンピュータの物理層データリンク層にたいして、

「はいこれ処理したデータ。」

と伝える。データにはL2 〜 L7ヘッダと、トレイラがくっついている。受け取ったデータリンク層は「L2 〜 L7ヘッダが付いてるってことは俺宛のデータだな」と判断して、ネットワーク層に対して

「はいこれ処理したデータ。」

と処理したデータを送る。データにはL2 〜 L6ヘッダがくっついている。データリンク層は「L2 〜 L6が付いてるってことはわたし宛のデータね」と判断してデータを処理する。このように一番上のアプリケーション層まで伝えていく。

このヘッダーをとっていく作業のことを「非カプセル化」という。

このようにして、異なるコンピュータ間の各層のやり取りが成立する。

階層によってデータの呼び方が違う

情報の先生に、ネットワークに流れるデータのことを「パケット」と呼ぶと教わったのだが、あれはでまかせだったようだ。

実際には階層によってデータの呼び方はちがい、

データリンク層ではフレーム、ネットワーク層ではパケット、トランスポート層ではセグメントと呼ぶらしい。