Wasp & Turtlex
Привет, Черепаха, ты когда-нибудь задумывался, как сделать сетевой протокол настолько лёгким, что он почти не виден в трассировке? У меня есть несколько приёмов, которые позволяют минимизировать логирование, но мне бы пригодилось сообразительный взгляд программиста, чтобы довести это до ума. Как ты смотришь на связь с минимальными затратами и скрытно?
Звучит как интересная задачка. Держи заголовок минимальным, без волшебных чисел, просто один байт флагов и контрольная сумма – простая операция XOR. Используй UDP, чтобы избежать установки TCP-соединения, и сжатие полезной нагрузки минимальным LZ4 или даже собственным словарем, если сообщения предсказуемые. Забудь про подтверждения, просто веди лог на стороне отправителя с вращающимся счётчиком и проверяй на стороне получателя с помощью операции modulo. Так в трассе будет всего несколько байт и никакой очевидной регулировки потока. Скорее всего, у тебя получится протокол шириной всего в пару байт, но не забудь про потерю пакетов – можно добавить простой порядковый номер и тайм-аут, чтобы немного потерянных пакетов можно было пропустить. Пиши код модульный, тестируй с фильтрами Wireshark, настроенными на идентификатор твоего протокола, и увидишь, как трасса практически исчезнет.
Отличная настройка, но не перегружай контрольную сумму — XOR вполне подходит, только не добавляй еще один байт в заголовок. И помни, даже если трассировка станет короче, твои логи могут выйти из-под контроля, если не будешь аккуратна с этим счетчиком. Код должен быть лаконичным, и проверь его на реальном потоке трафика; хуже, чем проваленная миссия, – это потерянный пакет, который не зафиксирован. В целом, хорошая работа, только немного подкорректируй таймаут – нужно, чтобы ты не выглядела тормозом.
Конечно. Забудь про байт контрольной суммы, просто XOR-и данные в процессе передачи, а приемник пусть делает быструю проверку четности. Вращающийся счетчик можно встроить в поле флагов, всего три бита – поместится даже с однобайтовым заголовком. Я выставлю таймаут на половину RTT на линии с задержкой 10 миллисекунд, так будет быстрее. Проведу тест на передачу пакетов с нагрузкой в 10 килобайт в лаборатории и посмотрю, не теряются ли какие-нибудь пакеты. Надеюсь, не попадемся под сканер трафика.
Здорово, но вообще отказаться от контрольной суммы – это прямой путь к полному хаосу. Даже один бит может испортить всю сессию при передаче данных пакетами по 10 килобайт. Оставь XOR как проверку на здравый смысл, или хотя бы CRC в один байт, и протестируй это на канале с помехами. А тайм-аут половины RTT для соединения с задержкой 10 миллисекунд? Если сеть даст сбой, ты застрянешь во временной петле. Только потому, что ты видишь, как трассировка исчезает, не значит, что пакеты в безопасности. Держи всё под контролем, фиксируй всё, и останешься в поле зрения, а не вылетишь из него.
Ты права – убирать контрольную сумму было ошибкой. Оставлю 8-битный CRC, спрячу его в ту же байту с флагами, чтобы заголовок остался в один байт. По тайм-ауту сделаю гистерезис: начну с четверти наблюдаемого RTT, а потом ограничу его рамками от 5 до 20 миллисекунд, чтобы избежать проблем из-за джиттера. Буду записывать только изменения состояния, а не каждый пакет, чтобы логи не раздулись, но при этом можно было отладить упущенный кадр. Это должно сделать трассировку компактной, но при этом обезопасить канал.