1. ホーム
  2. text

[解決済み] バイナリプロトコル vs テキストプロトコル

2022-10-05 20:46:57

質問

バイナリ プロトコルとは何か、テキスト プロトコルとは何か、電線に送信されるビットの点で、これらは互いにどのように比較されるのでしょうか?

バイナリプロトコルについてwikipediaに書いてあることは以下の通りです。

バイナリプロトコルとは、人間ではなく機械に読ませることを意図・期待したプロトコルである ( http://en.wikipedia.org/wiki/Binary_protocol )

おいおい

もっと明確に言うと、もし私がjpgファイルを持っていたら、バイナリプロトコルを通してどのように送られ、テキストプロトコルを通してどのように送られるのでしょうか? もちろん、ワイヤー上に送られるビット/バイトの点で、です。

言い換えれば、最初のデータ (jpg ファイル) が送信される前にどのようにエンコードされるかにかかっているのです。

どのように解決するのですか?

バイナリプロトコルとテキストプロトコルの違いは、バイナリブロブがどのようにエンコードされるかについてではありません。違いは、プロトコルがデータ構造を中心としたものか、テキスト文字列を中心としたものかということです。例を挙げましょう。例えば、HTTPです。HTTP はテキスト プロトコルですが、JPEG 画像を送信するときは、テキスト エンコードではなく生のバイトを送信するだけです。

しかし、HTTPがテキストプロトコルである理由は、以下のようなやり取りがあることです。 を取得することです。 を実行すると、このようになります。

リクエストしてください。

GET /files/image.jpg HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.01 [en] (Win95; I)
Host: hal.etc.com.au
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8

レスポンスです。

HTTP/1.1 200 OK
Date: Mon, 19 Jan 1998 03:52:51 GMT
Server: Apache/1.2.4
Last-Modified: Wed, 08 Oct 1997 04:15:24 GMT
ETag: "61a85-17c3-343b08dc"
Content-Length: 60830
Accept-Ranges: bytes
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: image/jpeg

<binary data goes here>

これは非常に簡単に、(C言語で)次のような構造にまとめることができたことに注意してください。

リクエスト。

struct request {
  int requestType;
  int protocolVersion;
  char path[1024];
  char user_agent[1024];
  char host[1024];
  long int accept_bitmask;
  long int language_bitmask;
  long int charset_bitmask;
};

レスポンスです。

struct response {
  int responseType;
  int protocolVersion;
  time_t date;
  char host[1024];
  time_t modification_date;
  char etag[1024];
  size_t content_length;
  int keepalive_timeout;
  int keepalive_max;
  int connection_type;
  char content_type[1024];
  char data[];
};

フィールド名を全く伝送する必要がないようなところで、例えば responseType が3文字 '2' '0' '0' ではなく、値 200 の int である場合です。これがテキスト ベースのプロトコルです。これは、さまざまな種類の構造化データとしてではなく、(通常は人間が読める) テキスト行のフラット ストリームとして通信するように設計されたものです。