【DHCP】IPアドレス自動割り当ての流れをパケットで理解する

# 目次
[1.はじめに](#はじめに)
[2.DHCPの役割を分かりやすく](#dhcpの役割を分かりやすく)
[3.DHCPの役割を詳しく](#dhcpの役割を詳しく)
[4.自動アドレス割り当てのやり方を分かりやすく](#自動アドレス割り当てのやり方を分かりやすく)
[5.自動アドレス割り当てのやり方を詳しく](#自動アドレス割り当てのやり方を詳しく)

# はじめに

#### いきさつ

DHCPが「自動でIPアドレスを割り振ってくれる便利なヤツ」だとざっくり理解していましたが、ここ最近腰を据えてしっかり学びました。これはその備忘録です。
もし間違えていたらなんでも教えていただけるとありがたいです。

#### こんな人向け
* DHCPが何をするプロトコルなのか、知ってるけど分からない
* 応用情報の合格にDHCPの理解が必要な気がする
* ネットワークを学び始めた
* DHCPのアドレス割り当ての流れに興味がある



# DHCPの役割を分かりやすく

**DHCPの役割は、「通信をこれから始めたい端末」に、「通信に必要な情報を自動で教える」ことです。**


# DHCPの役割を詳しく

端末と端末が通信をするにあたって、IPアドレスやデフォルトゲートウェイみたいな、必要な情報がいくつかあります。人間が設定することもできますが、面倒なのでDHCPにお任せします。
DHCPで通信に必要な情報を端末に自動で教えてあげることで
* ミス(誤入力)がない
* 面倒じゃない

といったメリットがあります。


### 身近なDHCP

DHCPは色んなところで当たり前に使われています。
例えば個人の家のWiFiを経由して通信を行うときも、DHCPを使っています。新しい端末(スマホやPC等)でWiFiで通信したいとき、おそらくルーターに貼付されているシール等でパスワードを入力するかと思います。そのとき端末にIPアドレスを設定する作業は、たぶんしないですよね。
IPアドレスは通信を行うにあたって不可欠なものです。その**入力作業が省略できているのは、ルーターがDHCPを利用して、端末に自動でIPアドレスが割り当ててているから**なんですね。

#### 本当に私の端末がDHCPを利用しているのか確認する

自分の端末のアドレス割り当てを設定から確認してみます。
(Windowsの設定>ネットワークとインターネット>Wi-Fiから確認しました)


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2922519/af9d3263-303a-edbf-b227-6e697081aa02.png" width="500">

たしかに「IP割り当て」や「DNSサーバーの割り当て」が「自動(DHCP)」となっていますね。実際にWiFiに接続できているのも確認できます。

# 自動アドレス割り当てのやり方を分かりやすく

図解すると、こんな感じになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2922519/2938028a-9251-3f2a-6a26-097d3311c7a9.png" width="700">

# 自動アドレス割り当てのやり方を詳しく

#### ①アドレス割り当ててくれ(DHCPDiscover)
**端末がDHCPサーバに自動アドレスの割り当てを依頼する**ための通信で、DHCPDiscoverと呼ばれています。端末はDHCPを送信した時点ではまだDHCPサーバーのIPアドレスを知らないため、このパケットはブロードキャストで送信されます。

#### ②使えるアドレスがあるか確認するね(ARP)
**DHCPサーバが、端末に割り当てるために決定したIPアドレスがネットワーク内で重複していないかを確認する**ための通信です。
これはDHCPサーバが把握していない端末がネットワーク内に存在する可能性を考慮しています。例えばDHCPサーバが端末に192.168.0.1を割当てようとしたとき、ネットワーク内に192.168.0.1のIPアドレスを既に割り当て済みの端末が存在する可能性があります。もし192.168.0.1をDHCPDiscoverを送信してきた端末に割り当ててしまうと、ネットワーク内に同じIPアドレスをもつ端末が複数存在してしまうことになってしまいます。

#### ③あったわ。このIPアドレスでどう？(DHCPOffer)
**DHCPサーバが端末に割り当てるIPアドレスを通知する**ための通信です。
しかし、端末はIPアドレスを通知されても、それをすぐに適用しません。これは、ネットワーク内に複数のDHCPサーバが存在する可能性を考慮するためです。端末が送信したDHCPDiscoverはブロードキャストで送信されているため、複数のDHCPサーバに受信された可能性があるのです。
なお、この時点ではまだ端末のIPアドレスは決定していないため、この通信もブロードキャストで送信されます。

#### ④それにする！(DHCPRequest)
端末が複数のDHCPサーバからDHCPOfferを受信した可能性があるのでした。**この通信は端末が「オマエが提案したIPアドレスを採用するよ」と、DHCPサーバに教える**ための通信です。
なお、端末は受信したDHCPOfferからDHCPサーバのIPアドレスを参照できるため、この通信はユニキャストで送信されます。

#### ⑤詳しい情報送るね(DHCPAck)
**DHCPサーバが、端末に割り当てるIPアドレス関連の情報を教える**ための通信です。ここにはデフォルトゲートウェイやDNSサーバのIPアドレスなどが含まれています。

#### ⑥アドレスもらったこと他の端末に教えてあげよ～
**端末が、周囲のホストに自身のIPアドレスを教える**ための通信です。ここまでの通信で端末のIPアドレスを確実に知っているのは端末自身とDHCPサーバだけなので、自分がいるネットワーク内のホストに、「オレのIPアドレスは192.168.0.1になったで～！」と教えてあげるんですね。
ちなみにこの周知はGARPで行われます。

# 用語

#### ブロードキャスト
宛先がどこにいるか分からないから、とりあえず周囲の全ての端末に送信する通信のこと。１対多の通信。
**ユニキャスト**：「あなただけに送ります！」という１対１の通信。
#### ARP
「～～のIPアドレスの端末、オレに返信くれー！」という通信です。②の通信では、～～の部分にDHCPサーバが端末に割り当てるために決定したIPアドレスが入ります。DHCPサーバがネットワーク内でARPを送ることで、自身が端末に割り当てようとしているIPアドレスが本当に利用可能かどうか、確認できるということ。ブロードキャストで送られます。
#### GARP
ARPの～～の部分に、送信元端末のIPアドレスを入れた通信。これは返信を期待して送るものではなく、自身のIPアドレスとMACアドレスを周知するために送っています。
#### DNSサーバ
ドメイン名からIPアドレスを調べるためのサーバ。
#### デフォルトゲートウェイ
他のネットワーク(自分からネットワーク的に遠い端末)と通信したいときに「とりあえずオレに送りな！」みたいな出口になっているホストのこと。
#### DHCPクライアント
DHCPサーバのサービスを受けるホストのこと。実物のイメージがつくようIPアドレスを割り当てられるホストを「端末」と呼んでいましたが、この場合はDHCPクライアント呼ぶ方が一般的です。