DHCPといえば「IPアドレスを自動で割り当ててくれるプロトコル」という印象がありますが、実はそれだけじゃないぞ!というお話です。
DHCP
DHCPは正式名称「Dynamic Host Configuration Protocol」というプロトコルです。直訳すれば、動的にホスト設定をするプロトコルとなります。
一般的な使い方としては、DHCPサーバーがIPアドレスをリースするというのがありますが、基本的にはネットワーク設定の大半をサーバから配布することができます。
基本的にはホストのプラグアンドプレイを実現するためのプロトコルであり、DHCPサーバがネットワーク内に存在していれば、自動でネットワークを使用するために必要な設定が流し込まれます。
DHCPで設定できるのは、IPアドレス・サブネットマスク・デフォルトゲートウェイだけでなく、DNSサーバーアドレス、NTPサーバーアドレス、メールサーバーアドレスなど多岐にわたります。
ちなみに、DHCPは第7層「アプリケーション層」のプロトコルです。アプリケーション層のプロトコルに基づいて、第3層ネットワーク層の設定を行うためです。送信元ポート番号は67、宛先ポート番号は68です。
DHCPはUDPのプロトコルですので、通常「サーバ」と「クライアント」という関係は存在しません。しかし、DHCPは「情報を要求する側」と「情報を提供する側」というのが正確に存在しているため、サーバとクライアントが明確に分けられています。
DHCPの基本的なシーケンス
DHCPの基礎部分として簡単にシーケンスをご紹介したいと思います。
基本的にDHCPのシーケンスは「サーバーを探索する」という段階と「実際にデータを」という段階の2段階に分けられます。実際の流れを見ていきましょう。

DHCPクライアントは、ネットワークに対してブロードキャストでDHCP Discoverを送信します。DHCP Discoverパケットには、要求する情報(DHCP option/後述)とクライアントのホストの情報が含まれています。

DHCP Discoverを受け取ったDHCPサーバは、受け取ったDHCP discoverの情報を基に自身が持っているネットワーク設定情報をDHCP offerとして提示します。同時にDHCPサーバは、クライアントに貸し出す情報(リソース)を仮確保します。

DHCP offerを受け取ったDHCPクライアントは、DHCPサーバに対して、提示された情報を使用する旨をDHCP requestとして通知します。
図中で「選択したDHCPサーバ」の情報を提供している理由は、ブロードキャストでDHCP requestを送信し、そのパケットにDHCPサーバの情報をもたせることで、選択されていないDHCPサーバが選択されなかったことを認識し、仮確保したリソースを解放するためです。
ただし、DHCP offerは必ずしもブロードキャストで送信されるわけではなく、ユニキャストで送信される場合があります。この場合は、選択されなかったDHCPサーバが仮確保しているリソースは、リース期限まで確保されたままとなります。DHCPサーバの実装にもよりますが、仮確保のリース時間はかなり短く設定されており、offerを受け取らなかったとてリースの無駄な確保が長時間発生することはないとは思います。

そして、DHCP requestを受け取ったDHCPサーバはユニキャストでDHCP acknowledgeを送信します。DHCP acknowledgeには、DHCP offerに含まれた情報に加え、DHCPサーバからクライアントに貸し出される設定のリース時間の情報が含まれています。これは、DHCP requestを受け取ったDHCPサーバが仮確保だったリソースを本格的に確保し、そのリース時間を提示するためです。
これが一連のDHCPのやり取りの流れです。
discover・offer・request・acknowledgeをまとめてDORAと呼ぶこともあるみたいです。
DHCPのパケットにはDORA以外にも「DHCP infomation」と「DHCP releasing」があります。
DHCP infomationは、DHCP requestsがIPアドレスの割り当てを要求するのに対して、それを要求せずそれ以外の情報を知りたいときに使用します。例えば、IPは静的ですでに設定済みだが、DNSなどの情報が欲しい場合などです。DHCP infomationにはDHCP acknowledgeが応答されます。
DHCP releasingは、IPアドレスの返却です。基本的に、IPアドレスの確保は、リースの更新が行われない限り、リース時間経過後に解放されますがDHCP releasingを使用することでクライアント側から「もう使わない」ことを通知し、解放可能であることを通知することができます。なお、DHCP releasingをサーバに送信するということは義務付けられているわけではありません。
リースの更新
DHCPサーバの貸し出した情報のリース期限が近づくと、DHCPクライアントはDHCPに対してリース情報の更新を行います。この場合、基本的にはDHCPサーバの素性がわかっているのでユニキャストで行われる事が多いです。
素性がわかっているということは、DHCPサーバの探索が不要になるため、DHCP requestとDHCP acknowledgeの1往復だけで行われます。
DHCPリレーエージェント

サブネットを使用するような大規模なネットワークにおいて、各サブネットにDHCPサーバを配置するのは面倒です。このような場合は、ネットワークでDHCPサーバを1台用意し、各セグメントごとにDHCPリレーエージェントを配置するのが定石です。
DHCPリレーエージェントがやっていることは単に、DHCPの各パケットをブリッジすることです。ただし、DHCPクライアント - DHCPリレーエージェント間の通信がブロードキャストであったとしても、DHCPリレーエージェント - DHCPサーバ間の通信は必ずユニキャストになります。
つまり、リレーエージェント自身は必ずDHCPサーバを知っています。
DHCPのデータフォーマット
DHCPのプロトコルについて語る記事なので、簡単にですが、DHCPのデータフォーマットについて触れておきます。

各フィールドの簡単な説明は以下のとおりです。
| フィールド | サイズ (Byte) |
オフセット (Byte) |
役割 |
|---|---|---|---|
| op | 1 | 0 | Message Operation Code。 クライアントからのメッセージあれば1、サーバーからのメッセージであれば2が入る。 |
| htype | 1 | 1 | Hardware Address Type |
| hlen | 1 | 2 | Hardware Address length. 普通はMACアドレスの6 Byteを示す6になるはず・・・ |
| hops | 1 | 3 | 何回リレーされたか。クライアントは0を設定し、リレーエージェントが加算していく |
| xid | 4 | 4 | Transaction ID。ランダムな値が入り、DORAで一貫した数字を維持する。シーケンスの分別に使用 |
| secs | 2 | 8 | DHCP Discoverをはじめてからの秒数。クライアントがどれくらい待たされてるかを保持し、秒数がながければ優先的に処理する実装もある |
| flags | 2 | 10 | フラグとして用意されている16-bit分の2進数列。現状、Bflagの1つしか定義されていない。このフラグが経っている場合、DHCPクライアントへの応答はブロードキャストである必要がある |
| ciaddr | 4 | 12 | クライアント自身のIPアドレス。 |
| yiaddr | 4 | 16 | Your IP Address. DHCPサーバがクライアントにリースするIPアドレスを格納する。 |
| siaddr | 4 | 20 | Server IP Address.次に接続すべきサーバを示す。主にPXEなどのネットワークブートで使用され、ブートローダやOSイメージを取得するサーバのIPアドレスを示す。 |
| giaddr | 4 | 24 | リレーエージェントのMACアドレス |
| chaddr | 16 | 28 | クライアントのハードウェアアドレス。普通はMACアドレス。 |
| sname | 64 | 44 | サーバホスト名 |
| file | 128 | 108 | ブートファイル名。PXEブートなどで使用。 |
| option | 可変 | 236 | オプション領域(後述) |
DHCPは、前身であるBOOTPとの互換性を維持しています。BOOTPは、DHCPと同様にIPアドレスなどのネットワーク設定を割り当てる機能を持つほか、ディスクレスワークステーション(記憶装置を持たないマシン)が、PXEなどのネットワークブートを利用してOSを起動する際にも用いられていました。
BOOTPを利用した起動では、クライアントは起動後にBOOTPサーバからネットワーク設定に加え、ブートローダやOSイメージ、ファームウェアなどが格納されたTFTPサーバやHTTPサーバの情報を取得します。そのため、DHCPにもBOOTP互換のフィールドとして、次に接続すべきブートサーバのIPアドレスを示すsiaddrや、取得すべきブートファイル名を示すfileフィールドが残されています。
option部については次章で説明します。
DHCP optipn
さて、本稿の題名を「色々できるぞDHCP」とした理由は、DHCPって案外いろんな情報を配布できるからなんです。その本題が本章です。
DHCP optionと定められているのは、0x00ECバイト目以降ですが、option部の先頭2 Byte分はMagic Cookie 0x 63 82 53 63が固定で入ります。
こもMagic Cookieの役割は、DHCPかBOOTPかを区別するために利用します。基本的に、BOOTPとDHCPは仕様がかなり共通しており、0x0000~0x00EBバイトは全く同じフォーマットです。
なので、DHCPにおけるoption部は実質的にMagic Cookieに続く0x00F0バイト目以降となります。
このoption部に含まれる情報はRFC 2132「DHCP Options and BOOTP Vendor Extensions」で定められています。
option部の含まれ方は以下のような形になります。

これが連続してoption部に含まれています。
このcodeは、Dataにどんな情報が含まれているかを示しています。以下にCodeと情報の対応表を示します。
| ID | オプション | サイズ | 概要 | RFC |
|---|---|---|---|---|
| RFC 1497 Vendor Extensions | ||||
| 0 | Pad Option | 0 | Pad。option部を一定サイズ(314 Byte)まで埋めるために使用 | 2132 |
| 255 | End Option | 0 | 終端であることを意味するタグ | 2132 |
| 1 | Subnet Mask | 4 | サブネットマスク | 2132 |
| 2 | Time Offset | 4 | タイムオフセット(UTCとの秒差 符号付き32-bit 整数) | 2132 |
| 3 | Router Option | 可変 | デフォルトゲートウェイ | 2132 |
| 4 | Time Server Option | 可変 | NTPサーバ | 2132 |
| 5 | Name Server Option | 可変 | IEN116サーバ | 2132 |
| 6 | Domain Name Server Option | 可変 | DNSサーバ | 2132 |
| 7 | Log Server Option | 可変 | MIT-LCS UDP log servers アドレス | 2132 |
| 8 | Cookie Server Option | 可変 | Quote of the Day(QOTD)/ Cookie Protocol サーバアドレス | 2132 |
| 9 | LPR Server Option | 可変 | LPR serverサーバアドレス | 2132 |
| 10 | Impress Server Option | 可変 | Impress サーバアドレス | 2132 |
| 11 | Resource Location Server Option | 可変 | RLPサーバアドレス | 2132 |
| 12 | Host Name Option | 可変 | クライアントホスト名 | 2132 |
| 13 | Boot File Size | 2 | ブートファイルのサイズ | 2132 |
| 14 | Merit Dump File | 可変 | クライアントクラッシュ時のメモリダンプサーバ | 2132 |
| 15 | Domain Name | 可変 | DNSドメイン名 | 2132 |
| 16 | Swap Server | 可変 | スワップ領域を提供するサーバのアドレス | 2132 |
| 17 | Root Path | 可変 | クライアントのルートファイルシステムがあるパス名 | 2132 |
| 18 | Extensions Path | 可変 | 拡張設定ファイルが格納されているパス名 | 2132 |
| IP Layer Parameters per Host | ||||
| 19 | IP Forwarding Enable/Disable Option | 1 | IPフォワーディングの有効無効 | 2132 |
| 20 | on-Local Source Routing Enable/Disable Option | 1 | ローカル以外のサブネットへのソース・ルーティングの有効フォワーディングの有効無効 | 2132 |
| 21 | Policy Filter Option | 可変 | 2132 | |
| 22 | Maximum Datagram Reassembly Size | 2 | 最大のデータグラム再構築サイズ | 2132 |
| 23 | Default IP Time-to-live | 1 | TTLのデフォルト値(IP) | 2132 |
| 24 | Path MTU Aging Timeout Option | 4 | MTU有効時間 | 2132 |
| 25 | Path MTU Plateau Table Option | 可変 | MTU Plateauテーブル | 2132 |
| IP Layer Parameters per Interface | ||||
| 26 | Interface MTU Option | 2 | MTUサイズ | 2132 |
| 27 | All Subnets are Local Option | 1 | すべてのサブネットを同一のローカルNWとみなすかどうか | 2132 |
| 28 | Broadcast Address Option | 4 | ブロードキャストアドレス | 2132 |
| 29 | Perform Mask Discovery Option | 1 | ICMPサブネットマスクDiscoveryへの応答可否 | 2132 |
| 30 | Mask Supplier Option | 1 | ICMP Router Discoveryへの応答可否 | 2132 |
| 31 | Perform Router Discovery Option | 1 | クライアントによるRouter Disciveryの実行可否 | 2132 |
| 32 | Router Solicitation Address Option | 4 | Router Solicitationの宛先IPアドレス | 2132 |
| 33 | Static Route Option | 可変 | 静的ルーティング | 2132 |
| Link Layer Parameters per Interface | 2132 | |||
| 34 | TCP Default TTL Option | 1 | ARP通信時のTrailer Encapsulationの仕様可否 | 2132 |
| 35 | ARP Cache Timeout Option | 4 | ARPキャッシュ(MACアドレス対応表)の保持時間 | 2132 |
| 36 | Ethernet Encapsulation Option | 1 | Ethernetフレーム形式 | 2132 |
| TCP Parameters | 2132 | |||
| 37 | TCP Default TTL Option | 1 | TTLのデフォルト値(TCP) | 2132 |
| 38 | TCP Keepalive Interval Option | 4 | TCP Keepaliveの送信インターバル | 2132 |
| 39 | TCP Keepalive Garbage Option | 1 | TCP Keepalive Gabageデータの付与の可否 | 2132 |
| Application and Service Parameters | ||||
| 40 | Network Information Service Domain Option | 可変 | NISドメイン名 | 2132 |
| 41 | Network Information Servers Option | 可変 | NISサーバアドレス | 2132 |
| 42 | Network Time Protocol Servers Option | 可変 | NTPサーバアドレス | 2132 |
| 43 | Vendor Specific Information | 可変 | ベンダ独自の固有オプション用 | 2132 |
| 44 | NetBIOS over TCP/IP Name Server Option | 可変 | NetBIOS Name Server (NBNS) アドレス | 2132 |
| 45 | NetBIOS over TCP/IP Datagram Distribution Server Option | 可変 | NetBIOS Datagram Distribution (NBDD)アドレス | 2132 |
| 46 | NetBIOS over TCP/IP Node Type Option | 1 | NetBIOSの名前解決方式(Node Type) | 2132 |
| 47 | NetBIOS over TCP/IP Scope Option | 可変 | NetBIOSの論理グループ名 | 2132 |
| 48 | X Window System Font Server Option | 可変 | X Window Sustemのフォントサーバ | 2132 |
| 49 | X Window System Display Manager Option | 可変 | X Window Systemのマネージャアドレス | 2132 |
| 50 | Requested IP Address | 4 | クライアントがリクエストするIPアドレス | 2132 |
| 51 | IP Address Lease Time | 4 | IPアドレスのリース期間(クライアントも要求可能) | 2132 |
| 52 | Option Overload | 1 | file/snameのフィールドをoptionフィールドとして使用するか | 2132 |
| 53 | DHCP Message Type | 1 | DHCPメッセージタイプ。ここにDORAのいずれかなどの情報が入る。 | 2132 |
| 54 | Server Identifier | 4 | DHCPサーバ識別子。通常はDHCPサーバのIPアドレス | 2132 |
| 55 | Parameter Request List | 可変 | クライアントからのパラメータ要求リスト。欲しいoptionのタグをクライアントが通知する | 2132 |
| 56 | Message | 可変 | 人間向けDHCPサーバからのエラーメッセージ | 2132 |
| 57 | Maximum DHCP Message Size | 2 | クライアントが受信可能なメッセージのサイズ | 2132 |
| 58 | Renewal (T1) Time Value | 4 | クライアントがアドレスを取得してからRenewal(リースの再延長要求)するまでの期間(秒) | 2132 |
| 59 | Rebinding (T2) Time Value | 4 | クライアントがアドレスを取得してからRebindingする(他のDHCPに助けを求める)までの期間(秒) | 2132 |
| 60 | Vendor class identifier | 可変 | クライアント自身の機器の種類・ベンダを格納 | 2132 |
| 61 | Client-identifier | 可変 | クライアントの識別子。通常はMACアドレス。 | 2132 |
| 64 | Network Information Service+ Domain Option | 可変 | NIS+ クライアントドメイン名 | 2132 |
| 65 | Network Information Service+ Servers Option | 可変 | NIS+ サーバ | 2132 |
| 66 | TFTP server name | 可変 | TFTPサーバ名(siaddrの代替) | 2132 |
| 67 | Bootfile name | 可変 | Bootfile名(snameの代替) | 2132 |
| 68 | Mobile IP Home Agent option | 可変 | Mobile IP の Home Agent アドレス | 2132 |
| 69 | Simple Mail Transport Protocol (SMTP) Server Option | 可変 | SMTPサーバ一覧 | 2132 |
| 70 | Post Office Protocol (POP3) Server Option | 可変 | POP3サーバ一覧 | 2132 |
| 71 | Network News Transport Protocol (NNTP) Server Option | 可変 | NNTPサーバ一覧 | 2132 |
| 72 | Default World Wide Web (WWW) Server Option | 可変 | デフォルトのWWWサーバアドレス | 2132 |
| 73 | Default Finger Server Option | 可変 | デフォルトのFingerサーバアドレス | 2132 |
| 74 | Default Internet Relay Chat (IRC) Server Option | 可変 | デフォルトのIRCサーバアドレス | 2132 |
| 75 | StreetTalk Server Option | 可変 | StreetTalkサーバ一覧 | 2132 |
| 76 | StreetTalk Directory Assistance (STDA) Server Option | 可変 | STDA サーバ一覧 | 2132 |
| 77 | User Class option | 可変 | クライアントの分類ラベル | 3004 |
| 78 | SLP Directory Agent Option | 可変 | Serveice Location Protocol(SLP)のDirectory Agentのアドレス情報 | 2610 |
| 79 | SLP Service Scope Option | 可変 | SLPのスコープ | 2610 |
| 80 | Service Location Protocol Naming Authority | (未標準) | 3679 | |
| 81 | The Client FQDN Option | 可変 | クライアントのFQDN名。ダイナミックDNSへの登録などに使用 | |
| 82 | Relay Agent Information Option | 可変 | リレーエージェントの情報 | 3046 |
| 83 | Relay Agent Options | (未標準) | 3679 | |
| 84 | Relay Agent Options | (未標準) | 3679 | |
| 85 | NDS Servers Option | 可変 | NDSサーバ(Directory Server)のIPアドレス一覧 | |
| 86 | NDS Tree Name Option | 可変 | NDSツリー名 | |
| 87 | NDS Context Option | 可変 | ユーザの初期ディレクトリ位置 | |
| 88 | IEEE 1003.1 POSIX Timezone | 可変 | (未標準) | 3679 |
| 89 | FQDNs in DHCP Options | 可変 | (未標準) | 3679 |
| 90 | Authentication | 可変 | ||
| 91 | VINES TCP/IP Server | 可変 | (未標準) | 3679 |
| 92 | Server Selection | 可変 | (未標準) | 3679 |
| 93 | Client System | 可変 | RFCに規定なし | 3679 |
| 94 | Client NDI | 可変 | RFCに規定なし | 3679 |
| 95 | LDAP | 可変 | Apple独自実装 | 3679 |
| 96 | IPv6 Transitions | 可変 | (未標準) | 3679 |
| 97 | UUID/GUID | 可変 | RFCに規定なし | 3679 |
| 98 | User-Auth | 可変 | ||
| 99 | 未定義 | |||
| 100 | Printer Name | 可変 | (未標準) | 3679 |
| 101 | MDHCP | 可変 | (未標準) | 3679 |
| 102~ | 削除/未定義 | |||
| 107 | ||||
| 108 | Swap Path | 可変 | (未標準) | 3679 |
| 109 | 未定義 | |||
| 110 | IPX Compatability | 可変 | (未標準) | 3679 |
| 111 | 未定義 | |||
| 112 | Netinfo Address | 可変 | Apple独自実装 | 3679 |
| 113 | Netinfo Tag | 可変 | Apple独自実装 | 3679 |
| 114 | URL | 可変 | Apple独自実装 | 3679 |
| 115 | Failover | 可変 | 標準にならず | 3679 |
| 116 | Auto-Config | 可変 | (未標準) | 3679 |
| 117 | Name Service Search Option | 2 | 2937 | |
| 118 | Subnet Selection Option | 4 | クライアントが要求するIPアドレスのサブネットの指定 | 3011 |
| 119 | Domain Search Option | 可変 | DNSドメイン検索リスト | 3397 |
| 120 | Domain Name List | 可変 | ドメイン名のリスト | 3361 |
| 121 | Classless Route Option | 可変 | 宛先ネットワークごとのルーティング情報 | 3442 |
| 208 | MAGIC Option | 可変 | 特定用途であることを示すシグネチャ | 5071 |
| 209 | Configuration File Option | 可変 | クライアントが取得すべき設定ファイル名 | 5071 |
| 210 | Path Prefix Option | 可変 | クライアントがファイルを取得する基準パス | 5071 |
さすがにこれを全部使うというわけではありませんし、どんなDHCPサーバもDHCPクライアントも両方ともこれに完全に対応しているわけではありません。
ただ、特に重要なのが、50~59のあたりになるかなぁと思います。DHCPの本質ですし。
option部には、上記図のような形でこれらの情報が羅列されていることになります。
ただ、どうしてもこれらの情報を大きくするとパケットが巨大になってしまいます。そのため、52番を1にして、snameやsiaddrのようにもはやDHCPでは使わないフィールドをoption部として上書きして使用したり、DHCP自体はパケットを分割して送信することは推奨されないものの、119番などの一部のパラメータは分割して送信する仕組みがあるのでそれを使うなどして対策しています。
〆
とまあ、本当は実物パケットを乗っけて紹介したかったんですけど、だらだらこの表作るだけで半日潰れたので今日はここまで。
普段何気なく使ってるIPの自動割り当てとDHCP。実は「プラグアンドプレイにしたい」というのが発端だったりするので、実に様々な情報を配布することができるのでした。DHCPって面白いんだぞ!っていうことが伝われば嬉しいなと思います。
今回この記事を書くにあたっては、RFCのドキュメントを読み漁りました。難しかったですが勉強になりました(参考にしたドキュメントは下の方に参考文献として掲載しています)。
皆さんも時間があれば、この手の仕様書、無料で公開されているものを読んでみると「普段使ってるこいつ、実はこんなこともできたのか!」という気付きになるかもしれませんし、おもしろいのでぜひ。
最近はAI使って翻訳やら要約しながら読むと理解しやすいしね。ほなまた。
この記事を書いた人
西田(総合情報学部 情報学科 2021年入学)
通信研究会OB。当ホームページの保守運用を支援しています。組み込み系のソフトウェアエンジニア。応用情報技術者・修習技術者。
参考文献
- RFC 1497: BOOTP Vendor Information Extensions
- RFC 2131: Dynamic Host Configuration Protocol
- RFC 2132: DHCP Options and BOOTP Vendor Extensions
- RFC 2610: DHCP Options for Service Location Protocol
- RFC 3004: The User Class Option for DHCP
- RFC 3011: The IPv4 Subnet Selection Option for DHCP
- RFC 3046: DHCP Relay Agent Information Option
- RFC 3361: Dynamic Host Configuration Protocol (DHCP-for-IPv4) Option for Session Initiation Protocol (SIP) Servers
- RFC 3396: Encoding Long Options in the Dynamic Host Configuration Protocol (DHCPv4)
- RFC 3442: The Classless Static Route Option for Dynamic Host Configuration Protocol (DHCP) version 4
- RFC 3397: Dynamic Host Configuration Protocol (DHCP) Domain Search Option
- RFC 3679: Unused Dynamic Host Configuration Protocol (DHCP) Option Codes
- RFC 4361: Node-specific Client Identifiers for Dynamic Host Configuration Protocol Version Four (DHCPv4)
- RFC 5071: Dynamic Host Configuration Protocol Options Used by PXELINUX
- RFC 5494: IANA Allocation Guidelines for the Address Resolution Protocol (ARP)
- 【図解】DHCPのパケットフォーマット~Magic cookieやsname/fileの意義~ | SEの道標
- 井上直也,村山公保,竹下隆史,荒井透,苅田幸雄「マスタリングTCP/IP入門編 第6版」(オーム社、2019)
- DHCP設定は正しいか?~DHCP設定の確認と利用~:ネットワーク・コマンドでトラブル解決(6) - @IT

