Firezone, 2년간 boringtun 패치 끝내고 Rust WireGuard 구현 sanstun 공개
Sanstun: A sans-IO, parallel-friendly WireGuard implementation in Rust
Firezone이 userspace WireGuard 상태 머신을 Rust로 새로 구현한 sanstun을 공개했다. 2년 넘게 Cloudflare의 boringtun을 포크해 70개 이상의 PR로 고치던 끝에, 시간 처리까지 sans-IO로 분리하고 내부 버퍼링을 없앤 더 깔끔한 API를 갖췄다. 암호화와 카운터 관리를 분리해 PendingEncapsulate를 다른 스레드로 넘길 수 있게 했고, 벤치마크상 최대 45배까지 병렬화 이득을 기대할 수 있다. Apache 2.0으로 crates.io에 배포됐다.
1280바이트 패킷에서 새 패킷 암호화의 부기 작업은 단 2%에 불과하다. 실제 암호화를 다른 스레드로 옮긴다면 45배 이상의 잠재적 속도 향상을 시사한다.
HN 토론
17- Twey
모든 게 잘 흘러가고 있었는데, 다음 문장을 읽고 나서 상황이 달라졌다.
> 이 설계는 함수 컬러링(function coloring) 같은 문제도 피하고 Rust의 소유권 규칙과도 잘 맞는다.
async는 I/O가 아니다. I/O에 쓸 수는 있지만, 그 본질은 순수하고 결정론적인 상태 머신을 작성하는 방식으로, 논리적 흐름을 여러 전이(transition)에 흩어놓지 않고 한데 묶어 유지해 준다.
async 흐름을 명시적인 상태 머신으로 직접 컴파일하기로 선택하더라도, 여전히 '함수 컬러링'(일명 타이핑) 문제를 다뤄야 한다. 여러 상태 전이를 가로지르는 흐름(그리고 그 사이에 다른 전이를 통해 상태의 다른 분리된 부분들이 갱신될 수도 있는 흐름)은 이제 (일련의) 상태 전이로 다시 작성해야 하며, 블로킹 함수에서는 호출할 수 없다. 오히려 async 없이 모든 상태 머신을 다시 작성하는 것은 함수 컬러링 '문제'를 더 악화시킨다. 왜냐하면 다중 전이 흐름은 일반 함수와 더더욱 다르기 때문이다.
- monocasa
좋네, 이건 기본적으로 내가 Rust로 프로토콜 구현을 설계하는 방식이랑 똑같다.
훨씬 테스트하기 쉽고, 대부분을 async와 블로킹 I/O 사이에서 공유할 수 있으며, 의존성에서 unsafe를 완전히 금지하기도(std와 core는 예외) 훨씬 쉽다.
- temp0826
Mullvad도 boringtun을 기반으로 자체 구현을 분리해 냈다(이름은 gotatun[0]).