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

近期公司的项目须要一个后台server,要求能将内网的WEBserver暴露在外网上。于是。就在网上到处搜开源项目。找到两个口碑不错的项目(没验证过,人云亦云吧):localtunnel.me和ngrok。

前者是javascript语言开发的。后者是go语言开发的。正好又在写一个前端,学习javascript中(全栈project师!

!),就git clone下来看看吧。在这篇文章里。仅仅对原理和流程进行说明,不做代码分析。我一向觉得好的代码就是好的文档,尽管还是刚刚接触javascript这样的原型语言,还看不出代码质量好坏。可是localtunnel的凝视和代码本身还是让人非常easy理解的。

我在分析localtunnel.me的代码时,是server端和client对照着看的。

这样能够比較easy看懂server和client是怎样交互的。



  整体来说localtunnel.me的原理还是非常easy的,首先必须有一台能在公网訪问的server作数据中转用。localtunnel.me的server端程序就部署在这上边。server程序一边监听浏览器的http请求,一边监听client的tcp请求。

server将HTTP请求转发到相应的client。client程序又将HTTP报文转发到本地相应WEBserverport。这样,就实现了内网webserver的公网映射。



我们主要看看localtunnel.me的工作流程:



1.监听80port,当然也能够是其它port。等待client或浏览器的http请求。



2.server在接收到一个HTTP请求时,会推断当前请求的域名是主域名还是子域名。这时会有两种处理流程,主域名提供了新的通道创建功能。子域名则用来转发HTTP请求



3.假设请求的URL是主域名,且URL为类似这种请求:http://www.exampleserver.com/?new或http://www.exampleserver.com/xxxxxxxxxx。

服务端程序会创建一个TCP服务器。并把相关信息返回给相应的client。

这些信息包含服务器新监听的TCPport号,以及完整的子域名。

这里要说明一下。域名www.exampleserver.com必须是顶级域名(当然,也能够不是,仅仅要做二次开发)。

new表示生成一个随机的子域名,或者指定子域名为xxxxxxxx.exampleserver.com。



4.client收到server返回的信息后,就会与server创建一条TCP连接,hostname是server的域名或IP。port是刚才server返回的信息中的port。这样,client和server就建立起一条长连接。当client与server的TCP链接建立成功后。会立即建立与本地WEBserver的TCP链接。注意是TCP链接,不是HTTP链接。

5.当地球上的某个浏览器通过子域名的方式訪问http://xxxxxxxx.exampleserver.com时,服务器端程序会在一张大表里找xxxxxxxx这个子域名名字相应的clientsocket连接。并将http请求转发过去。

localtunnel.me使用bouncy库来实现转发功能。

ok,到这里。server端的大部分工作都完毕来,如今HTTP的请求到了client。

6.client收到了http请求的数据后。就在远程server和本地WEBserver之间建立一条pipe。只是。在首次转发之前,须要改动HTTP头的Host字段为本地server地址

localtunnel.me 原理流程浅析的更多相关文章

  1. 玩转Windows服务系列——服务运行、停止流程浅析

    通过研究Windows服务注册卸载的原理,感觉它并没有什么特别复杂的东西,Windows服务正在一步步退去它那神秘的面纱,至于是不是美女,大家可要睁大眼睛看清楚了. 接下来研究一下Windows服务的 ...

  2. 玩转Windows服务系列——服务运行、停止流程浅析

    原文:玩转Windows服务系列——服务运行.停止流程浅析 通过研究Windows服务注册卸载的原理,感觉它并没有什么特别复杂的东西,Windows服务正在一步步退去它那神秘的面纱,至于是不是美女,大 ...

  3. 以太网驱动的流程浅析(一)-Ifconfig主要流程【原创】

    以太网驱动的流程浅析(一)-Ifconfig主要流程 Author:张昺华 Email:920052390@qq.com Time:2019年3月23日星期六 此文也在我的个人公众号以及<Lin ...

  4. python写红包的原理流程包含random,lambda其中的使用和见简单介绍

    Python写红包的原理流程 首先来说说要用到的知识点,第一个要说的是扩展包random,random模块一般用来生成一个随机数 今天要用到ramdom中unifrom的方法用于生成一个指定范围的随机 ...

  5. Android 4.4 Kitkat Phone工作流程浅析(六)__InCallActivity显示更新流程

    本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. ...

  6. PHP容器--Pimple运行流程浅析

    需要具备的知识点 闭包 闭包和匿名函数在PHP5.3.0中引入的. 闭包是指:创建时封装周围状态的函数.即使闭包所处的环境不存在了,闭包中封装的状态依然存在. 理论上,闭包和匿名函数是不同的概念.但是 ...

  7. OAuth2.0 原理流程及其单点登录和权限控制

    2018年07月26日 07:21:58 kefeng-wang 阅读数:5468更多 所属专栏: Java微服务构架   版权声明:[自由转载-非商用-非衍生-保持署名]-转载请标明作者和出处. h ...

  8. Android 4.4 Kitkat Phone工作流程浅析(八)__Phone状态分析

    本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象.与Google原生AOSP有些许差异.请读者知悉. ...

  9. Android 4.4 Kitkat Phone工作流程浅析(七)__来电(MT)响铃流程

    本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. ...

随机推荐

  1. 聊聊 Statsd 和 Collectd 那点事!

    StatsD 是由 Etsy 开发并发布的汇总和总结应用指标的一个简单的守护进程,近些年来发展迅速,已经变成了一个用于收集应用性能指标的统一的协议. 关于 Statsd 的使用已经有很多文章介绍过,所 ...

  2. 安装Ubuntu服务器

    安装edX首先需要一台linux或Mac系统的电脑/服务器. 这里以常见的Ubuntu作为服务器系统. Ubuntu的官方网站为http://www.ubuntu.com,中文网站为http://ht ...

  3. Macbook配置adb环境

    配置adb命令 http://stackoverflow.com/questions/5526470/trying-to-add-adb-to-path-variable-osx http://sta ...

  4. vim多标签,多窗口

    多标签 进入vim前 vim -p <文件名> 以多标签形式打开文件.如vim -p * 就是编辑当前目录的所有文件, vim编辑中 :tabnew 增加一个标签 :tabc 关闭当前的t ...

  5. Webform——验证控件

    验证控件一般是在注册的时候用到,是直接将JS代码封装到了控件里面,拉过来直接可以用,下面介绍一下主要用法: 1.CompareValidator:比较验证 常用属性:ControlToCompare ...

  6. Samba ‘dcerpc_read_ncacn_packet_done’函数缓冲区溢出漏洞

    漏洞名称: Samba ‘dcerpc_read_ncacn_packet_done’函数缓冲区溢出漏洞 CNNVD编号: CNNVD-201312-169 发布时间: 2013-12-12 更新时间 ...

  7. ASP.NET MVC3细嚼慢咽---(2)模板页

    这一节演示下MVC3中怎样使用模板页,在传统的webform设计模式中,我们使用masterpage作为模板页,在MVC3 razor视图设计中,我们使用另一种方式作为模板页. 新建一个MVC3项目, ...

  8. ZOJ 3791 An Easy Game

     思路:dp+记忆化搜索,设dp[n][m]表示s1与s2不同字符个数为n,还需要变m步的方法数,那么: dp[n][m]  = (c[n][i]*c[N-n][K-i]) * dp[n-i+(K-i ...

  9. Git branch (分支学习)

    以前总结的一些git操作,分享在这里. Git 保存的不是文件差异或者变化量,而只是一系列文件快照.   - 列出当前所有分支 git branch <--merge> | <--n ...

  10. 我的第一个项目:用kinect录视频库

    kinect深度视频去噪 kinectmod32.dll http://pan.baidu.com/s/1DsGqX 下载后改名kinect.dll 替换掉Redist\OpenNI2\Drivers ...