Используя Tcp, почему большие блоки данных передаются с меньшей пропускной способностью, чем маленькие блоки данных? - PullRequest
4 голосов
/ 07 апреля 2011

Использование 2 ПК с Windows XP, размер окна Tcp 64 КБ, соединенный перекрестным кабелем
Используя Qt 4.5.3, QTcpServer и QTcpSocket

Отправка 2000 сообщений по 40 КБ занимает 2 секунды (40 МБ / с)
Отправка 1 сообщения размером 80 МБ занимает 80 секунд (1 МБ / с)

У кого-нибудь есть объяснение этому? Я ожидаю, что сообщение большего размера будет работать быстрее, поскольку нижние уровни могут более эффективно заполнять пакеты Tcp.

Ответы [ 3 ]

2 голосов
/ 07 апреля 2011

Трудно комментировать, не видя ваш код.

Как вы рассчитываете это на стороне отправителя?Когда вы знаете, что все готово?

Как клиент считывает данные, читает ли он в буферы фиксированного размера и выбрасывает данные, или он каким-то образом узнает (из кадров), что «сообщение»80 МБ и попытаться собрать «сообщение» в один буфер данных для передачи на прикладной уровень?

Вряд ли это будет базовый код сокетов Windows, который плохо работает.

Редактировать: Интересно, почему проголосовали против?Немного полезнее оставить комментарий, когда вы отказываетесь голосовать, чтобы сказать, почему, таким образом, все мы можем учиться.

1 голос
/ 20 апреля 2011

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

TCP, по IPсторона, это пакеты.Поскольку стандартный Ethernet имеет MTU (максимальная единица передачи) 1500 байтов, а TCP и IP имеют 20-байтовые заголовки, каждый пакет, передаваемый по Ethernet, будет передавать 1460 байтов (или меньше) потока TCP на другую сторону.Запись из приложения 40 КБ или 80 МБ здесь не будет иметь значения.

Сколько времени потребуется для передачи данных, будет зависеть от того, как и где вы их измеряете.Запись 40 КБ, скорее всего, вернется немедленно, так как этот объем данных просто будет сброшен в «окне отправки» TCP внутри ядра.Запись 80 МБ заблокирует ожидание передачи всего этого (ну, все, кроме последних 64 КБ, которые будут помещаться в ожидании в окне).

Скорость передачи TCP также зависит от получателя.У него есть «окно получения», которое содержит все, что получено от партнера, но не выбрано приложением.Объем пространства, доступного в этом окне, передается отправителю при каждом возврате ACK, поэтому, если принимающее приложение не освобождает его достаточно быстро, отправитель в конечном итоге приостанавливается.WireShark может дать некоторую информацию здесь.

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

Однако я не могу говорить о работе QT.

0 голосов
/ 21 декабря 2011

Ошибка в Qt 4.5.3

..................................

...