Как определить, где заканчивается один пакет, а где начинается другой? - PullRequest
0 голосов
/ 22 июня 2011

При отправке пакетов по сети, как можно определить, где заканчивается один пакет и где начинается другой?

Является ли отправка / получение подтверждения одним из способов сделать это?

Ответы [ 3 ]

2 голосов
/ 22 июня 2011

TCP - это потоковый протокол. Таким образом, он предоставляет поток или пакет или интерфейс на основе сообщений для приложения. При использовании TCP приложение должно реализовать собственный метод определения пакетов или сообщений. Например, (a) все сообщения имеют фиксированный размер, или (b) каждому сообщению предшествует его последующий размер, или (c) существует специальная последовательность «конец записи» в потоке данных, чтобы указать сообщение граница. Ищите в Google много информации о том, как можно реализовать границы сообщений в TCP.

1 голос
/ 22 июня 2011

Я предполагаю, что вы имеете в виду «пакеты» уровня приложения.

Если вы используете UDP, вам это не нужно, поскольку это протокол сообщений. TCP - это протокол потоковой передачи байтов, поэтому он не может отправлять пакеты, только байты. Если вам нужно отправить что-нибудь более сложное, чем байтовый поток через TCP, вы должны добавить еще один протокол поверх - HTTP является одним из таких протоколов. Текст довольно прост, поскольку строки имеют завершающие символы, обычно CR / LF / CRLF. Для отправки нетекстовых сообщений потребуется другой протокол.

Один из подходов, который часто используется с TCP, - это подключение, потоковая передача протокольного устройства, отключение. Это работает хорошо, но медленно из-за огромной задержки непрерывного открытия и закрытия TCP-соединений. HTTP обычно работает так, чтобы обслуживать веб-страницы большому количеству пользователей, которые, если они оставлены постоянно подключенными во время просмотра страниц, без необходимости будут использовать все серверные сокеты.

Ожидание ACK уровня приложения от однорангового узла иногда необходимо, если абсолютно необходимо, чтобы получение однорангового узла было известно до отправки следующего сообщения, но, опять же, это происходит медленно из-за задержки соединения. TCP не был разработан с учетом этого подхода.

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

Какой «пакет» вы отправляете?

Rgds, Martin

0 голосов
/ 22 июня 2011

С сокетами TCP вы просто видите поток данных, где вы можете получать и отправлять байты.У вас нет возможности узнать, где заканчивается пакет и начинается другой.

Это особенность (и проблема) TCP.Большинство людей просто считывают данные в буфер, пока не будет замечен перевод строки (\ n) .Затем обработайте данные и дождитесь следующей строки.Если передаются фрагменты двоичных данных, сначала можно сообщить получателю, сколько байтов данных поступило.

Если границы пакетов важны, вы можете использовать UDP, но тогда порядок пакетов может измениться, или некоторые пакеты могут бытьпотерян на пути без вашего ведома.

Более новый протокол SCTP ведет себя так же, как TCP (потерянные пакеты отправляются повторно, порядок пакетов сохраняется), но с помощью сокетов SCTP вы можете отправлять пакеты, так что получатель получает точно такой же пакет.

...