[О блоге] [наверх] [пред] [2024-04-11 22:17:05+03:00] [48584050c661df42c76a1026b3aebe16da078b52]
Темы: [crypto][go][multimedia]

Доработки VoRS

В прошлой записи упоминал об относительно простом VoIP клиент/сервере.
До четырёх утра не спал, но решил ещё красивее сделать: заменить TLS на
Noise. Кода конечно потребовало больше, ведь не готовый же протокол
используется, но зато в целом куда более простая система.

Выбрал Noise-NK шаблон, где всего ровно за один round-trip производится
рукопожатие. При этом, уже в первое сообщение от клиента и сервера можно
вложить полезную нагрузку (которая тоже будет зашифрована). В итоге, уже
с первым сообщением от клиента он предоставляет свой username. А сервер
в своём сообщении может сразу объяснить причину отказа например.

Кроме того, вместо того, чтобы заставлять клиента использовать такой же
номер UDP порта с которого он пришёл на TCP сервера (что не всегда может
быть доступно), клиент отправляет пакеты с произвольного порта. Во время
рукопожатия, сервер выдаёт ему 128-бит cookie, которую клиент должен в
UDP пакете послать ему. Ведь проходя через NAT-ы, он в общем случае
может и не знать какой порт увидит сервер. Только приняв cookie, сервер
выдаёт клиенту SID и оповещает остальных о его подключении. И проверка
связи по UDP, и дружелюбность к NAT-ам и stateful firewall-ам.

От пароля избавился. Так как публичный ключ сервера во время рукопожатия
не передаётся, то его нужно знать клиенту заранее. А чем заранее выданный
публичный ключ не идентичен паролю? Shared секрет для аутентификации.

Включил в Opus-е DTX (discontinuous transmission), где кодек может
вообще не отправлять пакеты если в них тишина. Действительно, при
ней ничего не отправляет. А также всё же снизил bitrate до 24Kbps, ибо
это вполне себе потолок достаточности для VoIP.

Урезал Poly1305 до 64-бит. Overhead от VoRS выходит 12-байтным (и это с
шифрованием и аутентификацией). Ну и сервер начали проверять Poly1305,
ибо это штука очень быстрая.

Плюс попробовал использовать ML/нейросети из Opus 1.5
(78018e649ab66c7a1f45b793ba7c3c8c7f0a24e4). Для этого нужно повысить
настройку сложности декодера. Go обёртка не позволяет это сделать, ибо
раньше в декодере этого просто нельзя было указывать. Сделал fork в
git://git.stargrave.org/go-opus.git, где оно появилось. Действительно,
особенно при потерях пакетов, разница на слух есть заметная, если
libopus собран с --enable-deep-plc --enable-osce и complexity=10. Но это
всё опционально.

    [оставить комментарий]