本文採用知识共享署名-同样方式共享
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. 为 UWP 应用提供的 .NET 网络 API

    [编者按]本文作者是 Windows networking 团队项目经理 Sidharth Nabar.在微软 Build 2015 大会上,.NET Core 5 作为开发 UWP(Universa ...

  2. servlet向ajax传递list数据类型,ajax向servlet传递array数据类型

    因工作需要, 1,后台向前台传递一个list 2,前台向后台传递类似于list的结构,但是因为javascript不支持list类型,所以只能使用二维数组代替 后台运行后的截图:           ...

  3. Altium Designer完美双屏显示方法演示

    布线时我们往往需要对一些信号线做特别的走线处理,这样需要边布线边对照原理图,在protel99中那是一个很痛苦的事,在Altium Designer中这种情况将变很简单. 硬件要求,笔记本+外接显示器 ...

  4. 对QT的产品,以及QT的一些综合评论 good

    QT你不能说他不流行吧, WPS, Wirshark, KDE, dropbox, skype, virtualbox都和qt有关吧, 你想写个跨平台的C++程序, QT是个不错的选择, 普通PC应用 ...

  5. Django Model数据访问Making queries

    创建完Model之后, Django 自动为你提供一套数据库抽象层的API,利用它可以完成创建,提取,更新,删除对象的操作. 以下面的Model为例: class Blog(models.Model) ...

  6. [Android] 修改设备访问权限

    在硬件抽象层模块中,我们是调用open函数来打开对应的设备文件的.例如,在2.3.2小节中开发的硬件抽象层模块freg中,函数freg_device_open调用open函数来打开设备文件/dev/f ...

  7. 【Python Network】权威域名服务器级联查询

    如果PyDNS库,跳过本地名称服务器,直接向权威名称服务器查询.如baidu.com查询.com域名服务器,并从各个域名服务器中查询下一即域名,并输出相关信息. #! /usr/bin/env pyt ...

  8. Webform——验证控件

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

  9. c程序设计语言_习题1-13_统计输入中单词的长度,并且根据不同长度出现的次数绘制相应的直方图

    Write a program to print a histogram of the lengths of words in its input. It is easy to draw the hi ...

  10. hdu 4294 数学分析+搜索

    又要开始一段搜索的路程了. 最近看了这题,在网上看到一个结论,任何一个数倍数都能被不超过两个数字组成,假如一个数n个A%x=b,那么必然有m个A%=b那么此时n个A减去m个B就能够被x整除,那么此时就 ...