はじめに
Webアプリケーションにおいて、$_GET
や $_POST
に格納されるリクエストデータは、すべて文字列になる。
たとえば、HTMLの form から送られてきた数値入力も、サーバー側では "123"
という文字列として受け取られる。
ここでこんな疑問が湧いた。
「文字列以外のデータで、通信できないの?」
この問いを起点に、通信の本質や「テキスト形式」と「バイナリ形式」の違いを理解した。
テキスト形式とバイナリ形式のプロトコル
普段使う Web ブラウザは、HTTPというテキストベースのプロトコルを使って通信を行っている。
そのため、送信されるリクエストデータは、すべて文字列として扱われる。
一方、Webの世界には「バイナリ形式のプロトコル」も存在する。たとえば gRPC、MessagePack、Protocol Buffers などがそれに該当する。
では、ここで一度立ち止まり、通信の大前提を確認したい。
そもそも通信って、全部バイナリじゃない?
そう、インターネットを流れるすべてのデータは、最終的には0と1のビット列(バイナリ)に変換されて通信される。
たとえば文字列 "123"
は、UTF-8 などの文字コードに従って、次のようなバイト列になる。
0x31 0x32 0x33 // "1", "2", "3"
テキスト形式のバイナリ化
たとえば以下のようなJSONデータを考えてみる。
{
"id": 1,
"name": "Taro"
}
これをテキスト形式で送る場合:
-
{
,"
などの記号もすべて UTF-8 でバイナリに変換 -
"1"
は数値ではなく、文字'1'
(= 0x31)として扱われる -
"name"
や"Taro"
など、キーと値の文字列もすべて含まれる
このように、構造そのもの(キー名や記号)まで文字列として送られるため、全体として冗長になってしまう。私達人間にとって理解しやすいというメリットがあるが。
バイナリ形式は何が違うのか?
一方で、バイナリ形式のプロトコルでは:
- 構造は特定の数値に変換されるよう予め定義
- 文字列だけは UTF-8 でバイナリに変換
つまり、「構造」を表現するのにバイナリを節約できる。
たとえば "name": "Taro"
は、次のようなバイナリ列になる。
12 04 54 61 72 6F
結論
読みやすさを犠牲にすれば、データ量を小さくし、通信の効率を高めることができる。
おわりに
「リクエストデータはすべて文字列になる」という既知の知識から、通信の本質がすべてバイナリであること、そしてテキスト形式とバイナリ形式の違いを理解した。
あたりまえに問いを立てることが新しい知識を得る機会になる。