QUIC是 google 制定的一种基于UDP的低时延的可靠的互联网传输层协议。google 为其研发了优秀的重传算法和拥塞控制算法,和同样是可靠传输协议相较于传统的 TCP 相比 QUIC 的表现可以说相当优秀,尤其是在互联网长距离传输并且存在丢包的网络环境,QUIC 的表现相较于 TCP 有着成倍的提升。目前最著名的基于 QUIC 的应用就是 HTTP3 了。
由于 QUIC 是一个新型的传输层协议,出现时间比较晚,像 HTTP3 这种应用具有后发优势,能很容易的使用上 QUIC 协议,但是目前据大部分应用还都是基于 TCP 的,QUIC 的普及还需要相当长的一段时间。那么有没有别的办法能让传统 TCP 应用间接的使用上 QUIC 呢?答案显而易见,当然是有:就是今天我想向大家介绍的 quic-tun,下面就让我们快速体验一下这个工具。
从 release 页面下载最新版本,然后解压,在编写本文时 0.0.4 是最新版本:
wget https://github.com/kungze/quic-tun/releases/download/v0.0.4/quic-tun_0.0.4_linux_amd64.tar.gz
tar xvfz quic-tun_0.0.4_linux_amd64.tar.gz
启动 server 端程序
./quictun-server --listen-on 172.18.31.36:7500
需要更具自己环境的实际情况调整监听的 IP 和端口(UDP 端口)。
启动客户端程序
./quictun-client --listen-on tcp:127.0.0.1:6500 --server-endpoint 172.18.31.36:7500 --token-source tcp:172.18.30.117:22
客户端程序的参数复杂了许多,这里我来一一解释:
- –listen-on 客户端程序监听的套接字,可以是一个 TCP 端口,也可以是一个 unix 套接字文件
- –server-endpoint 这个和服务端程序的 --listen-on 对应
- –token-source 这个参数后面的套接字地址就是我们想要优化的传统的 TCP 应用(位于服务端的应用)的套接字地址,至于为什么要通过这种方式指定服务端应用的地址,需要详细阅读官方的项目文档。
等待客户端启动后,我们访问客户端监听的地址,quic-tun 就会把流量转发到后端真实服务。转发流程可以分为三个阶段:
- 客户端应用->quictun-client(客户端程序):这个阶段会进行换头操作,把数据包的 TCP 报文头换为 QUIC;
- quictun-client(客户端程序)->quictun-server(服务端程序):这个阶段使用 QUCI 协议进行长距离传输;
- quictun-server(服务端程序)->真实服务:这个阶段会把数据包的 QUIC 报文头换回 TCP,在转发到真实服务
从上面客户端的启动参数可以看出我想优化的 TCP 服务是一个 SSH 服务(172.18.30.117:22),那么我们可以用 ssh 命令测试一下效果:
$ ssh root@127.0.0.1 -p 6500
root@127.0.0.1's password:
参考链接:
代码仓库:https://github.com/kungze/quic-tun
官方文档:https://kungze.github.io/documents/quic-tun/