ネットワークバイトオーダーとは?

ネットワークバイトオーダーとは、ネットワーク上で数値データを送受信するときに使われる標準的なバイトの並び順です。一般的にはBig Endianの並びを指します。

PCやサーバー内部ではLittle EndianのCPUが使われることが多いため、通信データを扱うときには、内部の数値表現とネットワーク上のバイト列を分けて考える必要があります。

この記事の要点

通信データのバイト順を確認したい方へ

Big EndianとLittle Endianの表示を切り替えて、値の違いを確認できます。

エンディアン変換ツールを使う

ネットワークバイトオーダーの基本

複数バイトの数値を通信で送るとき、送信側と受信側でバイトの並び順が違うと、同じデータでも別の数値として解釈される可能性があります。

たとえば、16進数の値0x12345678を4バイトで送る場合を考えます。

バイト順の違い

Big Endian:12 34 56 78
Little Endian:78 56 34 12

送信側がLittle Endianで送り、受信側がBig Endianとして読むと、値が変わってしまいます。このような混乱を避けるため、通信では決まったバイト順を使う必要があります。

ネットワークバイトオーダーはBig Endian

多くの通信プロトコルでは、ネットワークバイトオーダーとしてBig Endianが使われます。Big Endianでは、上位バイトから順番に並びます。人間が16進数の値を書くときの見た目に近いため、通信データや仕様書でも確認しやすい形式です。

0x1234 → 12 34
0x12345678 → 12 34 56 78

ネットワーク上のバイト列を見るときは、まずBig Endianで読まれている可能性を考えます。ただし独自プロトコルでは別の指定がある場合もあるため、最終的には仕様を確認します。

CPU内部のエンディアンとは別に考える

現在の一般的なPCやサーバーでは、Little Endianの環境がよく使われます。そのため、プログラム内部ではLittle Endianで数値がメモリに保存されていても、ネットワークへ送るときにはBig Endianの順番に変換することがあります。

たとえば、内部メモリ上で78 56 34 12に見える値は、Little Endianの4バイト値として読むと0x12345678です。この値をネットワークバイトオーダーで送る場合は、12 34 56 78に変換されます。

なぜ統一されたバイト順が必要なのか

通信では、送信側と受信側が同じCPUや同じOSとは限りません。異なる環境同士でも正しくデータを解釈できるようにするため、プロトコル側でバイト順を決めておく必要があります。

通信データでは、1つの数値の解釈ミスが全体の解析ミスにつながることがあります。

通信ログを見るときの確認ポイント

通信ログやパケットデータを見るときは、次の点を確認します。

確認項目内容
プロトコル仕様バイトオーダーが指定されているか
数値のサイズ2バイト、4バイト、8バイトのどれか
表示形式ログがバイト列なのか、数値化された表示なのか
変換済みかどうかすでにツール側で変換されていないか
文字列か数値か文字コードのHEXと混同していないか

Wiresharkなどの解析ツールでは、元のバイト列だけでなく、ツールが解釈した数値も表示されることがあります。表示がどちらなのかを確認することが大切です。

ポート番号の例

ネットワークバイトオーダーを理解しやすい例として、ポート番号があります。HTTPでよく使われるポート番号80を16進数で表すと0x0050です。

ポート80のバイト列

ネットワークバイトオーダー:00 50
Little Endianとして読んだ場合:0x5000、10進数では20480

このように、2バイトの値でもバイト順を間違えるとまったく違う数値になります。

ファイル形式との違い

ネットワークバイトオーダーは通信でよく使われる考え方ですが、すべてのバイナリデータがBig Endianというわけではありません。ファイル形式では、仕様によってBig Endian、Little Endian、またはその両方が使われることがあります。

あるファイル形式ではヘッダー内でエンディアンを示し、その後の数値をどちらで読むか決める場合があります。別の形式では、最初からLittle Endian固定の場合もあります。バイナリファイルを解析するときは、ネットワークバイトオーダーだけで判断せず、必ずファイル仕様を確認します。

プログラムで扱うときの注意点

プログラムで通信データを扱う場合、内部の整数値と送信するバイト列を分けて考える必要があります。プログラム上では整数として4660を持っていても、通信データとして送るときには12 34のようなバイト列に変換する場合があります。

反対に、通信で受け取った12 34を、内部で扱いやすい整数値に変換する処理も必要です。注意したいのは、すでに変換済みのデータをさらに変換してしまうケースです。二重に変換すると、正しい値が逆に壊れてしまうことがあります。

ツールで確認する方法

エンディアン変換ツールを使うと、Big EndianとLittle Endianでバイト列がどのように変わるかを確認できます。次のような値で試すと違いが分かりやすくなります。

通信データを確認する場合は、まずネットワークバイトオーダー、つまりBig Endianとして読んだ場合の値を確認します。そのうえで、CPU内部やファイル内部のLittle Endian表現と比較すると、どこで変換が必要か見えやすくなります。

よくある質問

ネットワークバイトオーダーはBig Endianですか?

一般的に、ネットワークバイトオーダーはBig Endianを指します。複数バイトの数値を上位バイトから順番に送る形式です。

なぜ通信ではBig Endianが使われるのですか?

異なる環境同士で数値を正しく解釈するためです。通信プロトコルでバイト順を統一しておくことで、CPUやOSの違いによる解釈ミスを防ぎやすくなります。

Little EndianのPCでもネットワークではBig Endianを使いますか?

使うことがあります。PC内部ではLittle Endianでも、通信データとして送るときにはネットワークバイトオーダーに変換する場合があります。

通信ログの16進数が逆に見えるのはなぜですか?

内部メモリ上のLittle Endian表現と、ネットワーク上のBig Endian表現を混同している可能性があります。ログが元のバイト列なのか、解析済みの数値なのかを確認してください。

すべてのファイルや通信データがBig Endianですか?

いいえ。ネットワークバイトオーダーではBig Endianがよく使われますが、ファイル形式や独自プロトコルではLittle Endianが使われることもあります。必ず仕様を確認する必要があります。