Время передачи с розеткой - PullRequest
0 голосов
/ 25 мая 2020

На самом деле я работаю над встроенной системой и отправляю изображение через сокет. Я использую linux для обеих сторон (клиента и сервера).

Пропускная способность Ethe rnet составляет 1000 Мбит / с. Я пытаюсь вычислить время для отправки одного изображения. Это 32-битное изображение (с плавающей точкой) с размером: 6004 *7920* 1004 *. Я ожидаю, что время передачи:

(6004 *7920* 4 * 8) / (1000000000) = 1,52 с

Из моего кода на этот раз 2,1 с . Я не понимаю этой разницы. Неужели время для протокола ..?

Обратите внимание, что я уже увеличил размер jumbo-кадра до 9000. Спасибо за вашу помощь!

1 Ответ

2 голосов
/ 25 мая 2020

Следует иметь в виду, что скорость передачи 1000 Мбит / сек c - это теоретический максимум, а не скорость, которую вы часто получаете на практике. Измеренная скорость, вероятно, будет несколько ниже .

Вот некоторые причины, по которым измеренная скорость может быть ниже теоретической (в произвольном порядке):

  1. Накладные расходы из-за заголовков пакетов TCP и Ethe rnet заголовков кадров
  2. Отброшенных пакетов (которые вызывают кратковременную остановку потока TCP, чтобы можно было повторно отправить отброшенные пакеты)
  3. Ограничения пропускной способности ЦП или памяти на отправляющем или принимающем оборудовании
  4. TCP медленный старт Функция, которая снижает скорость передачи в начале сеанса
  5. Другая сеть трафик c, конкурирующий за ту же полосу пропускания
  6. Неоптимальные реализации кода отправки или получения (например, возможно, принимающая программа тратит время на запись полученных данных на диск, задерживая свой следующий вызов на recv(), позволяя ей TCP-приемный буфер для переполнения)
  7. Сниженная скорость передачи из-за предельного Ethe rnet -кабеля или чрезмерной длины кабеля

В качестве примечания: если вы хотите уменьшить время, необходимое для передачи изображения, вы можете изучить возможность сжатия данных перед их отправкой (например, путем преобразования в .jpg на отправляющей стороне). Если вы можете значительно уменьшить объем отправляемых данных, вы соответственно можете сократить время передачи. (вы можете еще больше ускорить процесс, выполнив сжатие в отдельном потоке на стороне сервера, чтобы сжатие изображения # (N + 1) могло происходить параллельно с передачей изображения #N)

...