Форум программистов, компьютерный форум, киберфорум
Python: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052

Как отключить склеивание TCP пакетов?

10.06.2019, 19:05. Показов 5720. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При отправке данных в большом количестве, например по 40 и 576 байт в случайном порядке, то на стороне сервера при считывании (клиент.recv(4096)) выясняется, что пакеты склеены. Когда ожидается 40 байт, приходит 656 (40 + 40 + 576).
сервер.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) не помогает избежать проблемы.
Если что, то OS Ubuntu 18.04, но вряд ли это как-то влияет на работу сокетов.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.06.2019, 19:05
Ответы с готовыми решениями:

Склеивание пакетов в TCP
Вот думаю как бы лучше их разделять? Можно например к сообщению прикреплять заголовок, в котором хранится длинна самого сообщение, читаем...

Как сделать фильтрацию в iptables по состоянию tcp-пакетов?
Фильтрация трафика брандмауэром iptables с учетом состояния TCP-пакетов. Что надо сделать

Как правильно отключить TCP соединение чтобы сервер не спамил пустыми сообщениями
Всем добра. Помогите с задачей. Всё пытаюсь сделать чат на Unity Есть сервер, он работает. Подключает и отключает клиентов. ...

8
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.06.2019, 19:09
Цитата Сообщение от anapshy Посмотреть сообщение
Когда ожидается 40 байт
Фиговые ожидания из-за пробелов в знаниях.
Нормально ожидать сегментации и буферизации.

На прикладном/программном уровне Вы должны сами надстроить свой протокол над TCP который будет позволять различать Ваши сообщения (не пакеты!!!).

Самый банальный пример первыми байтами слать размер текущего сообщения, а за ним данные(c этим размером).
Более сложный пример слать "заголовок" потом данные.
1
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
10.06.2019, 19:31  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Нормально ожидать сегментации и буферизации.
Буферизация происходит на стороне клиента?
Дело в том, что нужно произвести имитацию работы компьютерной сети. Программа будет тестировать нагрузку компьютерной сети. Представим, что каждый отдельный пакет это данные отправленные с разных хостов.
Была идея сделать задержку после отправки TCP пакета на десяток доли миллисекунд, но может как-то этого можно избежать? Дело в том, что идет замер времени, и возможно данная задержка после отправки пакета может негативно повлиять на конечный результат.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
10.06.2019, 19:53
Лучший ответ Сообщение было отмечено anapshy как решение

Решение

Цитата Сообщение от anapshy Посмотреть сообщение
после отправки TCP пакета
Нет в TCP как таковых пакетов. Выше вам верно написали. TCP рассматривает данные с верхнего уровня как неструктурированный поток байт и просто нарезает его на сегменты размера не превышавшего MSS (MSS = MTU — размер заголовка IP — размер заголовка TCP), чтобы сегмент поместился в пакеты протокола более нижнего уровня - IP.
Таким образом отправив по TCP некий структурированный с вашей точки зрения набор данных вы получаете на приемнике all inclusive :-). Как вы будете разбирать\парсить полученный чанк данных - решать вам. Варианты вам предложили.
Самое простое - высылать размер чанка и потом считывать ровно столько сколько указано.
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
11.06.2019, 08:06
Цитата Сообщение от anapshy Посмотреть сообщение
Программа будет тестировать нагрузку компьютерной сети.
Если нужно отсылать пакеты по сети, возьмите scapy. Очевидно, что работает из под рута.
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
17.06.2019, 07:27
Лучший ответ Сообщение было отмечено anapshy как решение

Решение

Цитата Сообщение от anapshy Посмотреть сообщение
TCP_NODELAY
Отключение алгоритма Нагла в любом случае не даст той функциональности, которая вам необходима. Как вариант - поиграь со значениями SO_RCVBUF/SO_SNDBUF, но лучше для озвученных целей использовать UDP.

Цитата Сообщение от Avazart Посмотреть сообщение
Нормально ожидать сегментации и буферизации.
telnet с вами бы не согласился бы.

Добавлено через 28 минут
anapshy, кстати, обратите внимение так же на флаг TCP_QUICKACK
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.06.2019, 13:41
Цитата Сообщение от Вованя Посмотреть сообщение
telnet с вами бы не согласился бы.
А Вы работали через telnet программно?

Добавлено через 1 минуту
Цитата Сообщение от Вованя Посмотреть сообщение
но лучше для озвученных целей использовать UDP.
Так не озвучено нифига. Зачем советовать UDP.
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
17.06.2019, 17:33
Цитата Сообщение от Avazart Посмотреть сообщение
Так не озвучено нифига. Зачем советовать UDP.
Цитата Сообщение от anapshy Посмотреть сообщение
Дело в том, что нужно произвести имитацию работы компьютерной сети. Программа будет тестировать нагрузку компьютерной сети. Представим, что каждый отдельный пакет это данные отправленные с разных хостов.
Была идея сделать задержку после отправки TCP пакета на десяток доли миллисекунд, но может как-то этого можно избежать? Дело в том, что идет замер времени, и возможно данная задержка после отправки пакета может негативно повлиять на конечный результат.
Цитата Сообщение от Avazart Посмотреть сообщение
А Вы работали через telnet программно?
Давайте отложим этот разговор.
0
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
20.06.2019, 12:09  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Цитата Сообщение от Вованя Посмотреть сообщение
но лучше для озвученных целей использовать UDP.
Так не озвучено нифига. Зачем советовать UDP.
Имитация работы интернет трафика IMIX (Internet MIX). При измерении производительности оборудования с использованием IMIX пакетов предполагается, что производительность напоминает то, что можно увидеть в реальных условиях.
Задается передаваемый объем в байтах. От объема находится процентное соотношение пакетов по 40, 576, 1500 байтов (с учетом IP заголовка). Задается процентное соотношение TCP & UDP пакетов. Выбирается порядок следования пакетов по их размеру: по возрастанию, по убыванию, в случайном порядке. Отправляются пакеты на клиент. После клиент вычисляет объем пришедших данных, скорость передачи, средние значения, медианные по чему только можно и нельзя, время... . После провести тесты на корпоративной сетке с разными параметрами запуска и посмотреть как себя поведет сеть. Ещё есть EMIX примерно тоже самое, но размер передаваемых пакетов фиксированный + так же меняется соотношение TCP & UDP. Так же можно ICMP сюда приплести.

Отключение алгоритма Нейгла у меня не работает. Делал тесты на других ОС и на Ubuntu18.04 - всё четко.
Проблему разрешил тем, что не производятся замеры времени между пришедшими пакетами, а высчитывается общий объем пришедших данных на 1-м тесте. Провести несколько тестов показалось целесообразнее, чем 1 тест с замерами времени между пришедшими пакетами, т.к. эта информация оказалась не такой важной. Конец.

Добавлено через 2 минуты
Программка собой представляет типо iperf, только с более гибкой настройкой.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.06.2019, 12:09
Помогаю со студенческими работами здесь

Объединение пакетов TCP
Привет, помогите склеить несколько пакетов TCP в один общий. Наверняка кто-то уже решал эту задачку. Размер сообщения на входе не...

Инкапсуляция пакетов TCP/IP
Всем привет есть такой вопрос. Надо было написать протокол для программыки типа клиет-сервер. Фишка в том что я пищу только часть...

Прошивка TCP/IP пакетов
Необходимо добавить в пакеты TCP/IP 3 однобитовых метки, кто-нибудь знает, как это организовать? Заранее благодарна:)

Расшифровка TCP пакетов
В общем, имеется ссылка на какую-то страницу какого-то сайта. Чтоб получить нормальный ответ, нужно открыть ссылку с их же...

Модификация TCP/IP пакетов
Доброго времени суток Необходимо перепрошить пакеты TCP/IP. Где посмотреть информацию для написания подобной программы под Windows? Мне...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru