测试发现0-RTT可能没有生效
背景
TUIC/QUIC 有两种方式降低连接延迟
- QUIC自带的连接复用
- 0-RTT 握手
什么时候启动连接复用
当QUIC连接 保持活跃时,所有的新连接不会创建新的握手,因此延迟是0-RTT,实验也验证了这一点
TUIC 有心跳机制可以保证连接一直活跃不断开,从而维持复用机制。但这引入了特征
什么时候启动0-RTT 握手
- 当一段时间(数小时)之前和服务器发生过1-RTT 握手但是随后连接断开了。
- 客户端和服务器都没有重启,从而有共享的PSK信息
- 此时进行代理连接将进行0-RTT握手, 若0-RTT 握手失败将退化为1-RTT握手
实验验证,TUIC可能存在bug,0-RTT握手成功了,但是数据传输存在1个RTT单位的延迟
实验
客户端
版本:1.4.5
{
"relay": {
"server": "",
"ip":"",
"uuid": "",
"password": "",
"udp_relay_mode": "native",
"congestion_control": "bbr",
"alpn": ["h3", "spdy/3.1"],
"zero_rtt_handshake": true,
"disable_sni": false,
"timeout": "60s",
"heartbeat": "1000s",
"disable_native_certs": false,
"send_window": 16777216,
"receive_window": 8388608,
"gc_interval": "3s",
"gc_lifetime": "15s"
},
"local": {
"server": "[::]:1089",
"dual_stack": true,
"max_packet_size": 1500
},
"log_level": "debug"
}
服务端
版本:1.4.5
{
"server": "[::]:443",
"users": {
"": ""
},
"certificate": "",
"private_key": "",
"congestion_control": "bbr",
"alpn": ["h3", "spdy/3.1"],
"udp_relay_ipv6": true,
"zero_rtt_handshake": true,
"dual_stack": true,
"auth_timeout": "3s",
"task_negotiation_timeout": "3s",
"max_external_packet_size": 1500,
"send_window": 16777216,
"receive_window": 8388608,
"gc_interval": "3s",
"gc_lifetime": "15s",
"log_level": "debug"
}
验证连接复用
快速执行下列指令两次可以 触发连接复用并显示延迟
curl http://echo.free.beeceptor.com --socks5 127.0.0.1:1089 -v --trace-time
根据时间戳可以算出延迟时间,确实是1个RTT
从而连接复用是正常的
验证0-RTT握手
执行上述指令后,静息一段时间(半分钟到一分钟)连接将自动断开
继续执行curl指令,此时将启用0-RTT握手
curl http://echo.free.beeceptor.com --socks5 127.0.0.1:1089 -v --trace-time
根据时间戳计算,延迟是连接复用情况下的两倍,从而0-RTT 没有实现
客户端日志显示:
[relay] [authenticate] waiting for connection to be fully established
则表示进行了0-RTT握手
可能的原因
handle_task.rs 中验证之前执行了 zero_rtt_accepted.await 会导致阻塞,因为必须接收到serverhello 之后该调用才能返回,此时才能
确定0-rtt握手是否成功。从而导致了额外的rtt。
测试发现0-RTT可能没有生效
背景
TUIC/QUIC 有两种方式降低连接延迟
什么时候启动连接复用
当QUIC连接 保持活跃时,所有的新连接不会创建新的握手,因此延迟是0-RTT,实验也验证了这一点
TUIC 有心跳机制可以保证连接一直活跃不断开,从而维持复用机制。但这引入了特征
什么时候启动0-RTT 握手
实验验证,TUIC可能存在bug,0-RTT握手成功了,但是数据传输存在1个RTT单位的延迟
实验
客户端
版本:1.4.5
{ "relay": { "server": "", "ip":"", "uuid": "", "password": "", "udp_relay_mode": "native", "congestion_control": "bbr", "alpn": ["h3", "spdy/3.1"], "zero_rtt_handshake": true, "disable_sni": false, "timeout": "60s", "heartbeat": "1000s", "disable_native_certs": false, "send_window": 16777216, "receive_window": 8388608, "gc_interval": "3s", "gc_lifetime": "15s" }, "local": { "server": "[::]:1089", "dual_stack": true, "max_packet_size": 1500 }, "log_level": "debug" }服务端
版本:1.4.5
{ "server": "[::]:443", "users": { "": "" }, "certificate": "", "private_key": "", "congestion_control": "bbr", "alpn": ["h3", "spdy/3.1"], "udp_relay_ipv6": true, "zero_rtt_handshake": true, "dual_stack": true, "auth_timeout": "3s", "task_negotiation_timeout": "3s", "max_external_packet_size": 1500, "send_window": 16777216, "receive_window": 8388608, "gc_interval": "3s", "gc_lifetime": "15s", "log_level": "debug" }验证连接复用
快速执行下列指令两次可以 触发连接复用并显示延迟
根据时间戳可以算出延迟时间,确实是1个RTT
从而连接复用是正常的
验证0-RTT握手
执行上述指令后,静息一段时间(半分钟到一分钟)连接将自动断开
继续执行curl指令,此时将启用0-RTT握手
根据时间戳计算,延迟是连接复用情况下的两倍,从而0-RTT 没有实现
客户端日志显示:
则表示进行了0-RTT握手
可能的原因
handle_task.rs中验证之前执行了zero_rtt_accepted.await会导致阻塞,因为必须接收到serverhello 之后该调用才能返回,此时才能确定0-rtt握手是否成功。从而导致了额外的rtt。
tuic/tuic-client/src/connection/handle_task.rs
Line 18 in 38032e9