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

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」であればローカルアドレスを意味しています。

レンタルサーバーとVPS(Virtual Private Server)の違い

ブログを始めるにあたりレンタルサーバーを借りようと思ったのだけど、レンタルサーバーとVPS(Virtual Private Server)の違いが初めよくわからなかったので、他の方の参考になればと思い書いておこうと思います。

まず提供される機能(インフラ、OS、アプリケーションなど)の面から分類すると、レンタルサーバーはPaaS(Platform as a Service)、VPSはIaaS(Infrastructure as a Service)に該当します。

IaaSはインフラ(CPU、メモリ、ストレージ、ネットワーク等)のみの提供でOSやミドルウェア、アプリケーションはユーザー自身でインストールと設定を行う必要があります。ただOSのインストールについては管理画面から好みのOSを選択して自動でインストールしてくれるところが多いです。

PaaSはインフラ部分、および、OSとミドルウェア(Webサーバ、データベース等)まで提供されます。ブログサービスを行うCMS(Content Management System)はユーザーがインストール、設定を行います。代表的なCMSとして、WordPress、concrete5、Joomra! などがあります。CMSのインストールは管理画面で操作して自動でインストールしてくれるところがほとんどです。

SaaS(Software as a Service)はインフラからブログサービスまですべて提供されます。ユーザーは提供されたブログサービスを使うだけです。代表的なブログサービスとして、「Amebaブログ」とか「はてなブログ」などがあります。

僕の場合はCMSにWordPressを使い好きなテーマを選びたかったのと、自由にアフィリエイトをやりたかったためSaaS型のブログサービスは検討から外していました。SaaS型のブログサービスは手軽で一番簡単に始められるのですが、いろいろと制約があるからです。ただ情報発信をメインに考えている方であればSaaS型のブログサービスは良いかと思います。

リソースの面でレンタルサーバーとVPSを比べると、レンタルサーバーでは他の利用者とネットワークの帯域、メモリ、CPUなどを共有します。1台のサーバに自分のユーザーを作成してもらい、みんなでそのサーバーを使うのです。そのため、そのサーバーの利用者の誰かが人気ブロガーでそのサイトにアクセスが集中してサーバーに負荷をかけるようなことがあったら、自分のサイトも重くなってしまうかもしれません。その点、VPSの場合は自分専用のリソースを割り当てられます。だいたい契約するときに「CPUは2コア、メモリ1Gのプラン」等、どのスペックで契約するかを選びます。そのためVPSであれば契約したときのスペックは保証されます。

ここらへんの話はレンタルサーバーの提供会社のサイトの説明にあるのですが、僕が一番知りたかったのは「root権限があるのか?」でした。結論を言うと、レンタルサーバーではroot権限はなく通常のユーザー権限のみですが、VPSではroot権限がもらえます。ではVPSのほうがよいのか?というとそうではなくて、VPSを契約した場合はOSの自動インストールのサポートはあるものの、それ以降(それ以外)は全て自分でやらなくてはならないということです。WordPressを使う場合だと、WEBサーバ(Apache)、データベース(MySQL)、PHPのインストールも自分でやる必要があります。それ以外にもセキュリティの設定(iptablesとか)などもそうです。なので、もしWordPressでブログを始めようとするならレンタルサーバーの方をお勧めします。

僕はブログとは別にC言語で作られたプログラムもそのサーバーで動かしたかったのですが、それにはコンパイルをサーバー上で行う必要があり、コンパイラ(gcc)をインストールする必要がありました。始めからgccがサーバに入っていればいいですが、悪意あるプログラムをサーバ上で動かされては困るだろうからサービス提供会社としてはC言語プログラムの実行は許可していなかったです。そうなると、root権限があればあとは好き勝手にできるので「root権限がもらえるサーバーはどこか?」で探して、VPSのことを知った感じです。

具体的に、さくらインターネット株式会社が提供する「さくらのレンタルサーバー」と「さくらVPS」とで比較します。

レンタルサーバーだと、WEBサーバ、メールサーバ、FTPサーバ、シェル(SSH)ログイン、データベース、PHP、Perl 等、必要と思われるものはだいたい提供されます。管理画面から「インストール」ボタンを押すだけです。

これがVPSになると、選べるOSの説明があるだけで他の資料はないです。上級者向けです(初心者では無理だと思う)。なので、ブログをVPSで始めるのはよほどの理由がない限りやめたほうが良いかと思います。

最後に、僕が使ってみた(もしくは使ってみたい)レンタルサーバー/VPSの提供元のバナーを載せておきます。参考にしてみてください。

レンタルサーバーの提供元

[エックスサーバー株式会社]
エックスサーバーはレンタルサーバーを借りようとしたときの第一候補だったのですが、1ヶ月の値段で以下のさくらインターネットにしました。もし支払えるならエックスサーバーにしていたと思います。

[さくらインターネット株式会社]
エックスサーバーかさくらかで迷いましたがこちらにしました。今のところ、使ってみて特に問題はないです。

VPSの提供元

[さくらインターネット株式会社]
サーバー構築から自分で行う必要がありますが、さくらのホームページのサポート情報が充実していたので問題なかったです。

[GMOクラウド株式会社]

GMOクラウドが推しているPleskは使っていません。特に問題はないですが、ホームページのサポート情報はさくらのほうが見やすい感じがします。

さくらインターネットとGMOクラウドを使ってみてサーバー性能は特に不満はないです。サポートにはメールや電話はしたことがないのでオペレーターの親切度はわからないのですが、ホームページの情報でなんとかなりました。