继上一篇使用WebSocket进行网络穿透,实际使用中,UDP转发并不常用,并且使用WebSocket转发UDP包也会导致较高的延迟(我当时之所以有这个需求是因为学校网络限制)。
所以为了更简单的实现,更短的延迟,在此重新设计一种新的基于WebSocket的TCP转发协议。
代码实现在websocks。
协商
当客户端与服务端建立连接时, 需将 Basic 格式的身份认证信息通过 Authorization
头发送到服务器。
服务端响应应按照HTTP标准,如身份验证失败则返回401,身份验证成功但被限制访问则返回403,成功则返回101。
转发
为了复用单条 WebSocket 连接, 约定如下三种状态, 组成一次完整的请求周期如下:
请求连接
websocket使用文本帧传递JSON格式的字符串,请求连接的服务器HOST与PORT。
{
"HOST": "example.com",
"PORT": 443
}
服务器成功或失败之后,返回一个状态
{
"ALLOW": true/false
}
若成功, 则转至转发状态.
若失败, 则直接转至结束连接状态.
转发
在此过程中, 仅使用二进制帧, 进行转发数据。
结束连接
客户端或服务端主动断开连接,双方均需使用文本帧发送或者响应一次
{
"STATUS": "CLOSED"
}
当结束连接之后,客户端可重新使用此条WebSocket连接进行如上周期。