Firezone выпустила sanstun — реализацию WireGuard на Rust, где шифрование можно вынести в отдельные потоки

Sanstun: A sans-IO, parallel-friendly WireGuard implementation in Rust

Firezone представила sanstun — sans-IO реализацию стейт-машины WireGuard на Rust. После двух лет правок форка boringtun (более 70 PR) команда спроектировала API заново: без внутренней буферизации, с явной обработкой таймеров и разделением учёта и криптографии. Вызов begin_encapsulate лишь резервирует счётчик пакетов, а само шифрование выполняет PendingEncapsulate, который можно передать в другой поток. По бенчмаркам на пакете 1280 байт накладные расходы составляют всего 2%.

Если перенести само шифрование в другой поток, это намекает на потенциальное ускорение более чем в 45 раз!
  1. Twey

    Всё шло отлично, пока я не прочитал:

    > Дизайн также избегает таких проблем, как раскраска функций, и хорошо сочетается с правилами владения в Rust.

    Async — это не I/O. Его можно использовать для I/O, но это просто способ написания чистых, детерминированных конечных автоматов, который сохраняет логический поток вместе, а не разбрасывает его по куче переходов.

    Даже если вы решите вручную скомпилировать ваши async-потоки в явные конечные автоматы, вам всё равно придётся иметь дело с «раскраской функций» (она же типизация): поток, который пересекает несколько переходов состояний (и, возможно, другие несвязные части состояния обновляются тем временем через другие переходы), теперь должен быть переписан как (серия) переходов состояний и не может быть вызван из блокирующей функции. Если уж на то пошло, переписывание всех ваших конечных автоматов без `async` делает «проблему» раскраски функций ещё хуже, потому что много-переходные потоки становятся ещё более непохожими на обычные функции.

  2. monocasa

    Отлично, в основном именно так я и проектирую свои реализации протоколов на Rust.

    Гораздо более тестируемо, основную часть можно разделить между async и блокирующим I/O, гораздо проще полностью запретить unsafe в ваших зависимостях (кроме std и core) и т.д.

  3. temp0826

    Mullvad также ответвили свою собственную реализацию от boringtun (называется gotatun[0])

    [0] https://github.com/mullvad/gotatun

Ещё за этот день

2026-10-30