OSI参照モデルとTCP/IP

# はじめに
* 新卒で入社をさせていただいた会社の課題図書で[Web技術の基本](https://www.amazon.co.jp/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E5%9B%B3%E8%A7%A3%E5%BC%8F-%E3%81%93%E3%81%AE%E4%B8%80%E5%86%8A%E3%81%A7%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8BWeb%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%B0%8F%E6%9E%97-%E6%81%AD%E5%B9%B3-ebook/dp/B06XNMMC9S)を読むこととなったので、そのアウトプットとして、本記事を書いています。
* [Web技術の基本](https://www.amazon.co.jp/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E5%9B%B3%E8%A7%A3%E5%BC%8F-%E3%81%93%E3%81%AE%E4%B8%80%E5%86%8A%E3%81%A7%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8BWeb%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%B0%8F%E6%9E%97-%E6%81%AD%E5%B9%B3-ebook/dp/B06XNMMC9S)以外にも合わせて、[マスタリングTCP/IP 入門編](https://www.amazon.co.jp/dp/B0827QNDNT/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)も読んだので、本記事にはそちらの内容も書いております。

# プロトコルとは
プロトコルとはコンピュータとコンピュータがネットワークを利用して通信するために決められた**約束ごと**のこと。
同じプロトコルを使用することでCPUやOSが違うコンピュータ同士でも通信することが可能になる。
代表的なプロトコルはTCP、IP、HTTPなどがあり、様々なプロトコルを体系的にまとめたものを**ネットワークアーキテクチャ**と呼ぶ。
**TCP/IP**もTCP、IP、HTTPなどのプロトコルの集合体で、**ネットワークアーキテクチャ**である。

# OSI参照モデル
ネットワークアーキテクチャに必要なプロトコルの組み合わせを考えるためのモデルがOSI参照モデルであり、**ISO(国際標準化機構)**が提唱をした。
OSI参照モデルは通信に必要な機能を7つの階層に分け、機能を分割することで、複雑になりがちなネットワークプロトコルを単純化するためのモデルのことである。

## OSI参照モデルの各層の役割
| 層       | 役割       |
|:-----------------|:------------------|
| アプリケーション層   |特定のアプリケーションに特化したプロトコル|
| プレゼンテーション層 |機器固有のデータフォーマットと、ネットワーク共通のデータフォーマットの交換|
| セッション層       |通信の管理。コネクションの確立と切断。トランスポート層以下の管理|
| トランスポート層    |両端ノード(ネットワークに接続されている終端のコンピュータ機器など)間のデータ転送の信頼性を提供する。|
| ネットワーク層      |アドレスの管理と経路の選択|
| データリンク層     |直接接続された機器間でのデータフレームの識別と転送|
| 物理層           |0と1を電圧の高低や光の点滅に転換する。コネクタやケーブルの形状の規定|

### アプリケーション層
アプリケーションの中で通信に関係する部分を定めている。ファイル転送(FTP)や電子メール(SMTP、POPなど)、遠隔ログイン(TELNET、SSH)などを実現するためのプロトコルがある。

### プレゼンテーション層
アプリケーションが扱う情報を通信に適したデータ形式にしたり、下位層からきたデータを上位層が処理できるデータ形式にしたりと、データ形式に関する責任を持つ。

### セッション層
コネクションの確立や切断、転送するデータの切れ目の設定など、データ転送に関する管理を行う。

### トランスポート層
宛先のアプリケーションにデータを確実に届ける役割を担っている。

### ネットワーク層
宛先までデータを届ける役割を担っている。
宛先は複数のネットワークがルーターでつながった先にある場合もある。
その止めのアドレス体系決めや、どの経路を使うかなどの経路選択の役割を持つ。

### データリンク層
1つのイーサネットに接続された2つのノード間での通信を可能にする。
0と1の数字の列を意味のあるかたまり(フレーム)に分けて、相手に伝える。

### 物理層
0と1の数字の列を電圧の高低や光の点滅に変換したり、その逆の電圧の高低や光の点滅をビットの列に変換したりする。

# TCP/IPの階層モデル
**TCP/IP**は基本的にはOSI参照モデルに当てはめることができる。
**TCP/IP**は**DARPA(米国国防高等研究計画局)**によって提唱された。

<table style="width: 100%;">
<tr>
  <th style="text-align: center;">OSI参照モデル 層</th>
  <th style="text-align: center;">TCP/IP 層</th>
</tr>
<tr>
  <td style="text-align: center;">アプリケーション層</td>
  <td rowspan="3" style="text-align: center;">アプリケーション層<br>DNS、URI、HTML、HTTP<br>TLS/SSL、SMTP、POP、IMAP、MIME<br>TELNET、SSH、FTP</td>
</tr>
<tr>
  <td style="text-align: center;">プレゼンテーション層</td>
</tr>
<tr>
  <td style="text-align: center;">セッション層</td>
</tr>
<tr>
  <td style="text-align: center;">トランスポート層</td>
  <td style="text-align: center;">トランスポート層<br>TCP、UDP</td>
</tr>
<tr>
  <td style="text-align: center;">ネットワーク層</td>
  <td style="text-align: center;">インターネット層<br>ARP、IP、ICMP</td> 
</tr>
<tr>
  <td style="text-align: center;">データリンク層</td>
  <td style="text-align: center;">ネットワークインターフェース層</td>
</tr>
<tr>
  <td style="text-align: center;">物理層</td>
  <td style="text-align: center;">ハードウェア</td>
</tr>
</table>

OSI参照モデルでは**「通信プロトコルに必要な機能は何か」**を中心に考えてモデル化されているの対して、TCP/IPの階層モデルでは**「プロトコルをコンピュータに実装するには動のようにプログラミングしたら良いか」**を中心に考えてモデル化されている。

### ハードウェア
**ハードウェア**とはイーサネットや電話回線などの物理層のことである。
使用する通信媒体はケーブルでも無線でもよく、通信する上での信頼性やセキュリティ、帯域、遅延時間などの制限なく利用できるようになっている。

### ネットワークインターフェース層
**ネットワークインタフェース層**は、イーサネットなどのデータリンクを利用して通信をするためのインタフェースとなる階層である。

利用するコンピュータのOSにデバイスドライバ(OSとハードウェアの橋渡しをするソフトウェア)をインストールすることで、ネットワークインターフェースを利用することが可能となる。

### インターネット層
インターネット層では**IP(Internet Protocol)**が使用される。
**IP**はIPアドレスをもとにして、パケットを配送する。
インターネットに接続される全てのホストやルーターは、必ずIPの機能を実装しなければならない。

#### IP (Internet Protocol)
ネットワークをまたいでパケットを配送し、インターネット全体にパケットを送り届けるためのプロトコル。
IPではそれぞれのホストを識別するための**IPアドレス**と呼ばれる識別子を使い、地球の裏側までパケットを届けることが可能である。

### トランスポート層
トランスポート層の役割はアプリケーションプログラム間の通信を実現すること。

* コンピュータ内部では複数のプログラムが同時に動作しており、どのプログラムとどのプラグらむが通信しているかを識別する必要がある。
  * 識別には**ポート番号**と呼ばれる識別子が使われる。

#### TCP (Transmission Control Protocol)
TCPは**コネクション型で信頼性のあるプロトコル**であり、両端ホスト間でデータの到達性を保証してくれる。
経路の途中でパケットが無くなったり、順番が入れ替わってもTCPが解決をしてくれるというメリットがあるが、コネクションの確立・切断を約7回もやりとりをするので、転送するデータの総量が少ない場合は無駄が多くなる。

#### UDP (User Datagram Protocol)
UDPはTCPとは異なり、**コネクションレス型で信頼性のないプロトコル**である。
送信したデータが相手に届いているかどうかのチェックはしない。
UDPは転送するデータの総量が少ない通信に向いている。

### アプリケーション層
ソフトウェアによる便利なサービスなどを付加するための機能を持っている。
インターネット上で技術を駆使して展開されている様々なサービスは、このアプリケーション層に属するプロトコルを利用しているものが多い。

具体的な機能としては、ファイルの転送、HTMLの閲覧、メールの送受信、ネットワークを介した時計合わせ（UNIXではプログラムの性質上、重要）、セキュリティの確保などがある。

# まとめ
* OSI参照モデルでは**「通信プロトコルに必要な機能は何か」**を中心に考えてモデル化されているの対して、TCP/IPの階層モデルでは**「プロトコルをコンピュータに実装するには動のようにプログラミングしたら良いか」**を中心に考えてモデル化されている。
* **TCP/IP**は基本的にはOSI参照モデルの7層のどこかに当てはめることができる。