От чего зависит количество TCP-пакетов в boost :: asio?

Я отправляю TCP-пакеты через asio::tcp::socket,

Моя проблема в том, что, хотя каждый раз, когда я посылаю данные о 800 байт и максимальный размер пакета 1500 байт данные отправляются более чем в 5 пакетах.

(Я проверяю количество пакетов и данных в программном обеспечении sniffsmart)

это почему?!

как мне решить или отследить это?

2

Решение

РЕДАКТИРОВАТЬ : Количество пакетов в потоковом протоколе, таком как TCP, зависит от конфигурации вашей сети. Однако этот ответ оптимизирует использование сокетов, так что программа не добавляет никаких издержек в смысле количества передаваемых пакетов.

Если вы пытаетесь получить большие пакеты, вы должны попытаться поместить все данные в сокет сразу. Вы, вероятно, делите его на несколько пакетов самостоятельно. Потому что Нэйгла Алгоритм TCP, стек TCP будет отправлять доступные данные на одноранговый узел немедленно. Таким образом, если вы поместите данные в сокет несколько раз, остальные данные перейдут к следующему пакету.

Или вы можете отключить алгоритм Nagle следующим образом:

m_socket.set_option(tcp::no_delay(true));
4

Другие решения

TCP это поток. Вы не можете контролировать, какие определенные пакеты будут содержать. Вы можете включить / выключить алгоритм Nagle, это может повлиять на скорость передачи, но вы не можете сами контролировать размер пакетов. Более того, эти пакеты могут быть разделены / объединены любым маршрутизатором в пути. Таким образом, его поток по своей природе, и вы не можете изменить это.

1

TCP является своего рода потоком данных. send () только помещает данные в буфер отправки, реализация стека TCP системы решает, как поместить данные в сеть. Вот почему пакеты, которые вы видели через sniff, не соответствуют вашим вызовам send (). Если вы действительно хотите, чтобы посылочный пакет соответствовал send (), я помню, что есть опция TCP. Вы можете проверить это, я не могу вспомнить точно сейчас.

0
По вопросам рекламы [email protected]