Сокет: измерение скорости передачи данных (в байтах / секунду) между двумя приложениями - PullRequest
3 голосов
/ 18 марта 2012

У меня есть приложение, которое продолжает передавать данные во второе приложение (потребительское приложение) с использованием сокета TCP.Как можно рассчитать общее время, необходимое с момента отправки данных первым приложением до получения данных вторым приложением?Оба приложения написаны на языке C / C ++.Мой текущий подход заключается в следующем (в псевдокоде):

struct packet{
   long sent_time;  
   char* data;  
}

ПЕРВОЕ ПРИЛОЖЕНИЕ (ИЗМЕНИТЕЛЬ):

packet p = new packet();
p.data = initialize data (either from file or hard coded)
p.sent_time = get current time (using gettimeofday function)

//send the packet struct (containing sent time and packet data)
send (sockfd, p, ...); 

ВТОРОЕ ПРИЛОЖЕНИЕ (ПОТРЕБИТЕЛЬ)

packet p = new packet();
nbytes = recv (sockfd, p, .....); // get the packet struct (which contains the sent time and data)
receive_time = get current time
data transfer time = receive time - p.senttime (assume I have converted this to second)
data transfer rate = nbytes / data transfer time; // in bytes per second

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

Ответы [ 2 ]

0 голосов
/ 18 марта 2012

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

например. Сравните время пинга с вашего мобильного телефона на HTTP-сервер с максимальной скоростью загрузки - время пинга будет десятки мс, размер пакета будет около. 1,5 КБайт, что приведет к гораздо более низкой максимальной пропускной способности, чем наблюдаемый при загрузке.

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

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

struct packet{
   long sent_time;  
   long reflect_time;  
   char* data;  
}

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

Редактировать: Я имел в виду: время отражения будет "другими" часами, поэтому при запуске теста вперед-назад вы сможете отфильтровать смещение.

0 голосов
/ 18 марта 2012

Если ваш протокол это позволяет, вы можете отправить обратно подтверждение от сервера для полученного пакета.Это также необходимо, если вы хотите быть уверены, что сервер получил / обработал данные.

Если у вас есть это, вы можете просто рассчитать скорость на клиенте.Просто вычтите RTT из длины интервала send + ACK, и вы получите довольно точное измерение.

В качестве альтернативы вы можете использовать инструмент синхронизации времени, например NTP, для синхронизации часов на двух серверах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...