Яка максимальна швидкість Ethernet
Xakep #241. Злом ігор
Автор інтернет-сканера Masscan стверджує, що його програма здатна максимально використати ресурси Ethernet. За рахунок власного мережного драйвера, власного TCP-стеку та роботи в обхід ядра операційної системи вона дійсно здатна наблизитися до фізичних обмежень стандарту Ethernet.
Для сканера важлива кількість відправлених пакетів за секунду. Стандарт Ethernet вимагає, щоб між пакетами був 12-байтовий період тиші, так і визначається закінчення одного пакета і початок наступного. Наприкінці кожного пакета також потрібно передавати CRC-код (4 байти) для перевірки цілісності передачі, а на початку пакета обов'язкову преамбулу з 8 байт. Є ще одне обмеження — мінімальний розмір пакету 60 байт, це давнє обмеження з 80-х, яке немає сенсу нині, але зберігається заради сумісності.
Якщо врахувати всі обмеження, то пакети мають бути мінімум по 84 байти. Таким чином, для мережі 1 Гбіт/с ми отримуємо теоретичне обмеження 1000000000/84*8 = 1488095 пакетів в секунду.
На сучасній 10-гігабітній мережі це число можна збільшити вдесятеро: 14 880 952 пакети на секунду.
При скані портів нам не потрібно використовувати всі 60 байт, достатньо 20 байт для IP-заголовка та 20 байт для TCP-заголовка, всього 40 байт. Тобто ефективна швидкість передачі пакетів становить 1488095 х 40 = 476 Мбіт/с. Іншими словами, навіть якщо ми на 100% використовуємо фізичний ресурс Ethernet, провайдер або програма виміру трафіку на гігабітному каналі покаже швидкість передачі даних 476 Мбіт/с. Така нестиковка зрозуміла, тому що при нормальному серфінгу пакети в 40 байт не використовуються, там пакети зазвичай по 500 байт, так що зверху зі службових даних можна ігнорувати.
Насправді, сканер може ігнорувати деякі стандарти Ethernet, наприклад, зменшити паузу між пакетами з 12 до 5 байт, а преамбулу — з 8 до 4 байт. Мінімальний розмір пакета можна зменшити з 84 до 67 байт. У цьому випадку по гігабітному каналу вдасться передати 1865671 пакет в секунду, що збільшує демонструється в тестах швидкість з 476 Мбіт/с до 597 Мбіт/с. Щоправда, тут можливі неприємні наслідки: маршрутизатор по дорозі ваших пакетів може відкидати деякі з них, що знизить реальну ефективну швидкість передачі.
Є інші проблеми. З невідомих причин Linux не здатний подолати рубіж 1,488 млн. пакетів в секунду на гігабітному Ethernet'і. На тій же системі, але при підключенні каналу 10 Гбіт/с Linux ледве долає рубіж 2 млн. пакетів в секунду. Насправді реальна швидкість в Linux-системі становить приблизно 1,3 млн пакетів на секунду на гігабітному каналі. Знову ж таки, Роберт Грем не має поняття, чому це так.