図解！ネットワークの7層を実務に当てはめてみた

[ランサーズ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/lancers) 19日目担当の[@manamin0521m](https://twitter.com/manamin0521m)です！

サーバーサイド力を上げていくぞ💪という機運なのと、ネットワークがわからなくて詰んだことが立て続けにあったので、最近は[マスタリングTCP/IP 入門編 第5版](https://www.amazon.co.jp/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0TCP-IP-%E5%85%A5%E9%96%80%E7%B7%A8-%E7%AC%AC5%E7%89%88-%E7%AB%B9%E4%B8%8B/dp/4274068765)を読んでいます。そこで今回はこちらの本を読んで学んだネットワークについて紹介します。


ネットワークの勉強をする上で躓くのは以下の3点ではないでしょうか？
①知識がどう役立つのかよくわからない
②何に使われているのかわからない
③用語が難しくて覚えるのが大変

そこで今回の記事ではそれらのギャップを埋められればと思います。初学者の方対象です。

## ネットワークの知識がなくて困ったとき
・AWSの構成図がいまいち読めない
・ポートとIPアドレスの違いがいまいち説明できない
・IPアドレスを固有のものだと思いこんでいて認識がズレる
・雰囲気で```docker-compose up -d```している
・ルーターとハブの違いが説明できない

これらはOSI参照モデルの各層での役割がわかるようになったことで、以前より理解が深まりました◎
また新卒時の面接で「[リンクを押してからページが表示されるまでに何が起きてるか説明できる？](https://qiita.com/manamin0521/items/1df1ec65637ad1620329#osi%E5%8F%82%E7%85%A7%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E6%B5%81%E3%82%8C)」と二社くらいから聞かれたことをふと思い出したので、面接対策としてもOSI参照モデルを覚えることは有効かと思います。

## OSI参照モデルを図にまとめてみた
対応関係がわかりやすくなるよう図にまとめてみました。細かい用語は下記にて解説しますので対応させてみてください🙆※なおWeb系の企業でよく使われているものを中心に紹介しています。スマホからの場合は拡大して見てください。
<img width="950" alt="スクリーンショット 2020-01-27 13.28.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140595/5ceb103d-befb-41a5-2e63-c52b77a6125d.png">



なお、アプリケーション層側を上位層、物理層側を下位層と呼びます。
現在ではあまり使われていないものはカッコ書きで記載してあり、該当するものがない場合、空白になっています。

# 前提知識

### プロトコル
通信相手の同じ階層とやり取りするときの約束ごとです。
例えば日本語とイタリア語での会話は言語が違うので困難です。そこでやりとりするときは英語！というように取り決めることで、データをどの環境でも読み取り・書き込みできるようにします。
<img width="500" alt="プロトコル" src="https://lpi.or.jp/lpic_all/linux/images/img_network07.gif">
引用:[Linux道場ネットワーク編](https://lpi.or.jp/lpic_all/linux/network/network02.shtml)

### OSI参照モデルとTCP/IPモデルの違い
何を中心に考えてモデル化されているかが異なっています。

OSI参照モデル：通信プロトコルに必要な機能は何か
TCP/IPモデル：プロトコルをコンピュータに実装するには、どのようにプログラミングしたらいいか。

TCP/IPモデルがOSI参照モデルと大きく違うのは、アプリケーション層からセッション層といった3層が1層として捉えられている点です。コンピュータ自体はTCP/IPモデルで動いているのですが、OSI参照モデルが基本の考え方となるので、この記事ではOSI参照モデルの層について解説します。
<img width="400" alt="スクリーンショット 2019-12-19 3.59.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140595/634a0a24-9289-5f3e-6edd-f39f4752bb7f.png">

### なぜ層に分かれているか
7層に分けて機能を分割することで、複雑なネットワークプロトコルを単純化することができるからです。層ごとに抽象化して実装すれば下位層の具体的なことを意識せずに上位層を実装できるようになります。

たしかに層にわかれていることで、各プロトコルの役割がわかりやすくなったように感じます。

### ノード
通信を行うコンピュータのこと。

### ヘッダ
データの送信側では、上位層から渡されたデータに対して、自分の階層のプロトコル処理に必要な情報を「ヘッダ」としてつけています(＝カプセル化)。逆に受信側では受信したデータを処理して、「ヘッダ」と上位層への「データ」に分離します。

<img width="600" alt="ヘッダについて" src="https://www.infraexpert.com/studygif/tcpip3.gif">

引用:[TCP/IPをはじめから](https://www.infraexpert.com/study/tcpip.html)

# 7層の役割と具体例
## 概要
<img width="500" alt="yakuwari" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140595/2fc3a7a7-3199-8b3c-448b-05cfb4c3a84d.png">

## アプリケーション層
具体的なアプリケーション(≒メール、ファイル転送、HTTP等)を実現します。

#### プロトコル：HTTP・FTP・SMTP・DNS

HTTP：Webサーバーとユーザーが相互に通信するための仕組み
FTP：ファイル転送の仕組み
SMTP：メール転送の仕組み
DNS：ドメイン名をIPアドレスに自動変換する仕組み

#### ヘッダ：URLなど
HTTP通信においてはURLがヘッダ情報になります

#### 具体例：ALBなど
ALB(＝Application Load Balancer)はアプリケーション層のロードバランサのため、URL単位での負荷分散が可能です。ヘッダ情報はURLを見ているのでアプリケーション層に属します。

※トランスポート層のロードバランサであるCLB(＝Classic Load Balancer)もありますが、弊社ではALBを使用しています。

<img width="300" alt="ALB" src="https://media.amazonwebservices.com/blog/2016/alb_routing_1.png">

引用:https://aws.amazon.com/jp/blogs/news/new-aws-application-load-balancer/

## プレゼンテーション層
機器ごとの固有のデータ表現形式(＝データフォーマット)などをネットワーク共通のデータ形式に変換しています(＝符号化)。
同じbit列(＝0と1の数字の列)でも機器が変われば違う意味に解釈される場合があるので、プレゼンテーション層で、iOSとWindowsといった異なる機種間において、データの表現形式の整合性を取ることができます。

Shift_JISやUTF-8などの文字コードはデータフォーマットの1種です。

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

ログイン・ログアウトなどでの通信の手順を決めるという説明がわかりやすいかと思います。

#### プロトコル：SSL
httpsから始まるURLの場合、SSLでhttp通信を暗号化しています。

(追記)SSLがどのプロトコルかについては様々な解釈があるようです
参考:https://takehikom.hateblo.jp/entry/20150803/1438601460

## トランスポート層
コネクションの確立や切断の処理を行います。なお、セッション層ではコネクションの手順を決めるだけなので、これらの処理の実行はトランスポート層で行われます。

トランスポート層には宛先のアプリケーションにデータを確実に届ける役目があります。ノードだけで処理され、ルーターでは処理されないので、実際に転送はされません(転送はネットワーク層)。

#### プロトコル:TCP・UDP

TCP：Transmission Control Protcolの略。データの伝達が保証されます。接続先の相手にコネクションを張ることで、データの抜け漏れがチェックされます。

※コネクションとはデータ送信を確認する前に受信側と送信側で回線の接続をすること。

<img width="300" alt="TCP" src="https://net-skills.net/wp-content/uploads/2022/02/features-tcp-udp01.jpg">

引用:[TCPとUDPの特徴](https://net-skills.net/intro-menu1/features-tcp-udp/)

UDP:User Datagram Protocolの略。データの伝達を保証しない、つまり途中でパケットが失われても再送制御や順序制御をしないコネクションレス型のため、高速な通信ができます。DNSや動画サービスなどで利用されています。

<img width="300" alt="UDP" src="https://net-skills.net/wp-content/uploads/2022/02/features-tcp-udp02.jpg">

引用:[TCPとUDPの特徴](https://net-skills.net/intro-menu1/features-tcp-udp/)

#### ヘッダ:ポート番号
コネクションで転送したデータがどのアプリケーションに渡るかを決定します。同一のコンピューター内で通信を行っているプログラムを識別する時に利用します。

#### 具体例:Security Group
AWSのSecurity Groupはネットワーク(ポートやIPアドレス)ごとに通信を制御する仕組みです。
<img width="300" alt="Security Group" src="https://recipe.kc-cloud.jp/wp-content/uploads/2013/02/SnapCrab_NoName_2013-5-22_16-33-54_No-00.png">
引用:https://recipe.kc-cloud.jp/archives/22

## ネットワーク層
ネットワークとネットワークが接続された環境で宛先までデータを届ける役割を持ちます。ルーターでつながった先に複数のネットワークがある場合は、どの通信経路を使うかなどの経路選択の役割も持ちます。

なおネットワーク層だけではデータの伝達性は保証されていません。
<img width="300" alt="図" src="https://www.cisco.com/c/dam/m/ja_jp/products/security/anyconnect/osi-reference-model-4.gif">
引用:[OSI 参照モデル - Cisco](https://www.cisco.com/c/m/ja_jp/primer/osi-reference-model.html)

#### ヘッダ:IPアドレス
TCP/IPネットワーク上に接続されているホストやルーターを識別するためのもの。

#### 具体例:ルーター
パケットを中継する装置のこと(＝パケット交換機)
パケットはデータの基本的な単位でデータを小分けしたもののことです。

<img width="100" alt="ハブ" src="https://images-na.ssl-images-amazon.com/images/I/51VXcSuIrcL._AC_SX679_.jpg">

引用:[amazon.co.jp](https://www.amazon.co.jp/BUFFALO-WHR-1166DHP4-%E3%80%90iPhoneX-iPhoneXS%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D%E6%B8%88%E3%81%BF%E3%80%91/dp/B071CWZRSQ)

## データリンク層
物理層で直接接続されたノード間、1つのイーサネットに接続された2つのノード間での通信を可能にします。
<img width="300" alt="図" src="https://www.cisco.com/c/dam/m/ja_jp/products/security/anyconnect/osi-reference-model-3.gif">

引用:[OSI 参照モデル - Cisco](https://www.cisco.com/c/m/ja_jp/primer/osi-reference-model.html#~stickynav=3)

#### プロトコル:イーサネットなど
有線LANで最も利用されているプロトコルです。


(追記)なお[こちら](https://www.cisco.com/c/m/ja_jp/primer/osi-reference-model.html#~stickynav=5)で以下のように解説されている通り、イーサネットについてはTCP/IPモデルのネットワークインターフェース層(OSI参照モデルのデータリンク層+物理層)のプロトコルとして考えたほうがよさそうです。
>イーサネットや TCP/IP プロトコル群が、必ずしもOSI参照モデルの7階層に合わせて設計されているわけではありません。

#### ヘッダ:MACアドレス
MACアドレスは同一のデータリンクに接続されたコンピュータを識別するためのものでコンピュータごとに固有のものです。

#### 具体例:スイッチングハブ(ブリッジ)
複数のコンピューター同士が相互に通信できるよう接続し、通信の中継をおこなう集線装置の一種です。
<img width="200" alt="ルーター" src="https://images-na.ssl-images-amazon.com/images/I/81M-Xo8IpiL._AC_SX679_.jpg">

引用:[amazon.co.jp](https://www.amazon.co.jp/NETGEAR-%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%83%B3%E3%82%B0%E3%83%8F%E3%83%96-%E9%87%91%E5%B1%9E%E3%82%B7%E3%83%A3%E3%83%BC%E3%82%B7-%E3%83%95%E3%82%A1%E3%83%B3%E3%83%AC%E3%82%B9%E9%9D%99%E9%9F%B3%E8%A8%AD%E8%A8%88-GS105E-200JPS/dp/B00KEXR0GA)

## 物理層
bit列(0と1の数字の列)を電圧の高低や光の点滅に交換したり、逆にbit列に変換します。

#### 具体例:LANケーブル
<img width="200" alt="LANケーブル" src="https://images-na.ssl-images-amazon.com/images/I/51txByHcfKL._AC_SL1200_.jpg">

引用:[amazon.co.jp](https://www.amazon.co.jp/LAN%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB-%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA%E3%83%BC6-%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%8D%E3%83%83%E3%83%88%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB-%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-Xbox%E7%AD%89%E3%81%AB%E5%AF%BE%E5%BF%9C/dp/B07R1QK68X/ref=asc_df_B07R1QK68X/?tag=jpgo-22&linkCode=df0&hvadid=342438986336&hvpos=1o2&hvnetw=g&hvrand=7709509690067423243&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009308&hvtargid=pla-747863086271&psc=1&tag=&ref=&adgrpid=72619891121&hvpone=&hvptwo=&hvadid=342438986336&hvpos=1o2&hvnetw=g&hvrand=7709509690067423243&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009308&hvtargid=pla-747863086271)

## OSI参照モデルのデータの流れ
リンクを押してからWebページが表示されるまでの流れを解説します

<img width="400" alt="LANケーブル" src="http://www.f.waseda.jp/kane/sp_net/image/fig4_1.png">

引用:http://www.f.waseda.jp/kane/sp_net/chap_4.html

①まず送信側はURLを知っていてもIPアドレスを知りません。そこでアプリケーション層プロトコル(＝DNS)のドメイン名を入力し、トランスポート層(※プロトコルはUDP)を通して、ネットワーク層からインターネットを経由します。そして受信側のアプリケーション層にあるDNSにドメイン名に対応するIPアドレスを問い合わせます。

このようにドメイン名からIPアドレスを取得することを名前解決といいます
<img width="519" alt="スクリーンショット 2019-12-19 14.03.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140595/f4ff95c9-32f4-8624-d629-4ffdb8a1ca24.png">


②受信側のDNSサーバーで取得したIPアドレスをもとにネットワーク層からインターネットを経由します。その後アプリケーション層プロトコル(HTTP)のWebサーバーに問い合わせ、HTMLファイルを取得します。
<img width="523" alt="スクリーンショット 2019-12-19 14.03.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140595/c75fe098-b48b-7a4d-959a-5e5c26d8b78a.png">


③アプリケーション層のHTTPファイルをネットワーク層からインターネットを経由して送信し、URLを入力したPCにWebページが表示されます。
<img width="489" alt="スクリーンショット 2019-12-19 14.04.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140595/cfb7dd28-b6f0-478e-7ca2-61a04e7aa92f.png">



## 最後に
もう一度、ぜひ図をみて対応関係を理解していただければと思います！
[図に戻る](https://qiita.com/manamin0521/items/1df1ec65637ad1620329#osi%E5%8F%82%E7%85%A7%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E5%9B%B3%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E3%81%BF%E3%81%9F)

OSI参照モデルの7層は基本情報にも出る基礎知識なので、覚えておくといろんな場所で役立ちます。私も今後、OSI参照モデルに当てはめながら考えるようにしたいです。

## 参考
- [マスタリングTCP/IP 入門編 第5版](https://www.amazon.co.jp/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0TCP-IP-%E5%85%A5%E9%96%80%E7%B7%A8-%E7%AC%AC5%E7%89%88-%E7%AB%B9%E4%B8%8B/dp/4274068765)
- [Webを支える技術 6章 P68~P70](https://www.amazon.co.jp/Web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-HTTP%E3%80%81URI%E3%80%81HTML%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6REST-WEB-PRESS-plus/dp/4774142042)
- [OSI参照モデルとTCP／IPについて](https://ansl-blog.hatenablog.com/entry/2019/05/22/OSI%E5%8F%82%E7%85%A7%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A8TCP%EF%BC%8FIP%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
- [初級シスアド講座](http://www.pursue.ne.jp/jouhousyo/sysad/Network/Interface.html)
- [第2回　 『OSI階層モデル』をマスターして、『通信』を理解しよう！ (津村彰)](https://www.school.ctc-g.co.jp/columns/tsumura/tsumura02.html)
- [TCP/IP入門 各層の役割](https://ja.wikibooks.org/wiki/TCP/IP%E5%85%A5%E9%96%80_%E5%90%84%E5%B1%A4%E3%81%AE%E5%BD%B9%E5%89%B2)