localtunnel.me 原理流程浅析

知识共享许可协议  本文采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。

   

  最近公司的项目需要一个后台服务器,要求能将内网的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库来实现转发功能。


ok,到这里,服务器端的大部分工作都完成来,现在HTTP的请求到了客户端。

6.客户端收到了http请求的数据后,就在远程服务器和本地WEB服务器之间建立一条pipe。不过,在首次转发之前,需要修改HTTP头的Host字段为本地服务器地址



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值