Skip to content

0-RTT 可能没有生效 #46

Description

@spongebob888

测试发现0-RTT可能没有生效

背景

TUIC/QUIC 有两种方式降低连接延迟

  1. QUIC自带的连接复用
  2. 0-RTT 握手

什么时候启动连接复用

当QUIC连接 保持活跃时,所有的新连接不会创建新的握手,因此延迟是0-RTT,实验也验证了这一点

TUIC 有心跳机制可以保证连接一直活跃不断开,从而维持复用机制。但这引入了特征

什么时候启动0-RTT 握手

  1. 当一段时间(数小时)之前和服务器发生过1-RTT 握手但是随后连接断开了。
  2. 客户端和服务器都没有重启,从而有共享的PSK信息
  3. 此时进行代理连接将进行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。

zero_rtt_accepted.await;

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions