-
Notifications
You must be signed in to change notification settings - Fork 4.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add Datagram transport #4283
base: main
Are you sure you want to change the base?
Add Datagram transport #4283
Conversation
This is a early draft for Datagram transport, a new Unreliable protocol that does NOT handle packets loss retransmission. CC @RPRX @Fangliding |
生成 .pb.go 先用和 main 一致的吧 纯 QUIC 的话我感觉 TLS+ALPN H3 这种配置方式更合适 这个怎么识别它要传输的是 UDP,以及 H3 好像也能 datagram,试试直接加进 XHTTP? |
datagram是不可靠的吧 所有ray里的协议期望的都是可靠数据流 除了部分“原生UDP协议”(socks ss) 这些协议调用UDP连接的时候会绕过transport组件 |
|
图里的示例是未终结TCP的情况(MASQUE直接处理三层IP包) 在这种情况下可靠性是双端的TCP程序保证的所以可以这么用(类比L3 VPN) 但是Xray处理的是四层流量终结了TCP所以自己也得可靠不能用不可靠tunnel传输 |
Ok I see. In that case probably Datagram is only suitable for UDP proxy for us at the moment. |
话说是不是重叠了,这里已经有一个想发就发的 UDP 协议了 (mkcp) ,既然是 ray 系专属 kcp 所以不需要考虑外部兼容性的话给 mkcp 加个 no-ack-comfirm 可能更简单一些。 |
That's interesting comparison. Note that Datagram also does DTLS |
KCP去掉ACK重传那不是等于TLS去掉加密 主要目的都给去掉了 |
也许,它可以用于代理 h3,没有“流中流”(两层流控)问题 |
yes, not sure what it actually behave but the plan is to carry normal UDP and QUIC traffic |
又读了一下 RFC https://datatracker.ietf.org/doc/rfc9297/ |
这个与 VLESS/XUDP 层面配合的话可以实现传输 unreliable UDP,或者 TUN TCP,IP 包 ICMP 之类的,也需要给 VLESS 加料 之前频道对线我有提过想给 XHTTP H3 加个 datagram,这是 QUIC/Hy/TUIC 有的功能,我看了下 H3 也有,应该能加 能藏在 Nginx 后面、直连能用就行,不追求过 CDN,然后再给 Nginx QUIC 改个 gentle 发包,表现上应该不输 Hy/TUIC |
就是说我觉得不是 QUIC datagram 有没有 mux 的问题,而是不加个伪装站的话一个主动探测就没了,所以应该搞 H3 datagram 之前把 QUIC、HTTP 传输层删了也是同理,前者没伪装站,后者没 header padding #3272 (comment) ,都太假了,没必要 |
datagram只是提供一个传输不可靠数据的方法 没有提供代理方案(不像h3 connect) 但是作为一个代理协议这部分肯定是自己处理的(比如xudp 如果真的可以实现的话) 这倒是问题不大 |
我觉得既然现在这些 QUIC 代理都是服务端 quic-go 特征,我们搞个差异化的能藏到 Nginx 后面更好,提供它们没有的价值 没 padding 的问题,只要有设计当然就不是问题,但是强制 padding 就成新协议了,没必要再继承 HTTP 传输层这种名字 QUIC 这块的话弄 fallbacks 或内置 Web,这是 REALITY 出现以前的思路,日后弄 REALITY QUIC 就覆盖了直接 QUIC 的需求 |
关于 gentle 发包,这个是我想弄的与 brutal 相对的策略,合理积极探测网络上限、适度对抗丢包,而不是没达到想要的速率就使劲发包,整得跟饱和攻击一样, |
我研究了一下 quic-go 和其 h3 的 EnableDatagrams,它可以被转译为 h2,Nginx 应该支持转发,只是不知道 目前如果想做到 UDP 包走 XHTTP/3 datagram 是完全可行的,鉴于 UDP 可能被 Q 还可以允许配置为只让 UDP 包走 XHTTP/3 虽然路由也能做这件事,还有如果只想让少量 UDP 包走 XHTTP/3,还得把被代理流量的 UDP 443 禁了 |
放h2里不变可靠流了 没意义了 |
Nginx 最多只支持 h2c 回源,意义在于它和 Xray 通信,CDN 同理,容易丢包的阶段是境内到境外段,这一段需要 datagram |
|
现在重点在于研究如何在 Xray 服务端构造出来能被 Nginx 转义为 H3 datagram 的 h2c 包,或许 @yin1999 有空研究下? |
这扯有点远了 这个9297基本就是给后面的masque开绿灯而已 没有别的转发器支持他 不管是ng还是cf "能被 Nginx 转义为 H3 datagram 的 h2c 包" 这怎么可能啊 ng压根不会发这种包不说 datagram frame 是quic的东西 h2完全没这样的东西 除非自己写个专有的包装格式再转发一下(很明显不太现实) |
我今天粗略看了下 9297,人家说的是 HTTP datagram 而不只是 h3,给出了 h2 的情况并指出丧失了“不可靠性” |
如果用 UDS(而不是 TCP)回源就不是“可靠”了吧🤔 |
这倒不是大问题,h3 datagram 的格式和非 h3 时 capsule protocol 的格式都在 9297 中写明了,改代码很简单 毕竟我们还要 patch Nginx 让它支持别的 QUIC 拥塞控制,一个 patch 版的 Nginx 是不可避免的,这就是 XHTTP 接下来的方向 |
- make datagram transport without mux functionality - it is now recommended to always pair with mux-cool (XUDP new tunnel non-zero session id)
目前进度:datagram 可以发了 大包通过 stream 也可以发了 但是测试遇到一个问题:在 MTU 临界值的包比如 1247 一开始是走 stream 的 后来似乎 quic-go 内部的 MTU 会增大 使得它开始尝试发 datagram 但是实际上会丢包 需要研究一下 quic-go 另外不用 h3 datagram 的原因是我们只需要一层 mux |
如果实在想把 QUIC transport 加回来,可以是 TLS ALPN 有且只有 h3 的形式,我之前把 TCP 改成 RAW 就是为这种情况做铺垫 |
Server:
Client:
|
No description provided.