~~DHCPサーバー作った~~作れてない
https://github.com/hitto-hub/arp-net-tes
特に書くこともないので調べたことを書く
振り返り
DHCPの仕組み
https://www.infraexpert.com/study/tcpip13.html
UDP上で動作するプロトコルです。DHCPサーバ宛にパケットを送る場合のポート番号は
DHCP Discoverをブロードキャスト。
DHCP Offer
DHCP Requestをブロードキャスト。
DHCP Ack
DHCPパケットフォーマット
RFC 2132 にて定義されています
https://milestone-of-se.nesuke.com/l7protocol/dhcp/dhcp-format/
イーサネットパケットフォーマット
物理層とデータリンク層
+-----------------+------------------+------------------+------------------+-------------+
| 宛先MACアドレス | 送信元MACアドレス | タイプ(EtherType) | データ(ペイロード) | FCS (CRC) |
| 6バイト | 6バイト | 2バイト | 46〜1500バイト | 4バイト |
+-----------------+------------------+------------------+------------------+-------------+
- TPID(Tag Protocol Identifier, 2バイト): 常に 0x8100 で、フレームにVLANタグが含まれていることを示します。
- TCI(Tag Control Information, 2バイト): VLAN IDや優先度などの情報を含みます。
IPパケットフォーマット(IPヘッダー)
ネットワーク層
イーサネットフレームのデータ(ペイロード)部分にカプセル化
20bytes
+-------------------+------------------+--------------------+-------------------+
| バージョン(4) | ヘッダー長(4) | サービスタイプ(8) | 全長(16) |
+-------------------+------------------+--------------------+-------------------+
| 識別子(16) | フラグ(3) | フラグメントオフセット(13) |
+-------------------+------------------+--------------------+-------------------+
| TTL(8) | プロトコル(8) | ヘッダチェックサム(16) |
+-------------------+------------------+--------------------+-------------------+
| 送信元IPアドレス(32) |
+----------------------------------------------------------------+
| 宛先IPアドレス(32) |
+----------------------------------------------------------------+
| オプション(可変) |
+----------------------------------------------------------------+
| データ(ペイロード) |
+----------------------------------------------------------------+
TCPセグメントのフォーマット
IPパケットのデータに
+------------------+------------------+------------------+-------------------+
| 送信元ポート(16) | 宛先ポート(16) | シーケンス番号(32) |
+------------------+------------------+------------------+-------------------+
| 確認応答番号(32) |
+------------------+------------------+------------------+-------------------+
| ヘッダー長(4) | 保留(6) | フラグ(6) | ウィンドウサイズ(16) |
+------------------+------------------+------------------+-------------------+
| チェックサム(16) | 緊急ポインタ(16) |
+------------------+------------------+------------------+-------------------+
| オプション(可変) |
+-----------------------------------------------------------------------+
| データ(ペイロード) |
+-----------------------------------------------------------------------+
データを送信しているアプリケーションのポート番号を示します。
データを受信するアプリケーションのポート番号を示します。
データストリーム内で、現在送信しているTCPセグメントの開始位置を示します。これにより、受信側はデータの正しい順序を確認できます。
受信側が送信側に返す確認応答で、次に期待されるシーケンス番号を指定します。これにより、信頼性の高いデータ通信が実現されます。
TCPヘッダーの長さを32ビット単位で指定します。通常、20バイトの固定部分に加え、オプションフィールドが存在する場合はその分が追加されます。
将来的な使用のために予約されており、現在は使われていません。常に0として設定されます。
- URG: 緊急ポインタフィールドが有効であることを示します。
- ACK: 確認応答番号が有効であることを示します。
- PSH: データがすぐに上位プロトコルに渡されることを要求します。
- RST: 接続をリセットする要求。
- SYN: 接続の確立を要求します(初回通信時)。
- FIN: 接続の終了を要求します。
それぞれのビットは異なる制御フラグとして使用され、TCPの制御操作を行います。
受信側が現在受け取れるデータの最大量を示します。フロー制御のために使われます。
エラーチェックのために使用され、TCPヘッダーとデータの整合性を確認します。送信側で計算され、受信側でも再計算されて検証されます。
緊急データが含まれる場合に使用され、緊急データの終了位置を示します。URGフラグが設定されている場合にのみ有効です。
接続に関する追加情報を含むことができ、MSS(Maximum Segment Size)などが設定されることがあります。ヘッダーの長さによって変わります。
実際に送信するアプリケーションデータが格納されます。TCPヘッダーによって制御される信頼性のあるデータが含まれます。
UDPパケットフォーマット
IPパケットのデータに
+------------------+------------------+------------------+------------------+
| 送信元ポート(16) | 宛先ポート(16) | パケット長(16) | チェックサム(16) |
+------------------+------------------+------------------+------------------+
| データ(ペイロード) |
+-------------------------------------------------------------------+