Автор интернет-сканера Masscan утверждает, что его программа способна максимально использовать ресурсы Ethernet. За счет собственного сетевого драйвера, собственного TCP-стека и работы в обход ядра операционной системы она действительно способна приблизиться к физическим ограничениям стандарта Ethernet.
Разработчик сканера Masscan Роберт Грэм опубликовал результаты, которые демонстрируют реальную производительность его программы.
Для сканера важно количество отправленных пакетов в секунду. Стандарт Ethernet требует, чтобы между пакетами был 12-байтовый период «тишины», так и определяется окончание одного пакета и начало следующего. В конце каждого пакета также нужно передавать CRC-код (4 байта) для проверки целостности передачи, а в начале пакета — обязательную преамбулу из 8 байт. Есть и еще одно ограничение — минимальный размер пакета 60 байт, это древнее ограничение из 80-х годов, которое не имеет смысла в настоящее время, но сохраняется ради совместимости.
Если учесть все ограничения, то пакеты должны быть минимум по 84 байта. Таким образом, для сети 1 Гбит/с мы получаем теоретическое ограничение 1 000 000 000/84*8 = 1 488 095 пакетов в секунду.
На современной 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 байт. В этом случае по гигабитному каналу удастся передать 1 865 671 пакет в секунду, что увеличивает демонстрируемую в тестах скорость с 476 Мбит/с до 597 Мбит/с. Правда, тут возможны неприятные последствия: маршрутизатор на пути ваших пакетов может отбрасывать некоторые из них, что снизит реальную эффективную скорость передачи данных.
Есть и другие проблемы. По неизвестным причинам Linux не способен преодолеть рубеж 1,488 млн пакетов в секунду на гигабитном Ethernet’е. На той же системе, но при подключении канала 10 Гбит/с Linux едва преодолевает рубеж 2 млн пакетов в секунду. На практике реальная скорость в Linux-системе составляет примерно 1,3 млн пакетов в секунду на гигабитном канале. Опять же, Роберт Грэм не имеет понятия, почему это так.