0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ブラウザからのリクエストデータはなぜ文字列なのか?その疑問から通信の本質にたどり着いた。

Posted at

はじめに

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

結論

読みやすさを犠牲にすれば、データ量を小さくし、通信の効率を高めることができる。


おわりに

「リクエストデータはすべて文字列になる」という既知の知識から、通信の本質がすべてバイナリであること、そしてテキスト形式とバイナリ形式の違いを理解した。
あたりまえに問いを立てることが新しい知識を得る機会になる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?