OSI参照モデルまとめ

#何故書いたのか
Webエンジニア社会人1年目として働くが、いまだネットワークのことに関して何も知らない状態であるため、[3分間ネットワーキング](http://www5e.biglobe.ne.jp/aji/3min/)を読み、webエンジニアでも最低限知っておくべきネットワークの知識についてちょっと知ったのでアウトプットとして書きました。

#OSI参照モデルとは
OSI（Open System Interconnection）参照モデルとはISO（国際標準化機構）が決めた異なるベンダ感で相互通信するための「ネットワーク・モデル」と言われる統一規格のこと。
OSI参照モデルは、コンピュータなどの通信機器の通信機能を階層構造を分割したモデルで、実際には以下の画像にあるように通信プロトコルを7つの階層に分けて定義している。

![OSImdo;.gif](https://qiita-image-store.s3.amazonaws.com/0/130302/0b872bab-378d-6dcd-7ac7-2a361f7d152f.gif "OSImdo;.gif")


ちなみに現在は「TCP/IPモデル」がネットワークモデルのデファクトスタンダードとなっているが、ネットワークエンジニアが設計、構築、障害対応などでプロトコルに関して議論する場合はOSI参照モデルに基づいて話をすることが一般的なのでこれを知ってないとネットワークエンジニアとは話が出来ないということになるので知っておかなきゃ死ぬらしい。

#OSI参照モデルでのデータのカプセル化、非カプセル化
OSI参照モデルは各層にそれぞれの通信に関する規定を定めておりその規定に従ったデータを作るために、第7層から第1層の順で各層で送り主や宛先などの情報を梱包していく。
この梱包していくことを **カプセル化** という。
また逆に、送り先のコンピュータは送られたデータを開封していかなければならない。
この開封していくことを、 **非カプセル化** と言う。

詳しいカプセル化の画像はこちら↓



【送信側カプセル化】
![送信側カプセル化.gif](https://qiita-image-store.s3.amazonaws.com/0/130302/7249a8b2-53e9-6152-51f6-723b548fbc48.gif "送信側カプセル化.gif")


【受信側カプセル化】
![受信側カプセル化.gif](https://qiita-image-store.s3.amazonaws.com/0/130302/88221e66-458b-210d-a9d1-284552f6d628.gif "受信側カプセル化.gif")






引用： [OSI reference model](http://www.infraexpert.com/study/networking3.html)


ちなみに各レイヤーごとにカプセル化されたデータの呼び名は違う。

|レイヤ| データの呼び名 |
|:--:|:--:|
|レイヤ7~5| データ |
|レイヤ4|セグメント|
|レイヤ3|パケット|
|レイヤ2|フレーム|
|レイヤ1|ビット|

#レイヤーごとの規定

##レイヤー1：物理層
 **ビット列を電気信号に変換するための規定がされている。**
レイヤ1はレイヤの上位層から送られてきたデータのビット列を電気信号に変換する役割を担っている。つまり、実際に回線（銅線、光ファイバー、無線LANなど）を通してアナログ信号やデジタル信号を使用し、通信を行おうとしている層となる。
　この信号を送る際に障害が起きることがある。
それが、 **減衰** 、 **ノイズ** 、 **衝突** である。これらはケーブルを伝う時の抵抗によって起きるものであるが、それには以下のような原因がある。

- すぐ隣の銅線に信号が流れている。（ **クロストーク** ）
-  熱雑音
-  AC電源がそばにある
- 雷や無線、蛍光灯などがそばにある（EMI/RFI）


これらの抵抗をなくし、より多くの機器をつなぐことを可能にしているのが、次に紹介する **リピータ** 、 **ハブ** というネットワーキングデバイスだ。

　ちなみに、先程述べた抵抗が起こっているのはLANを実際に繋いでいるケーブルの部分。ケーブルの種類は主に同軸、UTP、光ファイバの3つが挙げられる。実際にLANで多く使われているのは、UTPと光ファイバらしい。


###ネットワーキングデバイス
####リピータ
弱まったりノイズが入った信号を、 **増幅や整形** をしてもとの信号と同じ強さ、同じ形に戻す役割を担っている。
要するに **信号増幅機** のような働きをしている。
ただ、あとに説明するスイッチやルータのように制御はせず、ただ信号を **増幅する** だけの働きをしている

####ハブ
 **リピータと同じく信号を増幅や整形をする役割を持ちながら、多くの機器とつなぐことができる。** 
なので別名マルチポートリピータとも言われている。
信号の動きとしては、ブロードキャストで送られる。

ただ、これも制御は行わないので、コンピュータとハブをつなぎすぎると衝突ドメインが発生してしまうので、連続してつなげていいのは、4つもしくは2つまでとされている。

##レイヤー2：データリンク層
 **直接的に接続されたノード間の通信のための規定がされている。** 
具体的に何をしているのかというと、パケットに対して誰に対して届けるのかということを明確にするためのデバイスを識別するための識別子を付けて（ **アドレッシング** と言う）、パケットからフレームにしている。

これらの作業には、レイヤー2内の **論理リンク制御副層（LLC）** と **メディアアクセス制御副層（MAC）** の2つを通る。
 **LLC副層は、アドレス、エラー制御情報などのリンク制御用の情報が付け加えられる。** 
 **MAC副層は、メディア・アクセス用の制御情報を更に付加している。
これらの作業を通して、パケットをフレームにしている。** 

また、これら作業の中で特に重要なのがアドレッシングをすることである。 **レイヤ2におけるアドレッシングは物理アドレスを付加することだ。** 物理アドレスとは、メディアに直接接続されている誰に届けるかを識別するための機器の固有番号のことである。この固有番号はNICが作られた段階で決定されている。
ただ、このMACアドレスは、実際の位置と無関係なのでインターネット上の場所を特定することは出来ない。したがって、実際に活用するためにはレイヤ3で付加される論理アドレスと一緒に使用しないと何処にネットワークにあるどの機器かと言う情報はわからない。

で、レイヤ2におけるアドレッシングとは具体的には宛先MACアドレスと送信元MACアドレスをフレーム情報として付加することだが、宛先MACアドレスについては信号を送って取得しないといけない。
イーサネットの場合、全ノードに届くブロードキャスト型のネットワークなので、全ノードに対してキャリア信号を送るが、この送る制御方式は **CSMA/CDアクセス制御方式** を使用する。CSMA・CDアクセス制御方式の具体的な手順は以下だ。

- キャリア信号があるかどうかチェックする(CS)。
- なければ一定時間待ってから送信する(MA)。
- 衝突が発生したかどうかチェックする(CD)。
- 発生した場合、少し待ってから再送する。(バックオフ)。

とは言え、イーサネットではコリジョンが発生してしまう可能性がある。
というのも通信をした場合に **リピータ内は一本の銅線** となってしまうのでリピータ内部でコリジョンが発生する。
これを解決するのが、レイヤ2のネットワーキングデバイスのブリッジである。

###ネットワーキングデバイス
####ブリッジ
 **衝突ドメインのようなネットワークの区切りをセグメントという** が、 **２つのセグメントを繋げるのがブリッジの役割** である。
種類はソースルート、トランスペアレント、変換、エンキャプスレーションの４種類のブリッジがある。

また、 **MACアドレスフィルタリングの役割** も担っている。
MACアドレスフィルタリングとは以下のことを指す。

- 宛先が同一セグメントの場合、他のセグメントへそのデータを流さない。
- 通過したフレームのMACアドレスを読み取り、アドレステーブルを作成する。

これらの働きによって、 **衝突ドメインを分割し、ネットワーク全体のトラフィックを減らしている。** 

欠点はブリッジでフレームを読み込む時間が一定時間かかるということと、ブロードキャストでの通信が来た場合は止めれないということ。
 

####スイッチ
スイッチはスイッチングをしているデバイス。
基本的にブリッジと同様な働きをしているが、異なる点は、マルチポートという点。ブリッジは異なるネットワークにフレームを送信するか送信しないかだけを判断するデバイスだったが、 **スイッチは所持しているアドレステーブルを参考にして送信元と宛先が1対1で接続されているような状態にすることができる。** 
また、スイッチは宛先がかぶった場合などに生じてしまうコリジョンを避ける **ストアアンドフォワード方式** をしようすることによって衝突を防ぐことが出来る。 **ストアアンドフォワード方式はスイッチ内にあるバッファメモリを利用して、送信するものがかぶった場合に蓄積するシステムのことを指す。** 
このストアアンドフォワード方式によって、スイッチではCSMA/CDを無視する事ができる。
また、複数のデバイスが同時に送信をする事が可能になる。

ただ、欠点はブリッジと同じくフレーム読み取り時間分だけ遅延が発生してしまう事と、ブロードキャストを止めることが出来ないことが挙げられる。


##レイヤー3：ネットワーク層
 **ネットワークとネットワークを相互通信するための規定を定めている。** 

ここで重要になるのが、 **論理アドレス** だ。
レイヤ2では物理アドレスを取得し、どの機器と言う情報（MACアドレス）は獲得することが出来たが、それが **何処にあるかと言った情報の論理アドレス（IPアドレス）** はまだ獲得することが出来ていなかった。それをレイヤ3で取得していく。

IPアドレスはネットワークの中でユニークな物でないと行けないので、ICANNとNICと言う団体が割り振りなどの管理を行っている。

IPアドレスの決定の仕方は2つある。
一つ目はIPアドレスを管理者から教えてもらい手動で入力する方法。
もう一つはネットワークに接続された時点で、自動的にIPアドレスを取得する方法もある。
前者のIPアドレスを **静的IPアドレス** 、後者を **動的IPアドレス** と呼ぶ。

静的IPアドレスは手動で行うのでいいが、後者の **動的IPアドレスは通信をして割り当てられなければならず** 、通信方法にはいくつか方法が存在する。その代表的なものとしてはRARP、BOOTP、 **DHCP** というプロトコルが使われるが、最も使用されているDHCPの特徴について以下に述べる。

 - 各クライアントはDHCPサーバが持つアドレスプールから、IPアドレスを割り振ってもらう。
 - IPアドレスを割り振る際には、リース期間を設定する。
 - DHCPの動作は以下のように行われる。
  - クライアントがサーバーを見つける
  - サーバは候補のアドレスを送る
  - クライアントは正式な要求を送る
  - サーバがそれを認める
 - これらのやり取りはブロードキャストを使用する。

このような特徴、通信をして送信元IPアドレスを決定する事ができる。

宛先IPアドレスについてはURLをユーザーが入力した時にDNSに問い合わせて取得していくということになる。

また **送信元MACアドレスについては、NICを取り付けた段階で割り振られており** 、**宛先MACアドレスについてはARP（Address Resolution Protocol）を使用してARP要求を出し、ARP応答が帰ってきて取得する** 。（ちなみにこの送信元MACアドレスと宛先MACアドレスはレイヤ2でパケットに対して付加されるものなので注意。）

###ネットワーキングデバイス
####ルータ
インターネットワークでのデータ転送において経路選択（ルーティング）が必要だが、 **ルータがルートを決定する役割を担っている。** 
ルータが持っている特徴として、 **ルータ自身の各ポートはそれぞれのネットワークに所属していてそれぞれの論理アドレスを持っている** 。更に **ルーティングテーブル** と言うものも持っており、そこに「宛先ネットワーク」、「次の中継ルータ」、「距離」、「送信ポート」の情報をストックしている。それをもとに目標のノードに対する最適距離を見つけ、ルーティングを行っている。

他の特徴として、ルータはブロードキャストを他のネットワークに流さない。ブロードキャストが届く範囲のことを、ブロードキャストドメインというが、ルータはそのブロードキャストドメインを分けることができる。なので、全てのノードに送らずにパケットを届けることが出来る。

話は変わってそもそもルーティングテーブルを作るために他のネットワークのルートを知る必要がある。
知る方法は2つ有り、 **静的ルーティング** と **動的ルーティング** がある。
静的ルーティングは **管理者が手動でルートを入力して経路決定をする** パターンでこのルートが存在した場合、動的に設定されたルートよりも優先される。
動的ルーティングは **ネットワーク上のルーター同士が互いにルート情報を交換し合い、ルーティングテーブルを作成している。** この場合交換し合った情報から最適（最短ではない）なルートが選択されたり、障害が起きても切り離すことが可能であったりする。しかしながら、すべてのルータが同一のルート情報を持っている状態（この状態を「コンバージェンスに達する」という）でなければならず、その際の帯域幅や処理能力などが必要となってくる欠点もある。
ちなみにこの動的ルーティングのプロトコルはルーティングプロトコルが設定される。

またルータはデータを送信した際に宛先IPアドレスがルーティングテーブルにない場合にエラーメッセージを返信するが、その時に **ICMP(Internet Control Message Protocol)と呼ばれるエラー報告プロトコル** を使用する。ICMPでエラー返信をする際のデータの内容は **IPヘッダ＋ICMPメッセージの形でカプセル化** される（これによりレイヤ4以上で格納されたデータによってエラーが起こることはない、つまりレイヤ3回りのエラーを調べることが容易になる）。
で、そのICMPメッセージの中にはエラーのタイプが数種類存在するが、大きく分けてQueryとErrorの2種類のメッセージがある。以下5種類のタイプを理解すればOK。

- タイプ0:Echo Reply(Echo応答)
- タイプ8:Echo Request（Echo要求）
 - エコ要求を受け取ったデバイスは、エコー応答を返す。
 - エコー要求に対し、エコー応答が帰って来れば、その相手は接続されていることを示す。
 - エコー要求は **pingコマンド** を使って実行する。
 - ping によりレイヤ3以下の障害を確認することができる。
 - pingは近い場所のデバイスから行ったほうが、障害を確認し易い。
- タイプ3:Destination Unreachable（宛先到達不能）
 - 宛先のネットワーク・ホストへパケットが届かなかったことを通知する。
 - コードによってその原因がわかる。
- タイプ5:Redirect（最適経路通知）
 -  より最適なルートがあった場合、ホストにそれを通知する。
- タイプ11:Time Exeeded(時間超過によるパケット破壊)
 - パケットが無限にネットワーク内を巡回しないように設定したTTL（Time To Live）の値が0になった場合に帰ってくるエラー。
 - TTLは通過できるゲートウェイの数のこと。

と、このようなエラーメッセージを返す。
ICMPはDOS攻撃（サービス妨害）にも使われるので管理者は運用に注意する必要がある。

##レイヤー4：トランスポート層
 **ノード間のデータ転送の信頼性を確保するための規定を定めている。** 
具体的には、 **確認応答（ACK：Acknowledgeの略、SYN、FIN）、フロー制御（溢れないようにバッファに保留するなど）を行い、信頼性の高いデータ転送** を行っている。
また、レイヤ3以下のお陰でデータが宛先ホストまで届くようになっているが、レイヤ4は更にその先の **ホストの、どの通信アプリケーションへのデータか** と言うところを判別するためにヘッダに **ポート番号** がつけられる。また、セグメントに関しては分割することがあるのでそれぞれに **シーケンス番号（順番番号）** がつけられている。

プロトコルは **TCP** もしくは **UDP** が使われる。
TCPでのデータ転送には **コネクションの確立** が必要となる。
コネクションの確立には **スリーウェイハンドシェイク** と呼ばれる手法が使われる。スリーウェイハンドシェイクは最初にSYNを送り、次にACKを送り互いに確認が取れたらコネクションの確立となる。クライアント側から順に **【(ｸ)SYNを送る→(宛先)ACK＋SYNを送る→(ｸ)ACKを送る】** といった順に確認応答を取る。ちなみに、コネクションが確立した状態を **ESTABLISHED** の状態と言う。
また、終了する際にもスリーウェイハンドシェイクを行う。順番は **【(ｸ)FINを送る→(宛先)ACKを送る、(宛先)FINを送る→(ｸ)ACKを送る】** の順でコネクションをCLOSEDにする。

TCPではスリーウェイハンドシェイクでコネクションが確率でき次第、セグメントの送信をするが、 **セグメントは分割して送られる。** その分割したものを一気に送ってもデータを保留できるバッファが溢れてしまうことがある（ **バッファフロー** ）。このバッファフローを防ぐために **ウインドウ制御** というものを使用する。バッファの容量はそれぞれ宛先によって異なるので、スリーウェイハンドシェイクの際、ACK送信後の、SYNが帰ってきた時に付随したウインドウサイズ（バッファの容量）を知ることができるので、その容量によって送るセグメントを変えて送信していく（ **スライディングウィンドウ** ）。
ちなみに宛先側が分割されたセグメントを順番通りに受け取らなかったとしてもシーケンス番号により並べ替えたりするので正確かつ確実にセグメントを送ることができる。

また、以上にあるフロー制御の他に確実に届けるための制御がもう一つある。データを送る際にバッファローを起こす前にネットワーク自体に負荷がかかり、パケットが破棄される事がある。これを **輻輳** と呼ぶがTCPにはこれを防ぐために **輻輳制御** を行う。
方法は **スロースタートアルゴリズム**と言うものを使うが以下のような挙動を行う。

- 送るセグメント数を1から順に増やしていく。
- 輻輳が発生したら、送る数を減らし、連続して輻輳が発生しないようにする。

 **輻輳制御とフロー制御は同時に行われるのでかなり確実性・正確性の高いプロトコル**となっている。

UDPはヘッダ小さく、TCPのようなスリーウェイハンドシェイクのような確認作業などを何もしないのでかなり高速性が高く、リアルタイムな遣り取りをすることができるプロトコルとなっている。
TCPは信頼性の代わりに、 **スループット（一定時間に送るデータ量）** の低下を巻き起こしてしまうのでこれを解消しなければならないときにはUDPが使用されるが、信頼性がないのが欠点としてある。

これらTCP、UDPの通信のがどのように行われているのかは **netstatコマンド** で見ることができる。また、ポートの状態までもしらべることができるので、エラーがTCP付近でえらーがでたらnetstatコマンドを使用すると良い。

TCPとUDPの説明をしたが、レイヤ4にはもう一つ **ホストの、どの通信アプリケーションへのデータかを判別するためのポート番号** が大きな役割を果たしている。

通信はそもそもアプリケーションとアプリケーションの間で行われるが、どのアプリケーションかは以下の代表的な **ポート番号** で識別される。

|ポート番号|アプリケーション|
|:--:|:--:|
|20,21|FTP|
|23|telnet|
|25|SMTP|
|53|DNS|
|67,68|DHCP|
|80|HTTP|
|110|POP3|
|161,162|SNTP|

これらは宛先のポート番号として決定してあるが、送信元のポート番号に関しては1024番以上でユニークなかつランダムな数字が使用される。

##レイヤー5：セッション層
 **通信プログラム間の通信の確立、維持、終了の規定を定めている。** 
例として、一つのコンピュータ上でメーラーを起動させて通信しているとする。セッション層では例えば、webブラウザで送受信しているデータをメーラで送受信しないように各アプリケーション同士の論理的な経路を制御している。
このような働きをしているがよくセッションとコネクションを同様のものと勘違いしやすい。
コネクションはデータを送る、セッションはただ会話を成立させるものとおぼえておけばOK。

##レイヤー6：プレゼンテーション層
 **文字コードなどのデータの表現形式の規定を定めている。**
例えば、ASCIIの文字コードを使っているコンピュータがEBCDICと言う文字コードを使っているコンピュータにデータを送る場合、送りつけた際に文字化けなどで読めないバグが起こったらいけないので、ASCIIのコンピュータもEBCDICのコンピュータも解読可能なデータとして送らなければならない。
その解読可能な共通言語に変えているのがレイヤ6のプレゼンテーション層である。
##レイヤー7：アプリケーション層
 **アプリケーションごとの固有の規定を定めている。** 
このレイヤ7より上にはユーザアプリケーションしかない。
レイヤ7は上のレイヤの代わりにユーザアプリケーションにネットワーク・サービスを提供するレイヤとなっている。


#まとめ
TCP/IPモデル周りのプロトコルについては、まだ勉強足らずなのでいっときしたらまとめようと思います。

#参考

- [3分間Networking](http://www5e.biglobe.ne.jp/aji/3min/index.html)
- [ネットワークエンジニアとして](http://www.infraexpert.com/study/study14.html)