首页 > 代码库 > localtunnel.me 原理流程浅析
localtunnel.me 原理流程浅析
最近公司的项目需要一个后台服务器,要求能将内网的WEB服务器暴露在外网上。于是,就在网上到处搜开源项目。找到两个口碑不错的项目(没验证过,人云亦云吧):localtunnel.me和ngrok。前者是javascript语言开发的,后者是go语言开发的。正好又在写一个前端,学习javascript中(全栈工程师!!),就git clone下来看看吧。在这篇文章里,只对原理和流程进行说明,不做代码分析。我一向认为好的代码就是好的文档,虽然还是刚刚接触javascript这种原型语言,还看不出代码质量好坏,但是localtunnel的注释和代码本身还是让人很容易理解的。
我在分析localtunnel.me的代码时,是服务器端和客户端对比着看的。这样可以比较容易看懂服务器和客户端是如何交互的。
总体来说localtunnel.me的原理还是很简单的,首先必须有一台能在公网访问的服务器作数据中转用,localtunnel.me的服务器端程序就部署在这上边。服务器程序一边监听浏览器的http请求,一边监听客户端的tcp请求。服务器将HTTP请求转发到对应的客户端。客户端程序又将HTTP报文转发到本地对应WEB服务器端口。这样,就实现了内网web服务器的公网映射。
我们主要看看localtunnel.me的工作流程:
1.监听80端口,当然也可以是其他端口,等待客户端或浏览器的http请求。
2.服务器在接收到一个HTTP请求时,会判断当前请求的域名是主域名还是子域名。这时会有两种处理流程,主域名提供了新的通道创建功能,子域名则用来转发HTTP请求
3.如果请求的URL是主域名,且URL为类似这样的请求:http://www.exampleserver.com/?new或http://www.exampleserver.com/xxxxxxxxxx。服务端程序会创建一个TCP服务器,并把相关信息返回给对应的客户端。这些信息包括服务器新监听的TCP端口号,以及完整的子域名。
这里要说明一下,域名www.exampleserver.com必须是顶级域名(当然,也可以不是,只要做二次开发)。
new表示生成一个随机的子域名,或者指定子域名为xxxxxxxx.exampleserver.com。
4.客户端收到服务器返回的信息后,就会与服务器创建一条TCP连接,hostname是服务器的域名或IP,port是刚才服务器返回的信息中的port。这样,客户端和服务器就建立起一条长连接。当客户端与服务器的TCP链接建立成功后,会马上建立与本地WEB服务器的TCP链接。注意是TCP链接,不是HTTP链接。
5.当地球上的某个浏览器通过子域名的方式访问http://xxxxxxxx.exampleserver.com时,服务器端程序会在一张大表里找xxxxxxxx这个子域名名字对应的客户端socket连接,并将http请求转发过去。localtunnel.me使用bouncy库来实现转发功能。
我在分析localtunnel.me的代码时,是服务器端和客户端对比着看的。这样可以比较容易看懂服务器和客户端是如何交互的。
总体来说localtunnel.me的原理还是很简单的,首先必须有一台能在公网访问的服务器作数据中转用,localtunnel.me的服务器端程序就部署在这上边。服务器程序一边监听浏览器的http请求,一边监听客户端的tcp请求。服务器将HTTP请求转发到对应的客户端。客户端程序又将HTTP报文转发到本地对应WEB服务器端口。这样,就实现了内网web服务器的公网映射。
我们主要看看localtunnel.me的工作流程:
1.监听80端口,当然也可以是其他端口,等待客户端或浏览器的http请求。
2.服务器在接收到一个HTTP请求时,会判断当前请求的域名是主域名还是子域名。这时会有两种处理流程,主域名提供了新的通道创建功能,子域名则用来转发HTTP请求
3.如果请求的URL是主域名,且URL为类似这样的请求:http://www.exampleserver.com/?new或http://www.exampleserver.com/xxxxxxxxxx。服务端程序会创建一个TCP服务器,并把相关信息返回给对应的客户端。这些信息包括服务器新监听的TCP端口号,以及完整的子域名。
这里要说明一下,域名www.exampleserver.com必须是顶级域名(当然,也可以不是,只要做二次开发)。
new表示生成一个随机的子域名,或者指定子域名为xxxxxxxx.exampleserver.com。
4.客户端收到服务器返回的信息后,就会与服务器创建一条TCP连接,hostname是服务器的域名或IP,port是刚才服务器返回的信息中的port。这样,客户端和服务器就建立起一条长连接。当客户端与服务器的TCP链接建立成功后,会马上建立与本地WEB服务器的TCP链接。注意是TCP链接,不是HTTP链接。
5.当地球上的某个浏览器通过子域名的方式访问http://xxxxxxxx.exampleserver.com时,服务器端程序会在一张大表里找xxxxxxxx这个子域名名字对应的客户端socket连接,并将http请求转发过去。localtunnel.me使用bouncy库来实现转发功能。
ok,到这里,服务器端的大部分工作都完成来,现在HTTP的请求到了客户端。
6.客户端收到了http请求的数据后,就在远程服务器和本地WEB服务器之间建立一条pipe。不过,在首次转发之前,需要修改HTTP头的Host字段为本地服务器地址
localtunnel.me 原理流程浅析
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。