アプリケーションデータのネットワークへの送信順

C言語でint型の整数値「1144201745」をメモリ上に格納すると、メモリの低位アドレスから高位アドレスに向かって4バイト分の領域が確保されます。ちなみに10進数の「1144201745」は16進数で表すと「0x44332211」です。メモリへの格納を考えると10進数で話をするより16進数で話をするほうがわかりやすいので「0x44332211」で話を進めます。

確保された4バイト分の領域ですがビットになおすと32ビット分です。このデータ値を構成するビット列のうち最上位にあるビットをMSB(Most Significant Bit)、最下位にあるビットをLSB(Least Significant Bit)と言います。なにが最上位でなにが最下位か(どちらが上でどちらが下か)というと、「0x44332211」を2進数に直したときに左側の桁(31ビット目の方)が最上位で、右側の桁(0ビットの方)が最下位になります。

MSB、LSBのことをバイトでの意味合いということで、(Most Significant Byte)、(Least Significant Byte)と書くときもあるようですが、この場合の捉え方は、MSBは最上位ビットが属するバイト、LSBは最下位ビットが属するバイト、と考えるべきと思います。

MSB、LSBをバイト単位で捉えるときの説明としてよく4バイトの領域をバイト単位で分割して左側を上位のバイト(MSB)、右側を下位のバイト(LSB)とするような説明を目にするのですが、そもそも4バイトで1つのデータを意味しており、それをバイト単位で「分割」してしまったらもとのデータの意味あいと変わってしまいます。それを上とか下とか言うのには違和感があって、MSB、LSBをバイト単位で捉えるときは、最上位ビット、最下位ビットそれぞれが属するバイトと考えるほうが納得がいきます。(これはあくまでも個人的な見解です。)

データは「バイト単位」にメモリに書き込まれるのですが、CPUの特性により格納方式が異なります。低位のアドレスから高位のアドレスに向かって、MSBからメモリに格納する方式をビッグエンディアン(big-endian)、LSBからメモリに格納する方式をリトルエンディアン(little-endian)と呼んでいます。「0x44332211」の場合、ビッグエンディアン、リトルエンディアンそれぞれの格納方法は以下のようになります。

メモリ上にビッグエンディアンで格納しようがリトルエンディアンで格納しようが、int型整数は4バイト単位でのアクセスとなるため、特に問題にはなりません。ただプログラムの実装にもよりますが、int型整数をchar型にキャストしてアクセスする場合は並び順が異なるためシステム環境(CPU特性)に左右されます。Aという機種でうまく動いていたものが、Bという機種でリコンパイルして動かしてみたら想定と違う、となることもありえます。

ネットワークへの送信についても同じで、ビッグエンディアンとリトルエンディアンとでは送信順が変わります。送信する際はメモリの低位アドレスのバイトから送信していきますが、ビッグエンディアンとリトルエンディアンではバイト単位で見ると並び順が異なりますので、送る側と受け取る側で並び順を決めておく必要があります。ネットワークへの送信にはビッグエンディアンを使うことになっていて、ネットワークバイトオーダーと呼ばれています。C言語ではネットワークバイトオーダーにあわせるためにlong型用にhtonl()、short型用にhtons()関数が用意されています。

ちなみにですが、big-endian、little-endianというのは「ガリバー旅行記」に出てきたものをマイクロプロセッサの世界で使っているみたいですね。

ネットワークへの送信はバイト単位で行われるのですが、バイトを構成するビットで考えた場合、一番最初に送信されるビットは最下位ビット(LSB)からとなります。

複数バイトのデータを送信する場合、低位アドレスの1バイト分がまず送信されるのですが、そのLSBが一番先にネットワークに流れます。1バイト(8ビット)が送られると次のバイトがネットワークに流れていきます。

イーサネットのMACアドレスは6バイト(48ビット)で構成されていて、前半の24ビットはOUI(Organizationally Unique Identifier)と呼ばれる機器ベンダー固有のコート値、後半24ビットがベンダーが自由に割り当てできる製品番号となっています。このMACアドレスですが、先頭1バイト目のLSBはI/Gビット(Individual/Groupビット)と呼ばれていて、これが「0」であればユニキャスト通信、「1」であればブロードキャストもしくはマルチキャスト通信を意味します。ネットワーク機器はI/Gビットを一番先に読み込んで、宛先の判断をしています。

なお、I/Gビットの左隣のビットはU/Lビット(Universal/Localビット)と呼ばれていて、これが「0」であれば世界で一意のグローバルアドレス、「1」であればローカルアドレスを意味しています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です