webrtc: take dcsctp's retransmission timings and IPv6-safe MTU

webrtc-sctp ships RFC 4960's RTO.Initial/RTO.Min (3000/1000), TCP's values for
arbitrary public paths. On this workload they set the recovery time outright:
a request/response exchange keeps one chunk in flight, so no later SACK ever
raises miss_indicator to the 3 that arms fast retransmit, and the T3 floor is
the only way back. A single loss during a handshake or a first keyframe
therefore costs whole seconds.

The fork now carries dcsctp's numbers instead - the SCTP implementation Google
wrote to replace usrsctp for Chrome's WebRTC data channels, the same realtime
workload: rto_initial 500, rto_min 400, a 220ms floor under the RTT variance,
and mtu 1191. INITIAL_MTU 1228 plus DTLS/UDP/IPv6 overhead is 1313, past the
1280 minimum, so every full-size chunk fragmented on an IPv6 path.

Both patch entries move to the new branch, which also carries the Windows IPv6
byte-swap fix, so one rev matches the whole webrtc 0.13 stack.
This commit is contained in:
rustdesk
2026-08-26 19:01:53 +08:00
parent e3ef5317c5
commit c99ccdcb0d
2 changed files with 9 additions and 5 deletions

5
Cargo.lock generated
View File

@@ -9706,8 +9706,7 @@ dependencies = [
[[package]]
name = "webrtc-sctp"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07439c134425d51d2f10907aaf2f815fdfb587dce19fe94a4ae8b5faf2aae5ae"
source = "git+https://github.com/rustdesk-org/webrtc?rev=56d097c54f9ea1e48c0dfbeb6ce7e66d2e66e833#56d097c54f9ea1e48c0dfbeb6ce7e66d2e66e833"
dependencies = [
"arc-swap",
"async-trait",
@@ -9747,7 +9746,7 @@ dependencies = [
[[package]]
name = "webrtc-util"
version = "0.11.0"
source = "git+https://github.com/rustdesk-org/webrtc?rev=ac9e74ec2dc502d9afce8d5fc3c9644f2139aee7#ac9e74ec2dc502d9afce8d5fc3c9644f2139aee7"
source = "git+https://github.com/rustdesk-org/webrtc?rev=56d097c54f9ea1e48c0dfbeb6ce7e66d2e66e833#56d097c54f9ea1e48c0dfbeb6ce7e66d2e66e833"
dependencies = [
"async-trait",
"bitflags 1.3.2",

View File

@@ -215,10 +215,15 @@ exclude = ["vdi/host"]
# This allows building and running on systems without libxdo installed (e.g., Wayland-only)
[patch.crates-io]
libxdo-sys = { path = "libs/libxdo-sys-stub" }
# webrtc-util reads the Windows adapter list's IPv6 addresses as host-order u16 groups, so every
# One branch off upstream v0.13.0, the tag whose crate versions match this stack.
# webrtc-util: reads the Windows adapter list's IPv6 addresses as host-order u16 groups, so every
# one comes out byte-swapped, fails to bind, and ICE gathers no IPv6 host candidate on Windows.
# webrtc-sctp: RFC 4960's 1s RTO floor makes a single loss cost 1-3s on a link whose RTT is 24-64ms,
# and fast retransmit cannot cover a request/response exchange; INITIAL_MTU 1228 also fragments on
# IPv6. The fork commit carries the arithmetic.
# Pinned by rev, not branch: a fork branch can be rewritten out from under the lockfile.
webrtc-util = { git = "https://github.com/rustdesk-org/webrtc", rev = "ac9e74ec2dc502d9afce8d5fc3c9644f2139aee7" }
webrtc-util = { git = "https://github.com/rustdesk-org/webrtc", rev = "56d097c54f9ea1e48c0dfbeb6ce7e66d2e66e833" }
webrtc-sctp = { git = "https://github.com/rustdesk-org/webrtc", rev = "56d097c54f9ea1e48c0dfbeb6ce7e66d2e66e833" }
[package.metadata.winres]
LegalCopyright = "Copyright © 2026 Purslane Tech Pte. Ltd. All rights reserved."