【初心者にやさしい】「これで分かった！」ネットワークとは~OSI参照モデルやTCP/IPプロトコルまで解説~

# 本記事の目的
　本記事は、「__ネットワークとは何なのか__」ということについて、これまで自主学習や社内勉強会で習得した知識をもとにできるだけ分かりやすく、 __頭の中でイメージが湧くように__ 説明することを目的とします。
　特に、「__OSI参照モデル__」や「__TCP/IPプロトコル__」など多くのエンジニアの頭を悩ませる用語についても、具体例を用いながら分かりやすく解説することに努めました。

# 本記事の内容
　本記事の内容は以下の通りになっています。一つ一つイメージをつかみやすく解説していきますので、どうぞご参考ください。

1. ネットワークとは？
1. LANとWAN
1. インターネットとは？
1. 【図解】私たちがインターネットに接続し、欲しいデータを受け取るまでの流れ
1. 【図解】OSI参照モデル
1. 【図解】TCP/IPプロトコル

# 1. ネットワークとは？
　まず、「__ネットワーク__」とは何でしょうか。抽象的に解釈すると以下のような説明になると思います。

　__個々の人のつながり。特に、情報の交換を行うグループ__

　一昔前までは「ネットワーク」といえば、上の定義のように、「__人と人のつながり__」を表す用語として広く認識されていたそうですが、現代では、「ネットワーク」と言えば、以下のような説明が最も一般的です。
　　
　__コンピュータが互いに連携するために接続された状態や空間__

　このようなコンピュータによるネットワークが形成されたことによって、私たちは __離れたところにいても、データを送受信できるようになった__ のです。これがネットワークが私たちにもたらした恩恵です。
　ちなみにコンピュータがそのコンピュータでのみことを済ませ、ネットワークに接続されていない状態のことを、「__スタンドアロン型__」と言います。コンピュータを互いに接続させてネットワークを構成するというやり方が一般的な現代ですが、このスタンドアロン型にはスタンドアロン型の利点というものもあります。それは、「__セキュリティ__」です。スタンドアロン型のコンピュータは他と接続されていない分、外部からのウイルスなどが侵入してこないというメリットがあるので、重要なデータを管理するコンピュータをスタンドアロン型で使用するというやり方もあるということになります。
![スタンドアロン型vsネットワーク型.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/43bcf598-45d5-bf9e-bc22-47e7db1086b4.png)

# 2. LANとWAN
　「ネットワーク」と聞くと、「インターネット」を思い浮かべるかもしれませんが、インターネットだけがネットワークというわけではありません。
　ネットワークには、「その範囲」や「管理形態」などによって「__LAN__」と「__WAN__」という2つの分け方ができます。
　「__LAN__」とは「__Local Area Network__」の略であり、「__範囲__」という観点で考えると、「Local」という言葉からも分かる通り、会社内や家庭内などの比較的小規模の範囲でのネットワークのことを指すことが多いです。一方、「__WAN__」とは「__Wide Area Network__」の略であり、同じく「範囲」という観点で考えると、「Wide」という言葉から分かる通り、比較的大規模で形成されたネットワークのことを指すことが多いです。
　また、「__管理形態__」という観点で考えてみると、「LAN」は部署内などでネットワークを作り、それを自分たちで管理する形態だと言うことができます。一方、「WAN」は「インターネット通信事業者(= プロバイダー)」が通信網を提供し、プロバイダーによってネットワークが管理されている形態だと言うことができます。
![LANとWAN図解.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/3b0df450-2852-f0a8-4e87-80ce5dc53a36.png)

![LANとWANの違い.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/692ba7ed-9117-8d3b-712d-6653f3ae00c5.png)
　ここで、上の表において、「__使用するIPアドレス__」という観点でも違いを示していますが、これに関しては「4」の「__【図解】私たちがインターネットに接続し、欲しいデータを受け取るまでの流れ__」で詳しく解説します。

# 3. インターネットとは
　ここまで「__ネットワークとは何なのか__」、「__LANとWANの違い__」について解説してきました。
　では、皆さんがいつもPCやスマホを使ってウェブサイトを閲覧したり、動画を視聴したりするときに使っている「__インターネット__」とは何なのでしょうか。

　インターネットとは、 __WANを地球規模で接続し、網目状につながっている状態や空間のこと__ を指します。インターネットもWANということですね。地球規模でつながっているからこそ、私たちはいつ、どこにいても見たいサイトや動画に瞬時にアクセスできているということになります。
![インターネット空間.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/eca1baf7-feef-19cf-bfcf-c2b738611a2e.png)
　次の「4」では、私たちがインターネットに接続し、欲しいデータを受け取るまでの流れを図解で理解していきましょう。

# 4. 私たちがインターネットに接続し、欲しいデータを受け取るまでの流れ
::: note
ここでのキーワードは「__IPアドレス__」になります。後ほど出てきますので、注意深く見てください。
:::
　この章では、「__twitterのホームページを表示する__」という作業を例に、この流れの裏で何が起きているのかを順を追って理解することで、インターネットというものをより深く理解していきましょう。
## 4-1. ユーザーが「twitter.com」とURLを打ち込み、検索をかける
![twitter.comと検索.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/96a8ea86-1d6d-9106-be6e-899234ab78c3.png)
　まずは、ユーザーが「twitter.com」と検索窓に入力し、エンターキーを押すことで検索をかけます。
## 4-2. DNSサーバーが動き出す(IPアドレスを見つける)
　コンピュータは「twitter.com」という文字列を認識することはできません。なぜならコンピュータは「0」と「1」の数字の組み合わせでのみ情報を識別することができるからです。そこでDNSサーバーというサーバーが登場し、この「twitter.com」という文字列を「0」と「1」の数字の羅列に変換します。
　この時の「０」と「1」の数字の羅列のことを「__IPアドレス__」と言います。IPアドレスは「アドレス」という言葉からも分かる通り、「__住所__」を指します。この場合で言うと、 __twitter社のサーバーのある住所__ を指すことになります。

　このIPアドレスを指定することで目的のページに到達できるわけですが、IPアドレスは本来「0」と「1」の羅列のため、人間がいちいち手入力するのは面倒ですよね。そこで登場したのが __DNS__ という技術です。DNSは「__Domain Name System__」の略であり、 __URLとIPアドレスを紐づけて電話帳のように管理し、相互変換をする技術__ になります。これのおかげで、私たちは __URLを入力するだけで簡単に目的のページに到達できてしまう__ というわけです。DNSの細かい仕組みは以下の図をご覧ください。
![DNSの仕組み.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/50d974ac-2aab-e8ef-36db-4ce3a5dfb098.jpeg)
## 4-3. インターネットを経由してサーバーにリクエストを飛ばす
　お目当てのtwitter社のサーバーの住所(=IPアドレス)が分かったので、次はそれを使って実際に「__twitterのホームページの画面情報をください！__」というリクエストを投げます。この時、インターネットに接続するわけですが、ここでも「__IPアドレス__」が重要になってきます。以下の図をご覧ください。
![プライベートIPとグローバルIP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/80695626-d0eb-350a-bae1-58ea683a42a2.png)
　ここで3つの新しい用語が出てきました。「__プライベートIPアドレス__」、「__グローバルIPアドレス__」、「__ルーター__」です。どれもインターネットに接続してリクエストを投げる際の重要なキーワードになりますので、詳しく解説します。
### 4-3-1. 宛先と送り主住所の区別
　まず「宛先」と「送り主」を整理しましょう。今回は「twitterのホームページにアクセスする」ということが目的ですので、宛先の住所は「__twitter社のサーバーのIPアドレス__」になります。一方、アクセスをしているのは自分自身のPCですので、送り主住所は「__自分のPCのプライベートIPアドレス__」となります。
　ここで登場した「__プライベートIPアドレス__」とは、「__インターネットに接続されていない機器に対して割り振られるIPアドレス__」となっています。
　「__え？でもPCはインターネットに接続するじゃないか__」と思ってしまうかもしれませんが、実はインターネットに接続しているのは、PC自身ではなく、「__ルーター__」と呼ばれる水先案内人なのです。さらに実は、先ほど「__送り主住所はPCのプライベートIPアドレス__」と言いましたが、厳密にはこのルーターに割り振られている「__グローバルIPアドレス__」というものを送り主住所としてインターネットに接続しているという仕組みになっています。
　つまり、宛先は「__twitter社のサーバーのIPアドレス__」で変わりありませんが、送り主住所は「__ルーターのグローバルIPアドレス__」となるというわけです。
![NAT(Network Address TransLation).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/6960ab3a-a7ce-cd9c-bdd7-3d389a0c2a6e.png)
　このPCそれぞれのプライベートIPアドレスをグローバルIPアドレスに変換する技術を「__NAT(Network Address TransLation)__」と言います。このNATという技術を利用する目的について、私の勤務する会社のネットワークチームに聞いたところ、「__プライベートIPアドレスをグローバルIPアドレスでマスキングすることでセキュリティレベルを向上させること__」だと言っていました。インターネットに接続された他の機器はではグローバルIPアドレスのみしか識別できないようにしておくことで、安全性を高めているということなのですね。
### 4-3-2. ルーターを経由してインターネット空間へリクエストが飛ぶ
　宛先と送り主住所を特定できたら、今度は水先案内人のルーターがインターネット空間に向けてリクエストを飛ばします。ここでルーターのことを「__水先案内人__」と言い換えていますが、インターネット空間に入ってすぐにtwitter社のサーバーにたどり着くわけではありません。その途中にいくつものルーターを経由してやっとtwitter社のサーバーまで到達するというのが実際です。
　インターネット空間上には数多くの情報が飛び交っており、それぞれをきちんと正しく目的地まで届けなければなりません。そのための役割を果たしているのが「__ルーター__」なのです。ルーターが情報が向かうべき経路を指し示してくれるからこそ、正しく目的地まで届けることができるのです。「__水先案内人__」と言い換えたのはこういう理由からです。
![ルーターの役割.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/703360fe-c3be-ac05-9b58-58f6301ef996.png)
## 4-4. サーバーが情報をレスポンスとして返す
　インターネット空間を経由してtwitter社のサーバーまでリクエストが届いたら、今度はレスポンスを返す番です。レスポンスを返す時は、送り主住所を確認します。今回で言えば、 __送り手のルーターのグローバルIPアドレスが送り主住所なので、そこに向けてレスポンスを返す__ ことになります。送り手のルーターにレスポンスが届いたら、実際にリクエストを送ってきたPCのプライベートIPアドレスを判別し、レスポンスを届けるという流れになります。
![サーバーからのレスポンス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/d7d0db3e-fb37-616f-a6f3-43817c95d49f.png)
　これで、「__リクエストを送り結果をレスポンスとして受け取って表示する__」という一連の流れが終了しました。この過程はほんの数秒で行われてしまいますが、一つ一つの工程を垣間見てみると、かなり細かい処理が行われていることが分かりますね。
# 5. 【図解】OSI参照モデル
　ところで、4で説明したような、インターネットを利用したデータ通信において、 __なぜ全てのPCやスマホが同じようにさまざまなデータを送信したり、さまざまなデータを受信したりといったことが実現できるのでしょうか。__ また、 __なぜ違うメーカーのPC同士を互いに接続してデータ連携させることができるのでしょうか。__
　これには、「__OSI参照モデル__」というものが大きく関与しています。
　OSI参照モデルとは、「__インターネットを利用したデータの送受信に関してのルールの参考にしてね__」という目的で作成されたものになります。特徴としては、__データ通信の工程を7つに分け、それぞれの工程におけるルールなどを取り決めているというものがあります。__
　以下の図をご覧ください。
![OSI参照モデル簡略図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/3ae3518f-45d2-43cb-786a-e086abb2ff7b.png)
　OSI参照モデルでは、データ通信における工程を __7つの層__ に分解しています。 __データを送るときは、第７層から第1層へ__ と工程を経ていき、逆に __データを受け取るときは、第1層から第7層へ__ と工程を経ていくことになります。層ごとに決められたルールがあり、そのルールに沿ってデータに情報を付け加えたりしながら徐々に次の階層へと受け渡していく形になります。
　では、「__メールアプリケーションで文章を送る__」という例を用いて、各層で何が行われているのかを細かく見ていきましょう。
## 5-1. アプリケーション層
![アプリケーション層.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/6286a28f-882a-4bb1-9cec-e6256887ec54.png)
　メールアプリケーションで「Hello!」という文章を入力して送信した時のことを考えてみましょう。まず送信された文章データは「__アプリケーション層__」に到達します。ここでは、アプリケーションそのものに関するルールなどを規定しています。つまり今回で言えば、メールアプリケーションそのものに関する様々なルールを規定しています。
　ここで決めたルールなどの情報が詰まった「__ヘッダー情報__」を元々の文章データに付け加えて次の層に受け渡します。
## 5-2. プレゼンテーション層
![プレゼンテーション層.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/1099d13d-88ed-ef24-be29-19ffdf956830.png)
　次のプレゼンテーション層では、「__表現形式__」を決めます。文章データをPCから送り出すときは、最終的には「0」と「1」のみのバイナリデータに変換してから送信します。そして、受信側では再度文章データに復号してメッセージとして読めるようにします。この変換形式を定めているのが、プレゼンテーション層というわけです。
## 5-3. セッション層
![セッション層.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/314f136b-3cae-d4c3-c34c-1f13cf17dbee.png)
「__セッション__」とは、 __通信の開始から終わりまでの一連の流れ__ のことを言います。この一連の流れの中で「開始の仕方」や「終わり方」、また「途中で通信がうまくいかない時の対処法」などをこの層で決め、前の層と同じようにヘッダー情報として付け加え、次の層に渡します。
## 5-4. トランスポート層
![トランスポート層.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/203bbc0d-c8dd-8ba6-5846-1fb8c5dc0b75.png)
　今までの3層は、どちらかというとそれぞれのアプリケーションに沿ったルールを定めるようなものでした。
　しかし、次のトランスポート層以降では、 __どのアプリケーションを使用したデータ送信においても同じルール__ を定めています。このトランスポート層では、「__データの信頼性__」を確保するために、「__データを送信するときは合図をしてから送信しましょう__」、「__データにもし欠損があったら教えてください__」などのルールを定めています。これにより、確実に安全にデータを送受信することができるようになります。
## 5-5. ネットワーク層
![ネットワーク層.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/8f93e1ff-f536-8818-5014-fa238d139bc5.png)
次のネットワーク層では、「__どの経路を辿って相手まで届けるのか__」を決めます。どのルーターを経由するかはもちろん、途中でどれか一つのルーターへの接続が遮断された場合でも別のルーターに送り直して確実に届けるなどの安全面でのルールも定めます。
## 5-6. データリンク層
![データリンク層.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/f6173374-88f0-434c-75b5-e59e171946b0.png)
前のネットワーク層では、ネットワーク空間でどういう経路を辿るのかなどの __全体__ に関してルールを定めていました。一方、今回のデータリンク層では、 __互いに直接接続された隣同士の機器間でのデータ送受信に関するルール__ を定めています。不特定多数の機器にデータが散らばることなく、接続された相手のみにデータを確実に送るようにするためのルールを決めているわけですね。
## 5-7. 物理層
![物理層.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/db903301-cd68-244a-7eb3-05cb5cb59b94.png)
　最後の物理層では、その名の通り、 __物理的な要素に関するルール__ を定めています。具体的には、「__バイナリデータを電気信号に変換するためのルール__」や、「__ケーブルとその差し込み口の形状に関するルール__」などです。物理的な要素に関するルール規定まで終わったら、いざデータを送信します。
　この時、図を確認していただきたいのですが、 __最初のデータ量に比べて、実際に送り出す時のデータ量が増えています。__ これは、各層で定めたルールについての情報をヘッダー情報として付け加えながら次の層へと渡していったからです。このような工程を「__カプセル化__」と言います。送信の後、受信側では逆のルートを辿るわけですが、そこでの流れのことは「__非カプセル化__」と呼びます。
## 5-8. OSI参照モデルは参照されていない
　ここまで、細かくOSI参照モデルについて解説してきましたが、 __実際にはこのOSI参照モデルは利用されていません。__ それは、OSI参照モデルを作成している間に、「6」で説明する「__TCP/IPプロトコル__」が普及してしまったからだと言われています。現実ではほとんどがTCP/IPプロトコルが参照されており、OSI参照モデルはあくまで各層を細かくみていく必要がある場合にのみ、参照されているという感じのようです。
　OSI参照モデルでは「__第7層__」までありましたが、TCP/IPプロトコルでは「__第4層__」までしかありません。もちろん4層で7層分に対応しているわけですが、詳しくは「6」で説明します。
# 6. 【図解】TCP/IPプロトコル
　「5」で説明したように、TCP/IPプロトコルは、実際にデータ通信などにおいて幅広く参照されているルールになっています。「__TCP/IPプロトコル__」と名づけていますが、 __実際には数多くのプロトコル=約束事の集合体です。__ TCPやIPというのも一つのプロトコルです。代表としてTCPとIPをとって、そう名づけています。各プロトコルが4層の中で適切な場所に配置されているという構造になっています。
　以下の図を見てください。
![TCP:IPプロトコル図解.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/909ef923-21c0-b20c-e9e1-dc710b0e6ed2.png)
　これはOSI参照モデルの各層にTCP/IPプロトコルのどの層が該当するのかを示した図ですが、まず __TCP/IPプロトコルの「アプリケーション層」一つでOSI参照モデルの7~5層をカバーしている点__ にご注目ください。先ほどチラッと「__7~5層はアプリケーション固有のルール__」と言いました。TCP/IPプロトコルを見ればその通りであり、ここでは __アプリケーションごとの通信の仕方によってどのプロトコルを使うのか__ を決めています。
　例えば、メールアプリケーションでメッセージを送る場合は、メール送受信に関するプロトコルである「__SMTP__」を利用して、「アプリケーション間のルール」、「表現形式」、「セッションに関する取り決め」までを指定します。
　この後の層はアプリケーションごとではなく、共通のルール決めになるので、それぞれの層で該当するプロトコルが参照されていく形になります。
　TCP/IPプロトコルについてより詳しく学習したい場合は、以下の記事がとても参考になりますので、ご参照ください。

[TCP/IPとは？通信プロトコルの階層モデルを図解で解説](https://www.itmanage.co.jp/column/tcp-ip-protocol/)
# 7. まとめ
アプリ開発者を目指す身にとって、「__ネットワーク__」というものは正直つまらないものだと思っていました。しかし、今回自分で学習したり、勉強会に参加して知識を習得してみると、 __アプリ開発においてもかなり役立つ部分が多く、知っておいて損はない分野__ だと思い直しました。
　特に「HTTP通信」や「HTTPS通信」などに関しては深掘って理解する必要があると感じましたので、また今度こちらの記事にもしたいと思います。
# 8. 参考
- [OSI参照モデルとは？TCP/IPとの違いを図解で解説](https://www.itmanage.co.jp/column/osi-reference-model/)
- [TCP/IPとは？通信プロトコルの階層モデルを図解で解説](https://www.itmanage.co.jp/column/tcp-ip-protocol/)
- [NATとは？(Network Address Translation)ネットワークの基本を３分で](https://it-biz.online/it-skills/nat/)
- [【図解】グローバルIPアドレスとプライベートIPアドレスの違いを３分で解説](https://it-biz.online/it-skills/global_vs_private/#toc4)