Разработчик утилиты сетевой диагностики NetDiag+ реализовал функции ping, traceroute и Path MTU для Android на языке Kotlin без использования root-прав и NDK. Решение опирается на возможность открытия непривилегированных ICMP-сокетов, доступную в Linux начиная с версии 3.0 через настройку net.ipv4.ping_group_range.
Для работы пинга используется метод Os.socket с параметрами AF_INET и IPPROTO_ICMP. В отличие от iOS, где требуется ручная фильтрация ответов, ядро Android самостоятельно фильтрует пакеты по идентификатору. Для управления таймаутами применяется setsockoptTimeval, что требует наличия API 29 и выше.
Функционал traceroute реализован через отправку запросов с увеличивающимся TTL и чтение ошибок ICMP Time Exceeded с помощью recvmsg и MSG_ERRQUEUE. Поскольку некоторые константы, такие как IP_RECVERR, отсутствуют в Android OsConstants, используются их прямые значения из Linux. Приложение включает проверку наличия классов для совместимости с разными версиями API.
Определение Path MTU выполняется методом двоичного поиска в диапазоне от 552 до 1500 байт. Установка флага IP_PMTUDISC_DO заставляет ядро добавлять бит запрета фрагментации (DF) к пакетам. Если размер пакета превышает MTU пути, метод sendto возвращает ошибку EMSGSIZE, что позволяет вычислить максимально допустимый размер пакета без фрагментации.






