NiceLeeのBlog 用爱发电 bilibili~

Rust 利用HTTPS WebSocket通道转发流量

2022-11-15
nIceLee

阅读:


前面我们已经实现了HTTP(S)代理。
该代理获得(host,port)后,是尝试直接与目的socket建立连接。
假设我们在远端有一台服务器。
我们想代理在获得(host,port)后,与服务器建立连接,并告知它(host,port)。
由服务器建立与目的socket建立连接,继而充当管道工,转发各自流量。

实现细节

为什么要用Websocket?

先来思考一个问题,建立一个HTTP连接后,如何确保不受限制上下行?
对于下行,一个简单的做法是Transfer-Encoding:chunked
对于上行,考虑到HTTP 1.1发送完毕后该TCP连接实际上并未关闭,可以每次在发送数据时加上一个HTTP请求头,但一个请求头意味着一个HTTP回复,而且上下行时序上必须一致,容易阻塞。
上述始终存在一个问题,即只能一上一下轮流传输。
考虑到这一点,使用Websocket是一个最现实的最容易的选择。
(至少比起这个,基于HTTP2的grpc要更复杂一点。)
实现上,客户端发一个Upgrade: websocket升级请求,服务端回一个101 Switching Protocols即可。
之后的数据可以直接传输,不必按照Websocket的帧格式来了。

代理如何告知服务器(host,port)?

在建立HTTP Websocket时,需要发送一个升级请求,我们可以把信息放在HTTP消息的header里面。
在本项目中,我们放在了Cookie里。

代理与服务器之间如何鉴权认证?

同上,可以约定鉴权方式,把信息放在header里。

代码

freedomRust


下一篇 Rust 交叉编译

内容
隐藏