localtunnel.me 原理流程浅析
本文採用知识共享署名-同样方式共享
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 原理流程浅析的更多相关文章
- 玩转Windows服务系列——服务运行、停止流程浅析
通过研究Windows服务注册卸载的原理,感觉它并没有什么特别复杂的东西,Windows服务正在一步步退去它那神秘的面纱,至于是不是美女,大家可要睁大眼睛看清楚了. 接下来研究一下Windows服务的 ...
- 玩转Windows服务系列——服务运行、停止流程浅析
原文:玩转Windows服务系列——服务运行.停止流程浅析 通过研究Windows服务注册卸载的原理,感觉它并没有什么特别复杂的东西,Windows服务正在一步步退去它那神秘的面纱,至于是不是美女,大 ...
- 以太网驱动的流程浅析(一)-Ifconfig主要流程【原创】
以太网驱动的流程浅析(一)-Ifconfig主要流程 Author:张昺华 Email:920052390@qq.com Time:2019年3月23日星期六 此文也在我的个人公众号以及<Lin ...
- python写红包的原理流程包含random,lambda其中的使用和见简单介绍
Python写红包的原理流程 首先来说说要用到的知识点,第一个要说的是扩展包random,random模块一般用来生成一个随机数 今天要用到ramdom中unifrom的方法用于生成一个指定范围的随机 ...
- Android 4.4 Kitkat Phone工作流程浅析(六)__InCallActivity显示更新流程
本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. ...
- PHP容器--Pimple运行流程浅析
需要具备的知识点 闭包 闭包和匿名函数在PHP5.3.0中引入的. 闭包是指:创建时封装周围状态的函数.即使闭包所处的环境不存在了,闭包中封装的状态依然存在. 理论上,闭包和匿名函数是不同的概念.但是 ...
- OAuth2.0 原理流程及其单点登录和权限控制
2018年07月26日 07:21:58 kefeng-wang 阅读数:5468更多 所属专栏: Java微服务构架 版权声明:[自由转载-非商用-非衍生-保持署名]-转载请标明作者和出处. h ...
- Android 4.4 Kitkat Phone工作流程浅析(八)__Phone状态分析
本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象.与Google原生AOSP有些许差异.请读者知悉. ...
- Android 4.4 Kitkat Phone工作流程浅析(七)__来电(MT)响铃流程
本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. ...
随机推荐
- POJ3663
题意简单. 关键:记录每头牛的val值,每次寻找和某头牛匹配的牛时候,可以通过刚刚记录的值来计算. #include<stdio.h> #include<string.h> # ...
- explain 用法详解
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如: expla ...
- PieTTY
PieTTY 用 pietty 連上主機時 鍵盤右方數字鍵 (keypad) 失效的問題 用 pietty 連上主機時 鍵盤右方數字鍵 (keypad) 失效的問題 應該滿多人用 pietty 連上程 ...
- Android WebView 开发详解(二)
转载请注明出处 http://blog.csdn.net/typename/article/details/39495409 powered by miechal zhao 概览: Androi ...
- 编写 Objective-C 代码
如果您未曾开发过 iOS 或 Mac OS X 平台的程序,那就需要开始了解它们的首要程序设计语言 Objective-C.Objective-C 并不是一种很难的语言,如果能花一点时间学习,相信您会 ...
- 【DataStructure In Python】Python模拟二叉树
使用Python模拟二叉树的基本操作,感觉写起来很别扭.最近做编译的优化,觉得拓扑排序这种东西比较强多.近期刷ACM,发现STL不会用实在太伤了.决定花点儿时间学习一下STL.Boost其实也很强大. ...
- Binary to Text (ASCII) Conversion
Binary to Text (ASCII) Conversion Description: Write a function that takes in a binary string and re ...
- poj1988
知道了并查集写的问题后,我也明白了为什么之前这道题TLE的原因: 有这道题的合并操作不难想到用并查集维护: 由于并查集易于向上查询而不易于向下查询 所以对于询问方块x下面有多少个方块,我们可以转化为立 ...
- How to Customize Server Header using NginX headers-more module
http://wiki.nginx.org/HttpHeadersMoreModule#Version headers_more When you are browsing a website, yo ...
- [c#美味] Guid ToString 格式知多少?
在日常编程中,Guid是比较常用的,最常见的使用就是如下所示: string id = Guid.NewGuid().ToString(); 这条语句会生成一个新的Guid并转成字符串,如下: // ...