Материал просмотрен 169 раз(а)

Всем привет! В заголовке весьма популярная задачка по Информатике, которая, к сожалению, не так уж и проста. Сейчас объясню.

Пуст мы имеем следующее условие:

Вася принимает файл размером 2 мегабайта по каналу 56 Кбит/с. За какое время Вася получит файл?

Школьники тут же кинулись вычислять 2 * 1024 Кб = 2048 Кбайт * 8 =  16384 Кбит / 56 Кбит/с = 292 секунды. И их возможно похвалят, где-нибудь на информатике в классе. Но мы-то знаем, что дело нечисто.

Я сейчас начну, всё станет понятно. Предположим, что Вася получает файл по самому простому протоколу UDP…. Догадались?

  1. Предположим, что у нас используется весьма стандартный MTU (Maximum Transfer Unit) = 1538 байт, то есть максимальный объём, который может быть передан по Ethernet в одну итерацию.
  2. Вычитаем преамбулу и разделитель в 20 байт.
  3. Отнимаем заголовок канального уровня в 14 байт. Сюда входят MAC-адреса источника и назначения, а так же тип протокола вышестоящего уровня.
  4. Отнимаем контрольную сумму в 4 байта.
  5. Отнимаем заголовок протокола IP в 20 байт. Здесь информация об IP адресах и т.д. (см. RFC)
  6. Отнимаем заголовок протокола UDP в 8 байт. Здесь порты, размер и контрольная сумма.

Итого, полезная нагрузка одного фрейма у нас 1538 – 20 – 14 – 4 – 20 – 8 = 1472 байта полезной нагрузки!

Прикинем, в какое количество фреймов у нас влезет файл (без учёта дополнительных издержек) только полезная нагрузка.

2,097,152 байт  / 1472 = 1424 фрейма. Теперь рассмотрим, какой объём будут занимать эти фреймы при нашем MTU:

1424 * 1538 = 2,190,112 байт. Теперь передадим этот объём данных по указанному каналу связи. Простые вычисления привели меня к числу 305 секунд. А это на целых 13 секунд дольше, чем при примитивных расчётах.

700

Такая вот сетевая арифметика. Все замечания прошу обсудить в комментариях.

P.S. В литературе можно встретить различные значения MTU, но результирующее значение от этого исказится ненамного.