sendto занимает много времени - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь связаться клиент-сервер без полезной нагрузки tcp.Я просто использую заголовок tcp в качестве поля полезной нагрузки, которое по умолчанию составляет 20 байт.Я только что понял, что использование процессора очень велико для передачи больших файлов. Я попытался установить таймер для каждой части кода.(Я использовал для этого rdtsc.) В результате я собираю все пакеты за 1000 тиков (я не касаюсь контрольной суммы ipv4, так как ядро ​​вычисляет ее автоматически);затем я посмотрел время отправки, это занимает 100000 ~ тик (в 100 раз больше, чем для сборки пакета).Есть ли более быстрый способ отправки необработанного TCP-пакета без sendto или способ сделать sendto более быстрым?

Я измеряю время отправки следующим образом:

timefirst = rdtsc()
sendto()
timesecond = rdtsc()
print timesecond - timefirst

Я создаю свой сокет отправки с помощью:

int mysocket = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);
int one = 1;
const int *val = &one;
setsockopt(mysocket, IPPROTO_IP, IP_HDRINCL, val, sizeof(one));

Примечание: я говорю о времени пакета только на моей стороне (программа отправителя и ядро).Речь идет не о том, как медленно он проходит по проводам, ISP и маршрутизаторам.

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Что ж, для отправки IP-пакета в другое место необходимо направить его и получить MAC-адрес целевого пункта назначения, что может включать (не всегда) ARP-передачу в оба конца для получения MAC-адреса маршрутизатора / пункта назначения хост для создания заголовка Ethernet.

Вы не включили величину задержки (хорошо, что вы сделали, но вы не указали длительность тика) или вывод трафика по проводам, видимый в проводе, чтобы иметь возможность определить эти моменты времени ... Как вы определить адрес назначения, также есть поиск DNS для получения IP-адреса? Для получения IP-адреса хоста назначения следует использовать еще одну обратную передачу по сети (в первый раз).

В другой плоскости, что вы на самом деле измеряете? время, необходимое для выполнения sendto(2)? сколько времени занимает пакет, чтобы быть видимым на проводе? время, необходимое для достижения цели? Если да, синхронизируются ли исходная и целевая машины? как они синхронизируются в этом случае?

Почему бы вам на самом деле не показать свой код как Как создать пример минимальной, полной и проверяемой страницы ?

0 голосов
/ 27 мая 2019

Сталкивались ли вы с алгоритмом Нейгла: https://en.wikipedia.org/wiki/Nagle%27s_algorithm?

Если это так, вы можете попробовать установить параметр сокета TCP_NODELAY, который может указывать на отправку данных медленнее, чем вы ожидаете.

...