
【CCNA_4】Ethernetヘッダーの1501〜1535は何?|Length/Typeフィールドの謎
Ethernetフレームについて勉強していると、
Length/Typeフィールド
という2バイトのフィールドが出てきました。
ここには値によって、
* データの長さ
* 上位プロトコルの種類
のどちらかが入ります。
説明を見ると、
1500以下ならLength
1536以上ならType
と書かれています。
ここで、ひとつ気になりました。
1501〜1535はどこに行ったの?
今回は、この微妙に空いている35個分の値について調べてみました。
まずEthernetの構造を確認
Ethernetでデータを送るときは、大まかに、
Preamble
↓
SFD
↓
宛先MACアドレス
↓
送信元MACアドレス
↓
Length/Type
↓
データ
↓
FCS
という順番で情報が送信されます。
今回のテーマはLength/Typeフィールドですが、その前に出てくる、
Preamble(プリアンブル)
と
SFD(Start Frame Delimiter)
についても整理しておきます。
Preambleとは?
Preambleは7バイトあります。
Ethernetでは、いきなりフレーム本体を送り始めるのではなく、その前に一定のビットパターンを送ります。
これによって受信側は、
「これからEthernetのデータが来る」
と認識し、送信側とのタイミングを合わせます。
かなりざっくり言えば、
通信を受け取る準備をするための部分
です。
SFDとは?
Preambleの直後には、
SFD(Start Frame Delimiter)
という1バイトのフィールドがあります。
名前の通り、
「ここからフレームが始まる」
ことを示すためのものです。
つまり、
Preambleでタイミングを合わせる
↓
SFDでフレーム開始を知らせる
↓
Ethernetフレーム本体が始まる
という流れになります。
PreambleとSFDはEthernetフレームのサイズに含む?
ここが少しややこしいところです。
EthernetではPreambleとSFDも実際に送信されますが、
通常、Ethernet MACフレームのサイズを数えるときにはPreambleとSFDは含めません。
Ethernet MACフレーム本体は、
宛先MACアドレスからFCSまで
と考えます。
そのため、一般的なタグなしEthernetフレームの最大サイズは、
* 宛先MACアドレス:6バイト
* 送信元MACアドレス:6バイト
* Length/Type:2バイト
* データ:最大1500バイト
* FCS:4バイト
で、
1518バイト
になります。
Preamble 7バイトとSFD 1バイトを足して、
「Ethernetフレームは1526バイト」
と考えるわけではありません。
ここは混同しないようにしたいところです。

今回見るのはLength/Typeフィールド
Ethernet MACフレームの中にある、
Length/Typeフィールド
は**2バイト(16ビット)**です。
名前に「Length/Type」と両方書かれている通り、
値によって、
Lengthとして使う場合
と
Typeとして使う場合
があります。
ここが今回の本題です。
1500以下ならLength
Lengthとして使う場合、この値は、
後ろに続くMACクライアントデータの長さ
を表します。
IEEE 802.3では、
1500(0x05DC)以下
の場合にLengthとして解釈されます。
たとえば値が1000なら、
「この後ろのデータ部分は1000バイト」
という意味になります。
では、なぜ最大が1500なのでしょうか。
これは通常のEthernetで、
MACクライアントデータの最大長が1500バイト
だからです。
つまりLengthとして必要になる値は、
1500まであれば足りる
ということになります。
1536以上ならType
一方、
1536(0x0600)以上
の場合はLengthではなく、
EtherType
として解釈されます。
EtherTypeは、
Ethernetフレームの中に、どのプロトコルがカプセル化されているのか
を表す値です。
代表的なものでは、
* IPv4:0x0800
* ARP:0x0806
* IPv6:0x86DD
などがあります。
つまり受信した機器はLength/Typeフィールドを見て、
0x0800ならIPv4
というように、中身をどのプロトコルとして処理すればいいのか判断できます。
じゃあ1501〜1535は?
ここが今回気になったところです。
1500以下がLength。
1536以上がType。
ということは、
1501〜1535は?
そもそもはいることのない値なの?
結論から言うと、
LengthとしてもEtherTypeとしても使わない範囲
です。
1501〜1535という数字そのものが存在しないわけではありません。
Length/Typeフィールドは2バイトなので、その値をビット列として入れること自体はできます。
ただし、
標準的なLength/Typeフィールドとして意味が定義されていない
ということです。

整理すると、
0〜1500
→ Length
1501〜1535
→ LengthにもEtherTypeにも使わない範囲
1536〜65535
→ EtherType
となります。
なんでわざわざ間を空けるの?
ここでさらに気になったのが、
1500の次を1501からEtherTypeにすればよかったのでは?
ということ。
この背景には、Ethernetのフレーム形式の違いがあります。
Ethernetでは、同じ位置にある2バイトのフィールドが、
ある形式ではType
別の形式ではLength
として使われてきました。
そのため、受信側はその値を見て、
Lengthとして読むのか
Typeとして読むのか
を判断する必要があります。
そこで、
1500以下ならLength
1536以上ならType
というように、それぞれの値の範囲を分けています。
その間に、
どちらにも属さない範囲
が存在します。
つまり1501〜1535は、
LengthとEtherTypeを区別できるようにした結果として存在する中間領域です。
1536は16進数だと0x0600
もうひとつ気になったのが、
なぜ1536という中途半端な数字なのか
ということ。
10進数では1536ですが、
16進数では、
0x0600
になります。
EtherTypeとして扱う範囲は、
0x0600以上
です。
ネットワークでは16進数を使う場面が多いので、
1536という数字だけを見るより、
0x0600からEtherTypeの領域が始まる
と覚える方が分かりやすそうです。
Ethernet IIとIEEE 802.3
Length/Typeフィールドが少し分かりにくい理由のひとつが、
Ethernet II
と
IEEE 802.3
です。
Ethernet IIでは、この位置にあるフィールドを、
Type
として使用します。
一方、IEEE 802.3ではもともと、
Length
として使われました。
現在はこの2バイトを、
Length/Typeフィールド
として扱い、
その値によってどちらの意味なのかを判断します。
つまり、
1500以下ならLength
1536以上ならType
と値を見ることで、受信側が解釈できます。
1501〜1535の値が来たらどうなる?
では実際に、
Length/Typeフィールドに
1501〜1535
の値が入ったフレームが届いたらどうなるのでしょうか。
この範囲には、
Lengthとしての意味も、
EtherTypeとしての意味も標準的には定義されていません。
そのため、
正常なEthernet通信でこの範囲を使うことは想定されていません。
実装によって処理が異なる可能性があるため、
「1505なら必ずこう処理される」
という共通の意味はありません。
CCNAの勉強としては、
1501〜1535は未使用・未定義の範囲
と理解しておけばよさそうです。
1500バイトと1518バイトを混同しない
今回調べていて、もうひとつ整理しておきたいと思ったのが、
1500
と
1518
という数字です。
1500バイトは、
Ethernetフレーム全体の最大サイズではありません。
基本的には、
MACクライアントデータ部分の最大サイズ
です。
それに、
* 宛先MACアドレス
* 送信元MACアドレス
* Length/Type
* FCS
を加えると、
一般的なタグなしEthernet MACフレームの最大サイズは、
1518バイト
になります。
さらにその前には、
Preamble 7バイト
と
SFD 1バイト
も送信されています。
ただし、これらは通常1518バイトのMACフレームサイズには含みません。
数字だけ覚えるのではなく、
どの部分のサイズを表している数字なのか
を見る必要がありそうです。
今回のまとめ
今回の疑問だった、
「1500以下がLength、1536以上がTypeなら、1501〜1535は?」
の答えは、
LengthにもEtherTypeにも使われない範囲
でした。
整理すると、
0〜1500
→ Lengthとして解釈
1501〜1535
→ Length/Typeのどちらにも使わない範囲
1536(0x0600)以上
→ EtherTypeとして解釈
となります。
そしてEthernet全体を見ると、
Preamble 7バイト
→ 受信側がタイミングを合わせる
SFD 1バイト
→ フレームの開始を示す
Ethernet MACフレーム
→ 宛先MACからFCSまで
という構造になっています。
最初は、
「1501〜1535だけ説明から抜けているけど、単に省略されている?」
と思いました。
でも実際には、
Lengthとして使う領域とEtherTypeとして使う領域の間に、どちらにも使われない範囲がある
ということでした。
こういう、
「ルールは分かったけど、その間はどうなってるの?」
という疑問をひとつずつ潰していくと、暗記だけだった内容が少しずつ仕組みとして見えてくる気がします。
※この記事は初学者が学習の中で調べながらまとめた内容になります。
先輩エンジニアの皆さま、間違いや誤解があるなという箇所や追加の補足情報などありましたらご指摘いただけますと大変ありがたいです🙇♂️
関連記事
・前回「【CCNA_3】ステートフルとステートレスは何が違う?|通信の「状態を見る」とは」
・次回「【CCNA_5】Auto MDI/MDI-X、両方Autoならどっちが切り替わる?|「自動」の仕組み」