Categorygithub.com/ZYKJShadow/tuic-protocol-go
module
0.0.0-20240605124811-563cb2d5cc24
Repository: https://github.com/zykjshadow/tuic-protocol-go.git
Documentation: pkg.go.dev

# README

TUIC-PROTOCOL-GO

本协议是TUIC Protocol的Golang实现版本,是以学习为目的开发和开源,一切用于违法行为的操作与作者无关
Golang客户端:tuic-client
Golang服务器:tuic-server

协议

TUIC 协议依赖于一个可以多路复用的 TLS 加密流。所有的中继任务都通过 Command 中的 Header 来协商。

协议版本

0x05

Command

+-----+------+----------+
| VER | TYPE |   OPT    |
+-----+------+----------+
|  1  |  1   | Variable |
+-----+------+----------+
  • VER: 协议版本,固定为0x05
  • TYPE: Command类型
  • OPT: Command参数,参考Command 参数

Command 类型

目前有五种Command类型:

  • 0x00 Authenticate - 认证
  • 0x01 Connect - 建立TCP中继
  • 0x02 Packet - 传输UDP中继(分片)
  • 0x03 Dissociate - 终止UDP中继
  • 0x04 Heartbeat - 心跳

其中 Connect 和 Packet 携带有效载荷(流/数据包片段)

Command 参数

Authenticate

+------+-------+
| UUID | TOKEN |
+------+-------+
|  16  |  32   |
+------+-------+
  • UUID 客户端UUID
  • TOKEN 客户端令牌,客户端的UUID作为label,客户端密码作为context,从TLS连接中生成的32位密钥

Connect

+----------+
|   ADDR   |
+----------+
| Variable |
+----------+

Packet

+----------+--------+------------+---------+------+----------+
| ASSOC_ID | PKT_ID | FRAG_TOTAL | FRAG_ID | SIZE |   ADDR   |
+----------+--------+------------+---------+------+----------+
|    2     |   2    |     1      |    1    |  2   | Variable |
+----------+--------+------------+---------+------+----------+
  • ASSOC_ID - UDP中继的关联ID,参考UDP中继
  • PKT_ID - UDP包ID
  • FRAG_TOTAL - UDP包分段总数
  • FRAG_ID - UDP包分段ID
  • SIZE - UDP分段包大小
  • ADDR - 目标地址信息,参考地址信息

Dissociate

+----------+
| ASSOC_ID |
+----------+
|    2     |
+----------+
  • ASSOC_ID - UDP中继的关联ID,参考UDP中继

Heartbeat

+-+
| |
+-+
| |
+-+

地址信息

ADDR

+------+-------------+----------+
| TYPE |   ADDRESS   |   PORT   |
+------+-------------+----------+
|  1   |   Variable  |    2     |
+------+-------------+----------+
  • TYPE - 地址类型
  • ADDRESS - 地址
  • PORT - 端口号

地址类型:

  • 0xff:无
  • 0x00:域名(类型为域名时,ADDRESS部分的第一个字节表示域名长度)
  • 0x01:IPv4 地址
  • 0x02:IPv6 地址

整体流程

1、认证

  • 客户端打开一个单向流(uni_stream),发送Authenticate命令
  • 服务器接收到Authenticate后,验证 Token 的有效性。如果 Token 有效,则连接认证成功,进行其他中继任务
  • 如果服务器在接收到Authenticate命令之前收到其他命令,则只接受命令头部分并等待认证,认证成功后通知正在等待的协程继续进行任务

2、TCP中继

  • 客户端打开一个双向流(bi_stream),发送Connect命令
  • 客户端在Connect命令发送成功之后,立刻对双向流和本地连接建立双向传输
  • 服务器接收到Connect命令后,打开一个到目标地址的TCP流,建立成功后,服务器立即在TCP流和双向流之间传输数据

3、UDP中继

  • ASSOC_ID由客户端生成
  • 客户端可以通过QUIC 单向流(quic模式)或 QUIC datagram(native模式)发送Packet命令
  • 通过在客户端和服务器之间同步UDPASSOC_ID来实现0-RTT
  • 客户端和服务器为每个 QUIC 连接创建一个 UDP 会话表,将每个ASSOC_ID映射到一个UDP socket
  • 服务器为每一个ASSOC_ID分配一个UDP socket。服务器使用这个UDP socket发送客户端请求的 UDP 数据包,同时接收来自任何目的地的UDP数据包,并添加Packet命令头发送回客户端
  • 客户端可以通过 QUIC 单向流发送Dissociate命令来解除关联

4、 心跳

客户端定期通过Datagram的方式发送Heartbeat命令

# Packages

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author