Подтвердить что ты не робот

Бинарные и текстовые протоколы

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Вы можете прочитать дополнительную информацию по этому вопросу здесь:
http://www.faqs.org/docs/artu/ch05s01.html

Ответ 3

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

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

string helloWorld = "Hello World!";

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

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

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

Ответ 4

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

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

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

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

Ответ 5

Если вы используете ASN.1 и BER для отправки "привет" в сообщении протокола, например:

ProtocolMessage ::= String
;

то 1 байт берет для кодирования своего идентификатора octer, 1 байт принимает для кодирования длины, а кодировка UTF-8 "hello" - еще 5 байтов. Таким образом, сообщение результата равно 7 байтам.

Ответ 6

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

Протокол является частью сообщения о состоянии "Привет, я могу подключиться? У меня есть некоторые данные, где я должен его поставить?", у вас есть ответ для меня: "Спасибо, спасибо!"

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

Если бы у вас был стандарт кодирования, я бы сказал, что вы могли бы составить последовательность символов меньше, чем 4 байта, необходимые для слова "PUSH"

Ответ 7

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

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

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

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