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地址
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2015-04-04 JS中setTimeout()的使用方法具体解释
2015-04-04 程序猿接私活经验总结,来自csdn论坛语录
2015-04-04 工厂设计模式
2015-04-04 DropdownList绑定的两种方法
2015-04-04 python 调用图灵机器人api实现简单的人机交互