ngrok交互流程及原理解析

ngrok从前端时间就比较火,自从openwrt的固件开始支持他之后,就更火了,因为这玩意真的不错,内网穿透,微信web开发,作用大大的!github地址:https://github.com/inconshreveable/ngrok,官网https://ngrok.com/,而且GitHub上还有人吧用C++/PYTHON写了客户端,让ngrok的可移植性大大加强。Python版本:https://github.com/hauntek/python-ngrok,C++版本:https://github.com/dosgo/ngrok-c

但是ngrok的作者小心眼的把2.0不开源了,估计是想商用。。。

所以现在出来个新的替代的东西,frp,基本原理和ngrok相似,开发语言都是go,GitHub地址:https://github.com/fatedier/frp

本文只说ngrok。

穿透过程:
1.当服务端接收到连接,就读取映射表,判断接收的端口对应于哪一个客户端,然后向客户端转发数据.
2.客户端收到数据,读取本地映射表,判断对应哪个内网地址,向内网地址发起连接.
3.客户端和内网的服务器建立连接后,向服务端发起一个连接,作为转发通道.
4.服务端读取请求数据,并通过转发通道转发到客户端,客户端读取响应并通过转发通道返回给请求.
这只是一个简单的连接过程,其中还有映射端口的管理,如果是全端口映射还需要动态映射端口,目前只有网络通有这个全端口的功能,对于一些特殊应用,还要修改解析修改转发的数据才能穿透成功.
从上面的流程可以看出ngrok主要是转发tcp的数据,所以一般的ngrok服务器仅仅支持tcp和http的转发,其实实际上是可以加入udp转发的,不过ngrok客户端和服务器之间还是需要用tcp长连接才能穿透内网。

下面是我整理的交互流程,如有纰漏请留言指出,图中没有画出pingpong的心跳包。

经过实际使用查看得知,有几个client连接,ngrok的服务器和ngrok客户端之间就会有几个长连接,那么为什么不能让ngrok服务端和客户端之间只有一个tcp连接呢,然后每一个数据包发来时,服务器再包装下,发给ngrok客户端,ngrok客户端再根据消息内容找到对应的socket,这样可以让服务器节省一半的tcp长连接,节省带宽和负载,如下

欢迎大家留言交流,如有不对的地方敬请指出。

 

One thought on “ngrok交互流程及原理解析

  1. 那么为什么不能让ngrok服务端和客户端之间只有一个tcp连接呢?是因为TCP分片的限制,开发者这样做的原因我估计是想提高访问速度,就像单线程与多线程的意思。

发表评论

电子邮件地址不会被公开。 必填项已用*标注