AWSを理解する[通信の仕組み編]

#概要
はじめに、この記事はAWS初学者が備忘録として作成しています。
ですが、私のような初学者のために少しでもなればと思い、公開しています。
不適切や、わかりにくい点を見つけた場合はご指摘頂ければ幸いです。

1. [ネットワークを構築する](https://qiita.com/enuii3/items/103c4b9b0db472f36ddb)
2. [webサーバーソフトをインストールする](https://qiita.com/enuii3/items/a68f42563a6331b89db3)
3. [webサーバーにWordPressをインストールする](https://qiita.com/enuii3/items/cfd0053a27ab2ccb052d)
4. [通信の仕組みを理解する](https://qiita.com/enuii3/items/7f1196c28ae740c91482)👈今ここ
5. [S3を使って公開する](https://qiita.com/enuii3/items/db930446f334db3ce1da/)

#TCP/IPとは
##IPアドレス
- IPアドレスは、ネットワーク上の通信先を一意に特定するもの
- IPアドレスにはパブリックIPアドレスとプライベートIPアドレスがある。インターネットを通じて通信するにはパブリックIPアドレスが必要。インターネットとは直接通信しないプライベートなネットワークの中で、プライベートIPアドレスを自由に利用できる
- IPアドレスを使った通信は、ルーターがパケットをバケツリレーのように転送することで実現している。パケットを次にどこに渡せば良いかというルーティング情報は、EGPやIGP使って交換する

##ポート番号
- ポート番号を使うことで、一つのIPアドレスで同時に複数のアプリケーションが通信できる。
- WebやDNS、メール送受信向けのSMTPなど、よく使われるサービスは利用するポート番号が決まっており、それを**ウェルノウンポート**と呼ぶ
- Webサーバーは、ウェルノウンポートとしてポート80番を用いる

##DNS
- IPアドレスは数字の羅列で覚えにくいため、一般にブラウザからのアクセスは、ドメイン名を使う。
- ドメイン名を使って通信する際には、ドメイン名がどのパブリックIPアドレスなのかを知る必要がある。ドメイン名とIPアドレスとの相互変換をすることを**名前解決**という
- 名前解決にはDNSサーバーを用いる

##HTTP
- WebサーバーとWebブラウザは、HTTPを用いてデータをやりとりする

##TCP/IPモデル
これらの一連の処理は、TCP/IPモデルという通信モデルで構成されている。
役割ごとに4つの階層に分けたモデルです。各層には、その層の役割を果たす各プロトコルがありあます。

| 層 | 役割 | 代表的なプロトコル |
|:-:|:-:|:-:|
| アプリケーション層 | ソフトウェア同士が会話する | HTTP, SSH, DNS, SMTP |
| トランスポート層 | データのやりとりの順番を制御したい、エラー改正したりするなど、信頼性を高めたデータの転送を制御する | TCP, UDP |
| インターネット層 | IPアドレスの割り当て、ルーティングをする | IP, ICMP, ARP |
| インタフェース層 | ネットワーク上で接続されている機器同士で通信する | Enthernet, PPP |

階層化がされている理由は、各階層を独立させるためです。
上位の階層破壊の階層がなんでも良く、また会の階層は上位の階層の内容は分からなくても良い、という構造になっています。

##データのカプセル化
###名前解決リクエストの作成(アプリケーション層)
webブラウザは、アドレス欄に入力されたURL(http://www.exmaple.co.jp )からドメイン名(www.example.co.jp )を抜き出し、名前解決しようとします。
DNSサーバーに対して名前解決の処理を依頼するため、DNSプロトコルで定められたフォーマットに従い、名前解決のリクエストデータを作成します。

###UDPカプセル化(トランスポート層)
上記のデータを送信するには、そのデータをトランスポート層に渡す必要があります。この時、上記のデータがトランスポート層のプロトコルでカプセル化されます。
カプセル化とは、郵便で言えば封筒に入れるイメージです。郵便の場合、手紙の内容はなんであれ、封筒に入れて宛先を書けば郵便局に処理を頼めます。郵便局は、その封筒の内容を知る必要がありません。
カプセル化もこれと同様に、中身に手を加えずに、さらに下の階層で処理ファできるようにデータを付与します。
トランスポート層のプロトコルは、TCPかUDPのいずれかです。DNSでは、一般にUDPを使う取り決めになっているため、UDPに引き渡します。
この時、送信元のポート番号、宛先番号、データのs長さ、エラーがないかどうかを調べるチェックサムなどの情報が追加されます。
dnsの場合、ウェルノウンポートは５３番なので、宛先ポート番号は５３が設定されます。
これらを**UDPヘッダー**と呼びます。

###IPでカプセル化(インターネット層)
次にUDPでカプセル化されたデータをインターネット層に渡します。
インターネット層のプロトコルはIPです。
IPでのカプセル化では、送信元IPアドレス、宛先IPアドレス、データ長、生存時間などの情報が追加されます。これらを**IPヘッダー**と呼びます。

###Ethernetでカプセル化(インタフェース層)
IPでカプセル化する段階でIPアドレスが付くので、実際にLANや電話回線などの配線上に流すことができます。この時、それぞれの配線の規格に準拠したヘッダーがいくつか付けられます。
たとえばLANは、Ethernetという規格を使っています。
Ethernetでは、先頭に末尾に幾つかのデータが追加されます。これを**Ethernetフレーム**と言います。
これには送信元MACアドレスや、宛先MACアドレスなどの情報が含まれます。

###EthernetとTCP/IPの関係
Ethernetで通信するパソコンやサーバー、各種ネットワーク機器などのホストには、雄一無二のMACアドレスと呼ばれる番号がふられています。パソコンやネットワーク機器には、05:0c:ce:d8:1b:a9のような文字列シールが貼られていることがありますが、これがMACアドレスです。

####ARPでIPアドレスを解決する
Ethernetでは、MACアドレスを頼りにデータを送信します。つまり05:0c:ce:d8:1b:a9宛に送信するというように宛先を特定します。
Ethernetのデータ通信では、Ethernetフレームだけを見て、中身のIPまでは見ません(そもそもEthernetでは、Ethernetフレームさえ付いていればどのようなデータも送受信できるので、中身がIPとは限りません)
そうすると、どのMACアドレスを持つホストが、どのIPアドレスに対応しているのかという対応表が必要となります。これをカイケルするのがAPRというプロトコルです。
たとえば、10.0.1.10というIPアドレスにデータを送信したいとします。最初に送信するときは、このIPアドレスを持つホストがどのMACアドレスを持っているのかわかりません。
そこで、10.0.1.10というIPアドレスを持っているホストは誰ですか？と問い合わせます。(ARP要求)
すると、そのIPアドレスを持っているホストは、僕です。macアドレスは05:0c:ce:d8:1b:a9ですという応答を返します。
これによって10.0.1.10と05:0c:ce:d8:1b:a9とが結びつき、対応表を作れます。
以降の通信では、この対応表を使って、もし、10.0.1.10が宛先なら、05:0c:ce:d8:1b:a9に送信するようにします。

##UDPとTCP
###UDPでのデータ通信
**UDP**はステートレスプロトコルと呼ばれる、状態を保たず、送りっぱなしのプロトコルです。
UDPの構造は単純で送信元ポート番号、宛先ポート番号の他には、データの長さと**チェックサム**(データの総和を検算することで、データに誤りがないかを調べる仕組み)しかありません。




#tips
- ARPはルーターを超えることができず、ARP要求で調べられMACアドレスとIPアドレスの対応は、自分が所属しているサブネット内に留まる。ルーターを超える場所にデータを転送するときは、そのルーターでまずはEthernetで届けます。
- インターネットに向けて通信する場合、最寄りのルーターとは**デフォルトゲートウェイ**(IPアドレスが自動設定になっているときは、デフォルトゲートウェイも自動設定されます。)で指定されたものです。
- クライアントが作ったEthernetフレームは、そのままDNSサーバーへ届くわけではなく、届くのは最寄りのルーターまでで、そこから先は、ルーターがEthernetヘッダーを付け替えて、DNSサーバーに向けて送信します。