~~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バイト    |
+-----------------+------------------+------------------+------------------+-------------+
  • 宛先MACアドレス:データを送信する先のデバイスのMACアドレス
  • 送信元MACアドレス:データを送信したデバイスのMACアドレス
  • VLANタグ(4バイト)←無理やり入ったり入らなかったり
    • TPID(Tag Protocol Identifier, 2バイト): 常に 0x8100 で、フレームにVLANタグが含まれていることを示します。
    • TCI(Tag Control Information, 2バイト): VLAN IDや優先度などの情報を含みます。
  • タイプ(EtherType):上位プロトコル(例えばIPv4やIPv6)を識別するための値
  • データ(ペイロード):実際に送信されるデータ。最低46バイト、最大1500バイトの長さ
  • FCS (Frame Check Sequence):エラーチェックのためのフレームチェックシーケンス(CRCによるエラーチェック)
  • IPパケットフォーマット(IPヘッダー)

    ネットワーク層

    イーサネットフレームのデータ(ペイロード)部分にカプセル化

    20bytes

    +-------------------+------------------+--------------------+-------------------+
    | バージョン(4)     | ヘッダー長(4)    | サービスタイプ(8)   | 全長(16)           |
    +-------------------+------------------+--------------------+-------------------+
    | 識別子(16)        | フラグ(3)        | フラグメントオフセット(13)                 |
    +-------------------+------------------+--------------------+-------------------+
    | TTL(8)            | プロトコル(8)    | ヘッダチェックサム(16)                     |
    +-------------------+------------------+--------------------+-------------------+
    | 送信元IPアドレス(32)                                           |
    +----------------------------------------------------------------+
    | 宛先IPアドレス(32)                                             |
    +----------------------------------------------------------------+
    | オプション(可変)                                             |
    +----------------------------------------------------------------+
    | データ(ペイロード)                                            |
    +----------------------------------------------------------------+
    
  • バージョン:IPのバージョン番号(IPv4では4)
  • ヘッダー長:IPヘッダーの長さ(4ビット単位)
  • サービスタイプ:データの優先度やサービスの種類を指定
  • 全長:IPヘッダーとデータ部分を含むパケット全体のサイズ
  • 識別子:フラグメントされたパケットを識別するための番号
  • フラグ:パケットの分割に関するフラグ(フラグメント化の有無など)
  • フラグメントオフセット:パケットの分割位置を示す
  • TTL(Time to Live):パケットがネットワーク内を何回転送できるかを制限する値
  • プロトコル:次にどのプロトコルが続くか(例:TCP、UDPなど)
  • ヘッダチェックサム:ヘッダー部分のエラーチェック
  • 送信元IPアドレス:データを送信したデバイスのIPアドレス
  • 宛先IPアドレス:データを送信する先のデバイスのIPアドレス
  • データ(ペイロード):実際のデータ
  • TCPセグメントのフォーマット

    IPパケットのデータに

    +------------------+------------------+------------------+-------------------+
    | 送信元ポート(16) | 宛先ポート(16)   | シーケンス番号(32)                     |
    +------------------+------------------+------------------+-------------------+
    | 確認応答番号(32)                                                      |
    +------------------+------------------+------------------+-------------------+
    | ヘッダー長(4)    | 保留(6)         | フラグ(6)        | ウィンドウサイズ(16) |
    +------------------+------------------+------------------+-------------------+
    | チェックサム(16) | 緊急ポインタ(16)                                 |
    +------------------+------------------+------------------+-------------------+
    | オプション(可変)                                                   |
    +-----------------------------------------------------------------------+
    | データ(ペイロード)                                                  |
    +-----------------------------------------------------------------------+
    
  • 送信元ポート(16ビット)

      データを送信しているアプリケーションのポート番号を示します。

  • 宛先ポート(16ビット)

      データを受信するアプリケーションのポート番号を示します。

  • シーケンス番号(32ビット)

      データストリーム内で、現在送信しているTCPセグメントの開始位置を示します。これにより、受信側はデータの正しい順序を確認できます。

  • 確認応答番号(32ビット)

      受信側が送信側に返す確認応答で、次に期待されるシーケンス番号を指定します。これにより、信頼性の高いデータ通信が実現されます。

  • ヘッダー長(4ビット)

      TCPヘッダーの長さを32ビット単位で指定します。通常、20バイトの固定部分に加え、オプションフィールドが存在する場合はその分が追加されます。

  • 保留(6ビット)

      将来的な使用のために予約されており、現在は使われていません。常に0として設定されます。

  • フラグ(6ビット)

      それぞれのビットは異なる制御フラグとして使用され、TCPの制御操作を行います。

    • URG: 緊急ポインタフィールドが有効であることを示します。
    • ACK: 確認応答番号が有効であることを示します。
    • PSH: データがすぐに上位プロトコルに渡されることを要求します。
    • RST: 接続をリセットする要求。
    • SYN: 接続の確立を要求します(初回通信時)。
    • FIN: 接続の終了を要求します。
  • ウィンドウサイズ(16ビット)

      受信側が現在受け取れるデータの最大量を示します。フロー制御のために使われます。

  • チェックサム(16ビット)

      エラーチェックのために使用され、TCPヘッダーとデータの整合性を確認します。送信側で計算され、受信側でも再計算されて検証されます。

  • 緊急ポインタ(16ビット)

      緊急データが含まれる場合に使用され、緊急データの終了位置を示します。URGフラグが設定されている場合にのみ有効です。

  • オプション(可変長)

      接続に関する追加情報を含むことができ、MSS(Maximum Segment Size)などが設定されることがあります。ヘッダーの長さによって変わります。

  • データ(ペイロード)

      実際に送信するアプリケーションデータが格納されます。TCPヘッダーによって制御される信頼性のあるデータが含まれます。

  • UDPパケットフォーマット

    IPパケットのデータに

    +------------------+------------------+------------------+------------------+
    | 送信元ポート(16) | 宛先ポート(16)   | パケット長(16)   | チェックサム(16) |
    +------------------+------------------+------------------+------------------+
    | データ(ペイロード)                                               |
    +-------------------------------------------------------------------+
    
  • 送信元ポート:データを送信するアプリケーションのポート番号
  • 宛先ポート:データを受信するアプリケーションのポート番号
  • パケット長:UDPヘッダーとデータを含むパケット全体の長さ
  • チェックサム:オプションのエラーチェックフィールド(省略される場合もある)
  • データ(ペイロード):アプリケーションの実際のデータ
  • パケットキャプチャ

    📎 dhcp-only.pcapng
    ← Go home