Название: Как определить размер пакета HTTP? Отправлено: juvf от Октябрь 25, 2016, 11:35 Пишу реализацию websocked. Не могу понять - как определить размер http пакета.
для установления соединения по websocked клиент шлет http запрос на установление соединения. этот пакет выглядит примерно так Код: GET /chat HTTP/1.1 Сервер прослушивает tcp соединение. при получении данных сервер должен проанализировать полученные данные и обработать их. Пакет в сервер может прийти кусками. клиент может отправить 3 пакета. Допустим пакет на установление соединения 100 байт и два пакета по 50 байт. Сервер получит 10 байт, потом 20, потом ещё 170 байт. итого 200 байт (100 байт первого запроса, 50 байт второго и 50 байт третьего запроса/пакета от клиента). как серверу определить что первые 10 байт - это не полный пакет и надо ещё раз подождать.... следующие 20 байт - это тоже не полный пакет...... а потом ещё 170 байт - тут уже есть аж ТРИ пакета. нужно их все три обработать. Как делать определить размер пакета http? Название: Re: Как определить размер пакета HTTP? Отправлено: Пантер от Октябрь 25, 2016, 11:38 Анализируй полученные данные, у http запросов есть спецификация.
Название: Re: Как определить размер пакета HTTP? Отправлено: juvf от Октябрь 25, 2016, 11:44 ну вот я и хочу написать анализатор. какая спецификация? как из потока данных выделить целые http пакеты?
Название: Re: Как определить размер пакета HTTP? Отправлено: Пантер от Октябрь 25, 2016, 11:47 https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
Читать раздел Message Format. Название: Re: Как определить размер пакета HTTP? Отправлено: Bepec от Октябрь 25, 2016, 13:42 TCP протокол на себя берёт склейку/разбитие пакета. Т.е. если вы отправляете 100 байт, то на приемной стороне придет 100 байт.
Название: Re: Как определить размер пакета HTTP? Отправлено: juvf от Октябрь 25, 2016, 14:09 TCP протокол на себя берёт склейку/разбитие пакета. Т.е. если вы отправляете 100 байт, то на приемной стороне придет 100 байт. не берёт. я отправляю два запроса подряд по 10 байт. на приемной стороне получаю сразу пакет в 20 байт и приходится самому понимать, где там границы двух пакетов, все ли данные пришли. ps в тпс, в отличии от udp, вообще нет понятия "пакет". Там есть понятие поток. засунули с одной стороны 100 байт... с другой они могут прийти частями...... хоть 100 раз по 1 байту. смотрим Сравнение UDP и TCP (http://"https://ru.wikipedia.org/wiki/UDP") у тсп "Потоковость — данные читаются как поток байтов, не передается никаких особых обозначений для границ сообщения или сегментов." у юдп Датаграммы — пакеты посылаются по отдельности и проверяются на целостность только если они прибыли. Пакеты имеют определенные границы, которые соблюдаются после получения, то есть операция чтения на сокете-получателе выдаст сообщение таким, каким оно было изначально послано. у тсп такого нет. Название: Re: Как определить размер пакета HTTP? Отправлено: Bepec от Октябрь 25, 2016, 14:55 Не встречал таких проблем.
При посыле 10 байт мне приходит 10 байт. 20 - 20. 100-100. С другой стороны я не работал с большим количеством данных, от 150 и выше. PS у всех http пакетов в начале идет "команда" с указанием версии http. Вот по ним и режьте. Название: Re: Как определить размер пакета HTTP? Отправлено: juvf от Октябрь 25, 2016, 15:06 При посыле 10 байт мне приходит 10 байт. 20 - 20. 100-100. в 99.99% случаях так и будет работать. но послали 100 байт, на приемнике вызываете метод recv() у сокета тсп. Он вам вернет то кол-во байт, которое он получил по тсп на момент вызова recv(). Но ни кто не гарантирует что поток данных кончен и больше нет данных. Нужно самому проверять. Многие на эту проверку ложат, думая, что тсп за них это делает. Но в узких каналах с большими задержками и большими массивами данных могут возникнуть фрагментации. нужно быть к ним готовым.в хттп вроде как конец выделяется строкой "\r\n\r\n" |