基于 HTTP/2 的 WEB 内网穿透实现

  • 时间:
  • 浏览:2

HTTP/2 引入了二进制分帧层,将 HTTP/1.1 中的请求和响应拆成颗粒度更细的帧(frame),从而实现了优先级、流量控制和 Server Push 等功能;HTTP/2 在单条 TCP 连接上不能打开多个流,从而实现了多路复用;HTTP/2 使用静态字典、动态字典以及哈夫曼编码,对请求 / 响应头部进行压缩。总之,HTTP/2 从协议层面防止了 HTTP/1.1 的诸多什么的现象。

作者:来源:Jerry Qu的小站|2015-11-24 15:22

HTTP/2 引入了二进制分帧层,将 HTTP/1.1 中的请求和响应拆成颗粒度更细的帧(frame),从而实现了优先级、流量控制和 Server Push 等功能;HTTP/2 在单条 TCP 连接上不能打开多个流,从而实现了多路复用;HTTP/2 使用静态字典、动态字典以及哈夫曼编码,对请求 / 响应头部进行压缩。总之,HTTP/2 从协议层面防止了 HTTP/1.1 的诸多什么的现象。

在我而是写的文章里,我介绍了怎么能不能通过 ngrok 让内网 WEB 在其它网络环境中不能被访问。本文要实现的服务与 ngrok 类似于于,我把它称之为 Pangolin,中文是穿山甲的意思(名字来自于同事的类似于于项目,在此表示感谢)。Pangolin 客户端和服务端之间的报文转发,是用 node-http2 这种 Node.js 模块提供的 HTTP/2 服务来实现的。

Pangolin 的需求来自于本博客用户评论(via)。实际上,能实现类似于于功能的软件其他,有使用私有协议进行转发的,有使用 WebSocket 进行转发的。而我认为 HTTP/2 应该是个不错的挑选,打算试一下。最终我花了有一一一两个 小时实现了有一一一两个 初步能用的版本,除开 node-http2,全版代码不超过 50 行。代码我倒入了 github 上,有兴趣的同学还能不能玩一下。

下面简单介绍它的原理,我画了一张草图:

 

最左侧是最终用来访问服务的浏览器,它而是居于公网,也而是居于其它内网;最右侧是实际提供 WEB 服务的 HTTP Server,它居于内网。显然,左侧浏览器没措施直接访问右侧 WEB 服务,不还能不能借助公网节点作为桥梁。底下的 pangolin 服务端运行在公网节点上;Pangolin 客户端运行在与 WEB 服务同台机器而是同一网段内。

浏览器发起请求后,请求报文沿着绿色箭头从左到右流动,每个节点有的是花费左侧相邻节点的 HTTP Server。唯一的什么的现象突然跳出在 Pangolin 服务端和客户端之间:客户端居于内网,正常具体情况下 Pangolin 服务端连不上客户端提供的 HTTP Server。

这种 什么的现象我用了有一一一两个 取巧的措施防止:而是 Pangolin 服务端有公网 IP,还能不能开启 TCP Server,客户端还能不能通过 IP 和约定的端口与服务端建立 TCP 连接。很难假如稍微改造一下 node-http2 的代码,使它还能不能基于指定 socket 创建 HTTP/2 Server、发送 HTTP/2 Request,就还能不能打通所有节点了。这种 什么的现象防止后,左侧的请求还能不能顺利到达右侧,响应数据也还能不能沿着而是的连接逐级返回。

Pangolin 服务端和客户端内部内部结构之间使用 HTTP/2,还能不能大幅提高性能,降低进程运行冗杂性;对外使用 HTTP/1.1,保证了与已有系统的兼容性。

为了实现内网穿透,Pangolin 时要做以下准备工作:

Pangolin 服务端开启 TCP Server;

Pangolin 客户端启动 TCP Client,与 Pangolin 服务端连接,得到 socket 长连接;

Pangolin 客户端基于这种 socket 连接,开启 HTTP/2 Server;

Pangolin 服务端开启 HTTP/1.1 Server,等待时间浏览器来访问;

实际的数据传输流程如下:

浏览器向 Pangolin 服务端发起请求(HTTP/1.1);

Pangolin 服务端基于已有 socket,向 Pangolin 客户端发起请求(HTTP/2);

Pangolin 客户端向内网 WEB 服务发起请求,得到响应(HTTP/1.1);

Pangolin 客户端基于已有 socket,将响应返回给 Pangolin 服务端(HTTP/2);

Pangolin 服务端将响应返回给浏览器(HTTP/1.1);

而是 Pangolin 客户端采用了 HTTP 转发,而全版有的是 TCP 隧道,其他还能不能轻松实现 ngrok 那样的管理界面,用来查看过整的 Request/Response 信息。目前我还而是简单地打印了请求日志。

HTTP/2 协议有五种并很难规定它时要基于 TLS 部署,很难安全层的 HTTP/2 被称之为 h2c(HTTP/2 Cleartext)。目前来看,所有浏览器全版有的是打算支持 h2c。但而是有一一一两个 系统的其他环节对安全很难很难高的要求,而是而是通过了其它方案确保了安全,部署 h2c 也是有一一一两个 非常好的挑选。现在其他 HTTP/2 工具和类库一同支持 h2 和 h2c,node-http2 也是很难。

实际上,我为了测试方便,在实现 pangolin 时也挑选了 h2c。通过 Wireshark 抓包还能不能看出,HTTP/2 层下面直接而是 TCP 层:

 

【编辑推荐】

【责任编辑:

何妍

TEL:(010)68476506】



点赞 0