ネットワークについて知りたくて「この一冊で全部わかるネットワークの基本」を読んだ

#はじめに
SESでプログラマーになってから1年経ちました。
元々自分は新しい知識をつけるのがものすごく好きで、知ったことで自分の頭で咀嚼して使いこなすことが気持ちいいんですよね。
今回はネットワーク周りの知識です。
仕事上、ネットワーク周りを担当したことがなかったのですがこのままではいけない、ネットワーク周りの達人をみるといつも「かっこいい！自分もこんな人になりたい！」と思っていたので、タイトルの書籍を読みました。
ここでは個人的に勉強になったことをまとめました。

#目次
・ネットワークの基礎知識
・TCP/IPの基礎知識
・TCP/IPで通信するための仕組み
・ネットワーク機器と仮想化
・ネットワークのサービス
・おわりに


#ネットワークの基礎知識
ネットワークの働きは**「アプリ同士が何かを行うためにデータをやりとりできるようにしてやること」**
例えばWebであれば、WebブラウザとWebサーバーのやりとりをするためにHTTPというアプリケーション層のプロトコルを使用してデータのやり取りをする。アプリケーション層より下のトランスポート層ではTCPを用いて、ネットワーク層ではIPを使用する。
こうやって、レイヤー(層)に分けることでそれぞれの層の役割が**シンプル**になり、他のプロトコルとの組み合わせができる。


**OSI参照モデル**
OSI参照モデルは、コンピューターネットワークに求められる機能を、7つの階層に分けて整理したもの。

アプリケーション層　・・・具体的な通信サービスを実現する（メールや、Webなど）
プレゼンテーション層・・・データの表現形式を相互変換する
セッション層　　　　・・・通信の開始から終了までの手順を実現する
トランスポート層　　・・・信頼性の向上など用途に応じた特性を実現する
ネットワーク層　　　・・・中継などにより任意の機器同士の通信を実現する
データリンク層　　　・・・直接接続された機器同士の通信を実現する
物理層　　　　　　　・・・コネクタ形状やピン数など物理的な接続を定める

ただ、OSIモデルを基本として実際に使われてはおらず、ネットワークの基本モデルとして参照する程度のもの。

LANとWANとは？
図にするとこんな感じ
![lan_wan (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442028/c4a159a2-7353-0390-981a-2a90e0440d47.png)

イーサネットの規格にLANが使われているので、イーサネットといえばLANのことを指している。


#TCP/IPの基礎知識
TCP/IPはトランスポート層で使われるプロトコルの一つであるTCP、インターネット層で使われるIPのセットのこと。
TCP/IPモデルは4層構造でなっていて、複雑なOSIよりシンプルなTCP/IPが普及している。

**OSI参照モデルとTCP/IPモデルの対応関係**
作ってみました。こんな感じ
![OSI (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442028/b38b18f9-fab9-293e-49c5-d9ec775617f4.png)

**ネットワークインターフェース層の役割**
ネットワークのハードウェアで直接つながっているコンピュータ同士が、相互に通信できるようにするための機能を実現する
この層の主なプロトコルがイーサネット(Ethernet)で、今の有線LANはほぼ全てイーサネットが利用されている。
Wi-Fiはイーサネットの無線バージョン。
PPPoE(PPP over Ethernet)は、イーサネット上で1対1の接続を作るプロトコル。主にインターネット接続サービスの利用者認証に多く使われている。

上位層のインターネット層から送られてくるIPアドレスから固有のMACアドレスを調べて取得するARPとその逆のRARPがある。

**インターネット層の役割**
ここでは、複数のネットワーク(インターネットワーキング)をつないで、相互にパケット(通信データ)をやり取りする機能を実現する。
インターネット層では物理的につながっているコンピュータでしか通信できなかったのに、インターネット層が加わることで直接つながっていないコンピュータ同士での通信が可能になる。

それを担っているのがパケットの中継機能を果たしているルーティング。

インターネット層での主なプロトコルはIP(Internet Protocol)で直接つながっていないネットワーク間で、パケットをルーティングする機能を提供する。
相手が受け取り可能な状態かの可否を問わずに一方的に通信する。
ICMPはIPの補助的なプロトコル。相手に通信できるかの検査、通信できなかったときの通知などに使われる。

**トランスポート層の役割**
ここではインターネット層が作り出したコンピュータ同士の通信機能をベースにして、ネットワークの利用目的に応じた通信を実現する。

代表的なプロトコルはTCPとUDP。
TCPは信頼性の高い通信を実現するプロトコルで最初に相手との接続を作り、通信が終われば接続を切る。
パケットの再送、修復をするので、リアルタイム性に欠ける。
対するUDPはインターネット層の機能をそのまま使い、身軽な通信を実現する。

**アプリケーション層の役割**
ここでは、個別のアプリの機能を実現する。
主なプロトコル
HTTP・・・Webのアクセス、APIでの通信
SMTP・・・メール送信
POP3・・・メール読み出し(ハードウェアに取り込んで読む)
IMAP4・・・メール読み出し(サーバーから読む)
NTP・・・クライアントとサーバーの時計合わせ

**ポート番号**
IPアドレスとポート番号の両方を使うことで、どのコンピュータのどの機能といった指定が可能になる

**IPアドレスのクラスとネットマスク**
クラス・・・A〜Eまであり、DとEは特殊な用途で使い、通常のアドレスとしてはA〜Cを使う。
それぞれのクラスの違いはネットワークの規模が違う。一つのネットワークで何台のコンピュータを区別できるかの違い。
![network.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442028/d8350c90-dc85-d16d-a277-783bad238d59.png)

IPアドレスのネットワーク部にあたる部分を1にしたビット列を、ネットマスクと呼ぶ。
このネットマスクとIPアドレスでAND演算を行うと、ネットワークアドレス(ネットワークそのもの)を取り出せる。

![netmask.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442028/2a1a5f53-a3c5-842d-e00a-4811a71a4eab.png)



**サブネット化とサブネットマスク**
サブネット化は1つのネットワークを細分化してそれらを接続する構成にすること。
サブネット化するときはIPアドレスのホスト部の一部をネットワーク部として使う。
サブネット化したネットマスクをサブネットマスクという。

**ブロードキャストとマルチキャスト**
IPプロトコルを使った通信では、1対1で行う通信をユニキャスト、
同じイーサネットに接続している全てのコンピュータに対してデータを届ける通信をブロードキャストという。
![cast.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442028/d58efe4d-8d0f-4174-13ff-889bfd5dea9d.png)


#TCP/IPで通信するための仕組み

**可変長サブネットマスクとCIDR**
サブネットが固定されていると、無駄や不足が出てしまうのでサブネットごとにサブネットマスクの長さを変えて接続するコンピュータを柔軟に決められる。これを可変長サブネットマスクという。
CIDRは、可変長サブネットマスクをベースになっている技術で、IPアドレスのクラスを無視してネットマスクを短くみなすことで、サブネットに対する転送ルールをまとめる技術。

![cidr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442028/efdaccd0-23cf-9d1f-ff64-33aecf5d7191.png)

**ARPが必要なわけ**
通信相手が自分と別のネットワークにあるときには、パケットをルーターを通して送信する必要がある。
ARPはそのときに使用され、ルーターのIPアドレスからMACアドレスを取得して、そのMACアドレスを宛先に指定したイーサネットを使って相手先に送り届ける

**ルーティングとデフォルトゲートウェイ**
ルーターによるパケットの転送のことをルーティングという。
ルーターは宛先のIPアドレスにサブネットマスクを適用して、ネットワークアドレスを取得して、ルーティングテーブル(何をどこへ転送すればいいかを定めた転送ルール)からそのアドレスのルールを探してそれに従って転送する。

**ルーティングプロトコル**
動的にルーティングテーブルを書き換えるダイナミックルーティングで使用されるプロトコルをルーティングプロトコルという。
ルーティングプロトコルには
・IGP
・EGP
がありIGPはAS(1つのISPや、大規模なネットワーク)の中のルーティングに、EGPはAS間でのルーティングに使用される。
![routing_protocol.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442028/0f984db1-affe-42c2-177a-5894521a0d19.png)

また、IGPには
・RIP/RIP2・・・導入や運用が簡単だが、経路を選ぶときに通信速度が考慮されない。単純なネットワークで使われる
・OSPF・・・RIP/RIP2の欠点が解消されて、ネットワークの速度も考慮して最適な経路を選択する。
そしてEGPには
・BGP・・・途中で通過するASの情報を基にあるネットワークにたどり着くまでの最適な経路を選択する。

**DHCPサーバー**
DHCPはネットワークに接続したコンピュータに対して、必要なネットワーク情報を自動的に配布するためのプロトコル。
DHCPの流れ
①DHCPディスカバーをブロードキャストし、割当を呼びかける。
②DHCPメッセージで、設定情報を返送する。
③DHCPリクエストし、示された候補を使用することを伝える。
④DHCPアックメッセージを送り使用開始を了承したことを伝える。

![dhcp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442028/684863f1-3d01-8222-826c-ee5a252da854.png)

**NATとNAPT**
NATはプライベートIPアドレスとグローバルIPアドレスを1対1で対応させる。
IP:192.168.1.23(プライベートIPアドレス)　<-> IP:203.0.113.43(グローバルIPアドレス)
NAPTは複数のプライベートIPアドレスを1つのグローバルIPアドレス＋ポート番号で対応させる。
IP:192.168.1.23　<-> IP:203.0.113.43 + ポート1234
IP:192.168.1.24　<-> IP:203.0.113.43 + ポート1235

#ネットワーク機器と仮想化

**VPNとトンネル**
VPNはインターネットなど既存のネットワークの中に新たに仮想的なネットワークを作る技術。
用途として出先からオフィスのネットワークに接続するのが主としてあげられる。

VPNを実現するためにトンネル技術が用いられている。
トンネル技術はある物理通信回線の中に作り出した仮想的な通信回線のこと。
VPNでは
・PPTP
・L2TP
といったトンネルプロトコルが使われているがこれらは暗号化する機能がない。
そこで、IPsecなどの暗号化プロトコルを併用してトンネルを使った通信を暗号化することで機密性を保つ。
中でもIPsecとL2TPの組み合わせはインターネットでのVPNでよく使われる。
またIPsecでは
・IKE・・・暗号化のための鍵を交換するプロトコル
・ESP・・・暗号化したデータをやり取りする
・AH・・・認証と改竄検知を行う
を組み合わせて構成されている。

**クラウド**
クラウドとはユーザー自信が、Web画面を介して、コンピュータ、ネットワーク、各種サービスを自由に組み合わせて必要なサービスを組み立て、それをネットワーク経由で利用すること。
クラウドは以下の3つに分類される。
・IaaS(Infrastructure as a Service)・・・仮想化されたコンピュータや、ネットワークを作り出す仕組み。
・PaaS(Platform as a Service)・・・コンピュータ本体ではなく呼び出して利用できる一定の機能をサービス化して提供するもの。
・SaaS(Software as a Service)・・・完成したソフトウェアをネットワーク経由で提供するもの。


#ネットワークのサービス

**HTTP**
HTTPはWebブラウザとWebサーバーの間で、Web情報をやりとりするためのプロトコル。
1つの要求(リクエスト)に1つの応答(レスポンス)を返すというシンプルなルールで動作する。
![http.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442028/3b909c91-f016-fae6-1be3-1a898b75bd05.png)

**HTTPSとSSL/TLS**
HTTPSはHTTPでの通信を安全に行うための仕組み。
これにはSSL/TLSというプロトコルを使って安全な接続を作り、その上でHTTP通信をする。
HTTPSでは
・通信データが暗号化されている
・通信内容が改ざんされたことを検出する
・接続先のWebサーバーが本物かどうか検証する
といった機能も併せもっている。

暗号化プロトコルのSSL/TLSはHTTPとTCPの間に位置する
![SSL_TLS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442028/b9f3fdfe-2e2d-0f89-fcdf-018f982f0ff8.png)

**SSH**
SSH(Secure Shell)は、サーバーやネットワーク機器に接続して、対象をCUIで操作するために使うプロトコル。
TCPと一緒につかい、ポートは22番を使用する。
SSHはやり取りが暗号がされているため、安全に対象を操作できる。

**DNS**
DNSはドメイン名からIPアドレスを求めること(正引き)、IPアドレスからドメイン名を求めること(逆引き)の名前解決を提供する
![DNS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442028/ee16baa6-15c2-8af0-92ce-e2351143e36f.png)

**HTTPプロキシ**
実際のネットワークでは各コンピュータはWebサーバーと直接通信ぜず、中継サーバーを通してインターネットとやりとりをする。
この間に入って通信内容を中継するコンピュータをプロキシという。
HTTPプロキシはWebアクセスの時にプロキシを使用してアクセスすることをいう。
HTTPプロキシを使うと、
・プロキシがキャッシュ情報を保存しているので、Webサーバーから直接レスポンスをもらうよりも速く欲しいWebサイトを表示できる。
・ウィルス検出や不正侵入防止
・有害サイトの遮断
の利点がある。



**サービス連携とREST API**
ASP(Application Service Provider)は、何か処理をしたい時に別のコンピュータが持っている機能をネットワーク経由で呼び出して提供するサービス。
今ではこれをクラウドの技術の一つと捉え、SaaSやPaaSと呼ぶこともある。
ASPやSaaS/PaaSなどの機能をネットワーク経由で呼び出す時、一般的に使われているのが**HTTP**
REST APIはHTTPを使ってASP、SaaS/PaaSなどのサービスを呼び出し、HTTPのレスポンスにXML形式やJSON形式で結果を返すスタイルをいう。

Twitter、FacebookのSNSもREST APIを公開することが多い。
![api.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442028/b0686884-bc60-889d-88f1-ba76a69df130.png)

#おわりに
ここでは個人的に「なるほど、これはこういうことだったのか」となった箇所をまとめてみました。
まとめてアウトプットすることで、自分の知識を整理できた気がします。
次はマスタリングTCP/IPに挑戦してみようかな。
ここまで読んでくださった方、とても嬉しいです。ありがとうございます。