двоичные против текстовых протоколов - PullRequest
20 голосов
/ 02 марта 2010

Мне интересно, в чем разница между двоичными и текстовыми протоколами. Я читал, что двоичные протоколы более компактны / быстрее обрабатываются. Как это работает? Так как вы должны отправить одинаковое количество данных? Нет

Например, как строка "привет" будет различаться по размеру в двоичном формате?

Ответы [ 6 ]

20 голосов
/ 02 марта 2010

Если все, что вы делаете, это передача текста, тогда да, разница между ними не очень значительна. Но попробуйте передать такие вещи, как:

  • Числа - вы используете строковое представление числа или двоичное? Специально для больших чисел двоичный файл будет более компактным.
  • Структуры данных - Как вы обозначаете начало и конец поля в текстовом протоколе? Иногда двоичный протокол с полями фиксированной длины является более компактным.
11 голосов
/ 02 марта 2010

Текстовые протоколы лучше с точки зрения читабельности, простоты переопределения и простоты отладки. Двоичные протоколы более компактны.

Однако вы можете сжать текст, используя библиотеку, такую ​​как LZO или Zlib, и это почти так же компактно, как двоичный файл (с очень небольшим ударом по производительности для сжатия / распаковки.)

Подробнее о теме можно прочитать здесь:
http://www.faqs.org/docs/artu/ch05s01.html

3 голосов
/ 02 марта 2010

Сама строка "привет" не будет отличаться по размеру. Разница между размером и производительностью заключается в дополнительной информации, которую вводит Сериализация (Сериализация - это то, как программа представляет данные, подлежащие передаче, чтобы их можно было восстановить, как только они попадут на другой конец канала).

Например, при сериализации следующего в .NET с использованием XML (один из методов сериализации текста):

string helloWorld = "Hello World!";

Вы можете получить что-то вроде (я знаю, это не точно):

<helloWorld type="String">Hello World!</helloWorld>

Принимая во внимание, что двоичная сериализация могла бы представлять эти данные изначально в двоичном виде без всей дополнительной разметки.

2 голосов
/ 02 марта 2010

двоичные протоколы лучше, если вы используете управляющие биты / байты

т.е. вместо отправки сообщения: Hello в двоичном виде это может быть 0x01, за которым следует ваше сообщение (при условии, что 0x01 - это управляющий байт, который обозначает msg)

Итак, поскольку в текстовом протоколе вы отправляете msg: hello \ 0 ... это занимает 10 байтов где, как в двоичном протоколе, это будет 0x01Hello \ 0 ... это включает 7 байтов

И еще один пример. Предположим, вы хотите отправить число, скажем 255, в тексте его 3 байта. где в двоичном виде его 1 байт, т.е. 0xFF

0 голосов
/ 02 марта 2010

Вы должны четко понимать, что является частью протокола и что является частью данных. Текстовые протоколы могут отправлять двоичные данные, а двоичные протоколы могут отправлять текстовые данные.

Протокол является частью сообщения, в котором говорится: «Привет, я могу подключиться? У меня есть некоторые данные, куда я должен их поместить?» У вас есть ответ для меня? 1003 *

Каждый бит преобразования (вероятно) намного меньше в двоичном протоколе, например, возьмем HTTP (который основан на тексте):

если бы у вас был стандарт кодирования, держу пари, вы могли бы придумать последовательность символов, меньшую, чем 4 байта, необходимые для слова «PUSH»

0 голосов
/ 02 марта 2010

Я бы не сказал, что двоичные форматы обрабатываются быстрее. Если вы посмотрите на CSV или текстовый формат с фиксированной длиной поля - он все равно может быть быстро обработан.

Я бы сказал, все зависит от того, кто является потребителем. Если человек находится в конце (например, для HTTP или RSS), то нет необходимости каким-либо образом сжимать данные, за исключением, может быть, сжатия их.

Двоичные протоколы нуждаются в синтаксических анализаторах / преобразователях, которые трудно расширять и сохранять обратную совместимость. Чем выше вы идете в стеке протоколов, тем больше ориентированных на человека протоколов (TCP является двоичным, поскольку пакеты должны обрабатываться маршрутизаторами на высокой скорости, но XML более удобен для человека).

Я думаю, что изменения размера не имеют большого значения сегодня. Для вашего примера hello будет принимать ту же сумму в двоичном формате, что и в текстовом формате, потому что текстовый формат также является «двоичным» для компьютера - важен только способ, которым мы интерпретируем данные.

...