バイナリプロトコルとテキストプロトコルは、実際にはバイナリブロブがどのようにエンコードされるかについてではありません。違いは、プロトコルがデータ構造を対象としているのか、テキスト文字列を対象としているのかということです。例を挙げましょう:HTTP。HTTPはテキストプロトコルですが、jpeg画像を送信する場合は、生のバイトを送信するだけであり、それらのテキストエンコーディングは送信しません。
しかし、HTTPをテキストプロトコルにしているのは、jpgを取得するための交換が次のようになっていることです。
リクエスト:
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
応答構造内のinが、3文字の「2」「0」「0」ではなく値200のintである場合。これがテキストベースのプロトコルです。多くの異なるタイプの構造化データとしてではなく、(通常は人間が読める)テキスト行のフラットストリームとして通信するように設計されたプロトコルです。