Всем привет! В заголовке весьма популярная задачка по Информатике, которая, к сожалению, не так уж и проста. Сейчас объясню.
Пуст мы имеем следующее условие:
Вася принимает файл размером 2 мегабайта по каналу 56 Кбит/с. За какое время Вася получит файл?
Школьники тут же кинулись вычислять 2 * 1024 Кб = 2048 Кбайт * 8 = 16384 Кбит / 56 Кбит/с = 292 секунды. И их возможно похвалят, где-нибудь на информатике в классе. Но мы-то знаем, что дело нечисто.
Я сейчас начну, всё станет понятно. Предположим, что Вася получает файл по самому простому протоколу UDP…. Догадались?
- Предположим, что у нас используется весьма стандартный MTU (Maximum Transfer Unit) = 1538 байт, то есть максимальный объём, который может быть передан по Ethernet в одну итерацию.
- Вычитаем преамбулу и разделитель в 20 байт.
- Отнимаем заголовок канального уровня в 14 байт. Сюда входят MAC-адреса источника и назначения, а так же тип протокола вышестоящего уровня.
- Отнимаем контрольную сумму в 4 байта.
- Отнимаем заголовок протокола IP в 20 байт. Здесь информация об IP адресах и т.д. (см. RFC)
- Отнимаем заголовок протокола UDP в 8 байт. Здесь порты, размер и контрольная сумма.
Итого, полезная нагрузка одного фрейма у нас 1538 – 20 – 14 – 4 – 20 – 8 = 1472 байта полезной нагрузки!
Прикинем, в какое количество фреймов у нас влезет файл (без учёта дополнительных издержек) только полезная нагрузка.
2,097,152 байт / 1472 = 1424 фрейма. Теперь рассмотрим, какой объём будут занимать эти фреймы при нашем MTU:
1424 * 1538 = 2,190,112 байт. Теперь передадим этот объём данных по указанному каналу связи. Простые вычисления привели меня к числу 305 секунд. А это на целых 13 секунд дольше, чем при примитивных расчётах.
Такая вот сетевая арифметика. Все замечания прошу обсудить в комментариях.
P.S. В литературе можно встретить различные значения MTU, но результирующее значение от этого исказится ненамного.
Опять же, всё зависит от протокола прикладного уровня. Если Вася скачивает файл каким-нибудь флешгетом, то передача идёт по протоколу TCP, а там своя полезная нагрузка + окно ещё.