【入門編】 IPv4ヘッダーのVersionフィールドとIHLフィールドの役割 – ネットワーク基礎とWebセキュリティ実践ガイド

こんにちは!技術メディアの主筆ライターであり、日々ネットワークの深淵(しんえん)からパケットの挙動を追いかけ続けているセキュリティスペシャリストのトモです。

インフラやネットワークの世界へ一歩を踏み出した皆さま、ようこそ!
普段、私たちが何気なくクリックしているWebページや、SNSのメッセージ。これらはすべて、ネットワーク上を流れる「パケット」という小さなデータの塊に分割されて運ばれています。

「ネットワークの勉強を始めたけれど、英語のヘッダー名やビット数が出てきて頭が痛くなってきた…」
「IPv4ヘッダーの Version とか IHL って、何のためにあるの?」

そんな疑問を抱えていませんか?大丈夫です。一歩ずつ、丁寧に紐解いていけば、パケットの構造は驚くほどシンプルで、人間味あふれる工夫に満ちていることが分かります。

今回は、IPv4パケットの先頭に位置する超重要フィールドVersion(バージョン)とIHL(インターネットヘッダー長)について、郵便配達の仕組みに例えながら、その真の役割と技術的な背景を優しく解説します。

最後には、実際にパケットのナマの姿を覗き見るためのPythonコードも用意していますので、ぜひ最後まで楽しんでいってくださいね!

—

1. IPパケットは「宛名が書かれた封筒」である

ネットワーク上を流れるIPパケットは、現実世界でいう「手紙(封筒)」のようなものです。

封筒の中には、あなたが送りたいメッセージ(データ)が入っています。そして封筒の表面には、宛先や差出人の住所、そして郵便局が処理するための様々な情報が書かれていますよね。この「封筒の表面に書かれた宛名書き」に相当する部分を、ネットワークの世界では「IPヘッダー」と呼びます。

このIPヘッダーの「一番最初」に書かれているのが、今回主役となる Version と IHL なのです。

![封筒とIPヘッダーのイメージ](https://images.unsplash.com/photo-1557200134-90327ee9fafa?auto=format&fit=crop&w=800&q=80) *(イメージ画像:パケットは、宛先が緻密に書き込まれた手紙のようなものです)*

—

2. Versionフィールド(4ビット):

「これ、何世代目のルールで書かれた手紙?」

まず、IPヘッダーの先頭4ビット(※ビットはデータの最小単位です)に配置されているのが Version フィールドです。

これは現実世界で例えるなら、「この手紙は、どの郵便規格(フォーマット)で書かれていますか?」を瞬時に判別するためのマークです。

現在、インターネットで使われているIPの規格には、大きく分けてIPv4とIPv6の2種類があります。
ルーター(郵便局の仕分け機)は、パケットが届いた瞬間にこの最初の4ビットを読み取ります。

  • ここが 4(2進数で 0100)なら、「よし、これはIPv4のルールで書かれた手紙だな!」と判断します。
  • ここが 6(2進数で 0110)なら、「なるほど、これは最新のIPv6だな!」と判断し、それぞれの処理ルートにパケットを流します。

もしこのフィールドがなければ、ルーターは「この手紙、どっちのルールで解釈すればいいんだ?」と迷子になってしまいます。だからこそ、一番最初に「私はIPv4ですよ!」と宣言する必要があるのですね。

—

3. IHLフィールド(4ビット):

「宛名ラベルはどこまで? 本文はどこから始まる?」

次に続く4ビットが、今回の隠れた主役である IHL(Internet Header Length:インターネットヘッダー長) です。

郵便に例えるなら、これは「宛名ラベルの縦の長さ」を表しています。

手紙を読むとき、私たちは「ここからが宛名で、ここからが本文(お手紙の中身)だな」と自然に分かりますよね。しかし、融通の利かないコンピューターやルーターは、境界線を教えてもらわないと分かりません。

「IPヘッダー(宛名)」のすぐ後ろには、Webデータなどの「データ本体(ペイロード)」がピタッとくっついています。ルーターがパケットを正しく処理するためには、「ヘッダーがどこで終わり、どこからデータ本体が始まるのか」を正確に知る必要があります。

その境界線を示すのが、この IHL フィールドなのです。

—

4. なぜ「4ビット」なのか? 最大60バイトの技術的背景

ここで少しだけ、数字のパズルを解き明かしていきましょう。一歩ずつ進めば簡単ですので、安心してくださいね!

なぜ、そのままのバイト数で書かないの?

IHL に割り当てられているデータ量は、わずか 4ビット です。
4ビットという小さなスペースでは、10進数で 0 から 15 までの数字しか表現できません。

しかし、IPv4のヘッダーは、最低でも 20バイト の長さがあります。オプションという追加の宛名情報を書き込むと、最大で 60バイト まで膨らむことがあります。

「あれ? 0〜15 までしか数えられないのに、どうやって 20 や 60 という長さを表すの?」と思いますよね。

ここに、ネットワークの先人たちの素晴らしい知恵(ハック)があります。

魔法のルール:「4倍して計算する」

IHL フィールドに書かれる数字は、そのままのバイト数ではなく、「32ビット(=4バイト)の塊がいくつあるか」という単位(ワード数)で数えるルールになっています。

つまり、「IHLの値 × 4 = 実際のヘッダーのバイト数」 になるのです!

具体例を見てみましょう。

1. オプションなし(標準的なIPv4ヘッダー:20バイト)の場合

  • 20バイト ÷ 4 = 5
  • このとき、IHL フィールドには 5(2進数で 0101)が書き込まれます。
  • ルーターは「5 × 4 = 20バイトだな。じゃあ、先頭から20バイト目までが宛名で、21バイト目からが本文だ!」と理解します。

2. オプションあり(最大サイズ:60バイト)の場合

  • 60バイト ÷ 4 = 15
  • このとき、IHL フィールドには、4ビットで表現できる最大値の 15(2進数で 1111)が書き込まれます。
  • ルーターは「15 × 4 = 60バイトだな。ここから先が本文だ!」と判断します。

4ビットという極小のスペースを最大限に活かして、20〜60バイトという長さを表現するために、「4倍する」という賢いルールが作られたのですね。そしてこのルールがあるため、IPv4ヘッダーの最大長は 60バイト に制限されているのです。

—

5. 【実践】PythonでパケットのVersionとIHLを覗いてみよう!

言葉での理解ができたら、実際にパケットの中身を覗いて、実感を掴んでみましょう!
ネットワークエンジニアが現場でよく使うPythonの強力なライブラリ Scapy(スキャピ)を使って、IPv4パケットの Version と IHL を解析する簡単なスクリプトを作成しました。

インフラ構築やトラブルシューティングの現場でも、こうしたスクリプトでパケット構造を検証することがよくあります。

# 必要なライブラリをインポートします
# ※事前に「pip install scapy」でインストールしておく必要があります
from scapy.all import IP

def analyze_ip_header():
    print("=== IPv4パケットの生成とヘッダー解析 ===")
    
    # 1. テスト用のIPv4パケットを生成します(宛先をGoogleのDNS: 8.8.8.8 に設定)
    # Scapyはデフォルトで標準的なIPヘッダー(20バイト)を作成します
    packet = IP(dst="8.8.8.8")
    
    # 2. 生成されたパケットから、VersionとIHLの生データを抽出します
    # versionフィールドの取得
    version = packet.version  
    
    # ihlフィールドの取得(4バイト単位の数値が入っています)
    ihl_raw = packet.ihl      
    
    # 3. 実際のヘッダー長を計算します(IHLの値に4をかける!)
    actual_header_length = ihl_raw * 4
    
    # 4. 解析結果を分かりやすく画面に出力します
    print(f"[-] パケットの宛先: {packet.dst}")
    print(f"[-] Versionフィールドの値 : {version} (IPv4であることを示しています)")
    print(f"[-] IHLフィールドの生の値  : {ihl_raw} (32ビット単位での長さ)")
    print(f"[-] 計算されたヘッダー長   : {actual_header_length} バイト")
    
    # 補足:標準的なヘッダー長は20バイトなので、IHLは「5」になりますね!
    if actual_header_length == 20:
        print("\n[判定] オプションなしの標準的なIPv4ヘッダー(20バイト)です。")
    else:
        print(f"\n[判定] オプションが含まれるため、ヘッダー長が {actual_header_length} バイトに拡張されています。")

if __name__ == "__main__":
    analyze_ip_header()

スクリプトの実行結果(イメージ)

このコードを実行すると、コンソールには以下のような温かみのある解析結果が表示されます。

=== IPv4パケットの生成とヘッダー解析 ===
[-] パケットの宛先: 8.8.8.8
[-] Versionフィールドの値 : 4 (IPv4であることを示しています)
[-] IHLフィールドの生の値  : 5 (32ビット単位での長さ)
[-] 計算されたヘッダー長   : 20 バイト

[判定] オプションなしの標準的なIPv4ヘッダー(20バイト)です。

コードのコメントにもある通り、IHL の値が 5 で、実際のヘッダー長が 20 バイト(5 × 4)になっていることが、はっきりと確認できますね!

—

6. まとめ:パケットの「はじめの一歩」をマスターしたあなたへ

最後にもう一度、今回の重要なポイントをおさらいしておきましょう。

  • Version(4ビット):IPv4なのかIPv6なのかを、ルーターが最初に見分けるための識別子。IPv4なら必ず 4。
  • IHL(4ビット):ヘッダー(宛名)がどこまで続くかを示す値。
  • 4倍の魔法:4ビット(最大15)で表すため、「値 × 4 = 実際のバイト数」として計算する。
  • ヘッダーの限界:最小は20バイト(IHL=5)、最大は60バイト(IHL=15)。

普段、ブラウザの向こう側で何気なくやり取りされているデータ。そのすべてのパケットの先頭で、この Version と IHL が「私はIPv4の、これくらいの長さの封筒ですよ!」と健気に主張し続けているのです。

ネットワークの世界は、こうした一見複雑に見えるルールの積み重ねでできていますが、背景にある「なぜそうなっているのか?」というストーリーを紐解けば、とても人間らしくて面白い仕組みであることが見えてきます。

これからも、パケットたちの静かなおしゃべりに耳を傾けながら、一歩ずつネットワークの楽しさを深めていきましょう!応援しています!

コメント

タイトルとURLをコピーしました