OSI参照モデルとネットワーク上のデータの流れや構造についてのまとめ

# この記事の目的

ネットワークの勉強はプログラミングと違い概念的な話が多く、理解するのに時間がかかってしまうかと思います。また、普段の業務ではあまり触れることがなく知識が定着しないという方も多いのではないでしょうか。私もそのひとりです。

今回は自分の知識を定着させる意味も込めて、ネットワークを理解するうえでの必須科目__「OSI参照モデル」__や__ネットワーク上のデータ__に関する内容をまとめました。「ネットワークについて何も知らない人」が読んでも理解してもらえることを目標に、できるだけ簡単に書いてみました。

何か間違いなどありましたらご指摘いただけると助かります。

# もくじ

 - [OSI参照モデルってなに？](#osi参照モデルってなに)
 - [ネットワーク上のデータの流れ](#ネットワーク上のデータの流れ)
 - [ヘッダ部とデータ部](#ヘッダ部とデータ部)
 - [カプセル化](#カプセル化)

# OSI参照モデルってなに？

OSI参照モデルとは、簡単に言えば__ネットワーク通信するときの手順を７つに分けたルール__です。
この７つの手順は階層化されているため、それぞれ「◯◯層」という名前がつけられています。

![スクリーンショット 2019-03-17 18.15.08.png](https://qiita-image-store.s3.amazonaws.com/0/238891/e400cb37-dbe0-467e-3b54-104f37252e40.png)

### ネットワーク通信の共通ルール

もともと、OSI参照モデルは__ネットワーク通信の共通ルール__として作られました。

英語しか話せない人に日本語で話しかけても意思疎通ができないのと同じように、ネットワークの世界でもお互いに異なったルールを持っていると通信ができません。昔は Apple や IBM などのメーカーが独自の通信ルールで通信を行なっていたため、同じメーカーの機器同士でないと通信できなかったようです。

そこで、世界中の通信機器がメーカーに関わらず通信できるように国際標準化機構（OSI）という組織が作った世界共通ルールがOSI参照モデルです。

簡単に言えば__「このルールに従っていれば、どんな機器でも通信できるよ！」__的な存在です。

### エンジニア同士の共通言語

しかし実際のところ、現在OSI参照モデルに準拠した通信機器は作られていません。歴史的な経緯から、OSI参照モデルではなくTCP/IPモデルという別のルールが使われるようになりました。

それでも、ネットワークの構築や障害対応などでネットワークについて議論されるとき、OSI参照モデルを基準として語られることが多いようです。実際には使われていないからと言って軽視せず、しっかり理解する必要があると言えます。

OSI参照モデルは__エンジニア同士の共通言語__とも言えるかもしれません。

# ネットワーク上のデータの流れ

ネットワークを利用してデータを送受信するとき、データはOSI参照モデルの各層を通過するようになっています。

送信するときは第７層から第１層へ、受信するときは第７層から第１層へ向かってデータが流れていきます。
（OSI参照モデルが階層構造になっているのは、きっとデータに決まった流れがあるからですね。）

![スクリーンショット 2019-05-02 16.57.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238891/6d255643-808f-fa98-d877-65f9aca9edda.png)

各層の具体的な働きについては割愛しますが、「◯◯層を通る」ということは__「データを送る準備をしている（送信側の場合）」__と考えてください。データを送ろうと思っても、当然ながらそのままの状態で送ることはできません。各層は自分の与えられた役割に従いデータをネットワークに送る下準備をして次の層へデータを渡しているのです。

### データの送信から受信までの流れ

データが送信されてから受信されるまでの大まかな流れは以下のようになっています。

__送信側__

1. ユーザーが通信を開始するアクションを行う（メールの送信やウェブサイトへのアクセスなど）
2. アプリケーション層から物理層へ向かって、各層がデータを送る準備をする
3. 物理層まで到達したら、データを電気信号へ変換してネットワークへ送り出す

__受信側__

1. 物理層が受信した電気信号を元のデータ形式に戻す
2. 物理層からアプリケーション層へ向かって、各層がデータを取り出す処理（非カプセル化）を行う
3. データがアプリケーション層まで渡ってくると、受け取ったデータの中身を確認することができる

# ヘッダ部とデータ部

データを正確に宛先まで送り届けるには、様々な情報が必要になります。例えば、ネットワーク上の自分の住所や相手の住所、分割して送ったデータを元に戻すための情報、データが壊れていないか確認するための情報など...。各層はこのような固有情報を__ヘッダ__という形でデータの先頭にくっつけていきます。

データの中でヘッダが保存されている部分を__ヘッダ部__、相手に送りたいデータそのものが保存されている部分を__データ部__と言います。

![スクリーンショット 2019-05-02 14.39.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238891/be8c890c-ed85-31a5-8d65-1e3f672eb819.png)

ヘッダ部には、各層に与えられている役割を果たすために必要となる情報が入ります。

例えば、ネットワーク層で付与されるヘッダ（IPヘッダと言います）の中には送信元IPアドレスや宛先IPアドレスが含まれています。IPアドレスはネットワーク上の住所を示してくれる情報と思ってください。そしてネットワーク層の役割は「ネットワーク同士を繋ぎ合わせること」です。その役割を果たすために必要な自分の住所（送信元IP）と宛先の住所（宛先IP）をヘッダ部に入れています。IPアドレスがヘッダとしてデータにくっついていることで、初めて宛先ネットワークまでデータを運ぶことができるようになるのです。

# カプセル化

データにヘッダを付与するとき、同時に__カプセル化__という処理も行われています。

__カプセル化__とは、前の層から受け取ったヘッダ付きのデータをすべてデータ部として扱い、そこに新たなヘッダをくっつけたデータを作る処理のことです。次の層にとって関係のないヘッダ情報をデータ部の中に隠してしまうのです。

![スクリーンショット 2019-05-02 14.28.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238891/4c5371d8-e694-d42c-aac3-f9d9a78206b3.png)

物理層以外のすべての層でヘッダが付与されますので、データには最大で６つのヘッダが付与されることになります。しかし、このカプセル化によって１つ上の層で付与されたヘッダしか見えないようになります。例えば、物理層に届いたデータは「データリンク層で付与されたヘッダ部＋データ部」で構成されています。本当はデータ部の中に他のヘッダも入っているのですが、これを物理層は認識できません。物理層にとって不要な情報を見えないようにしてしまうことで、不要な処理を減らし、処理を効率化しているのです。

なお、データを受信するときはカプセル化とは逆の処理（非カプセル化）を行い、ヘッダを取り除く処理を行います。すべてのヘッダを取り除くと、最終的に欲しいデータが手に入る仕組みとなっています。

# まとめ

 - OSI参照モデルはネットワーク通信の標準ルール
 - 送信するときは第７層から第１層へ、受信するときは第１層から第７層へ向かってデータが流れている
 - データはヘッダ部とデータ部から構成されており、ヘッダ部にはデータを正確に宛先へ送り届けるための様々な情報が入っている
 - 関係のないヘッダ情報を隠蔽するため、カプセル化という処理を行い、処理を効率化している