TCP обеспечивает непрерывный поток данных. TCP реализован с использованием пакетов, но весь смысл TCP в том, чтобы скрыть их.
Думайте об этом, как будто это стена, на которой вы хотите рисовать. Стена сделана из кирпича. Кирпичи склеиваются вместе с раствором, и наносится штукатурка, чтобы поверхность стены стала гладкой. Кирпичи - это IP-пакеты, TCP - штукатурка.
Итак, теперь у вас есть гладкий оштукатуренный TCP-туннель, и вы хотите добавить в него некоторую структуру. Вы хотите нарисовать прямоугольники, чтобы ваши рисунки были отделены друг от друга. Это то, что вы хотите сделать: добавить немного «административной» структуры (рамки вокруг чертежей) к вашим данным.
Во многих протоколах используется концепция packet
, представляющая собой набор данных, начинающийся с административного заголовка фиксированного формата. Заголовок содержит достаточно информации, чтобы решить, где заканчивается пакет; например, он включает в себя длину пакета. HTTP делает это с заголовком Content-Length
или (с HTTP / 1.1) с помощью "кодированной передачи", где данные разбиваются на один или несколько мини-пакетов, каждый из которых имеет простой заголовок, состоящий ровно из мини-пакета. указание длины.
Другим способом является специальная последовательность-терминатор, которая не может отображаться в «обычных данных». Если ваши данные являются текстовыми, то вы можете использовать байт нулевого значения в качестве терминатора.
Еще один способ - использовать самоданные данные. Это данные, структурированные таким образом, что в любой момент вы можете узнать, достигнут ли конец элемента. Например, данные XML организованы в виде вложенных пар маркеров, таких как <foo>...</foo>
. Когда достигнут маркер конца (</foo>
), вы знаете, что элемент завершен.