У меня есть программа, которая должна измерять общие потери после маршрутизации через машину.
По сути, я генерирую трафик UDP с iperf
на машине A, предназначенной для машины C. Однако я сначала направлю этот трафик через машину B **, а затем отправлю его на машину C через необработанный сокет на порт 5001 (порт по умолчанию, который iperf
слушает) с sendto()
, Пока работает tcpdump
показывает, что пакеты принимаются на машине C, iperf
Сервер не видит эти соединения или пакет.
Я охотился по всему iperf
Исходный код немного, чтобы увидеть, как это работает, и я вижу, что пакеты принимаются с функцией
rc = recvfrom( mSettings->mSock, mBuf, mSettings->mBufLen, 0,
(struct sockaddr*) &server->peer, &server->size_peer );.
В основном, потому что это просто recvfrom
, Я не понимаю, почему есть проблема, если я уверен, что я не изменяю пакеты в любое время, и отправляю их с функцией sendto(s, buf, len, 0, (struct sockaddr*) &si_other, slen)
и socket(AF_INET, SOCK_RAW, IPPROTO_UDP)
,
У кого-нибудь есть идеи? Почему нет iperf
замечая эту связь?
** Я фактически направляю пакеты на устройство TUN на машине A, затем читаю их из программы пространства пользователя на A, отправляю их в B с помощью UDP-сокета, читаю их в программе пространства пользователя на B, затем отправляю их через необработанный сокет с IP_HDRINCL
отключен. Я распечатываю заголовки, полученные на машинах А и В, и не вижу ничего странного.
Интересно. Оказалось, что проблема была решена путем назначения устройства TUN на машине A eth0
IP-адрес. Ранее я назначал устройству TUN его собственный IP-адрес (я пытался удалить IP-адрес с устройства TUN, но затем по умолчанию eth1
, Это тоже не сработало.)
Я предполагаю, что некоторые изменения происходили из-за этого, или что какое-то туннелирование / соединение не было установлено iperf
потому что пакеты не были отправлены из eth0
до.
Если у кого-то есть дальнейшее понимание того, как / почему это работает, мне было бы очень интересно.