wmproxy

wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子

项目地址

国内: https://gitee.com/tickbh/wmproxy

github: https://github.com/tickbh/wmproxy

数据包的自白

我是一个小小的数据包,今天我将跟着大部步出发,去体验传说中的HTTP之旅,听前辈说那是一场精彩绝伦的出走之旅。

旅行准备

  首先,我先来到了出发地,他们在整理各项目数据,包括选择公交(HTTP1)还是自驾(HTTP2)或者询问是否有私家车(H2C),然后目的地是哪个房间(Path),是否防止旁边的人窥探(TLS),选择轻装上阵还是带上行李箱(GET或POST等),还有其它杂七杂八的事情(是否支持压缩,数据长度等)。

  我问:“导游,我们什么时候可以出发”。

  导游答:“别急,这躺路我熟的很,这次的数据有点重要,正在向对方获取加密信息,这是防止偷窥的秘诀。万一在中途被截走,那会使我们损失惨重。”

  过了一会,我又问:“现在可以出发了吗?”

  导游答:“可以了,我们通过交换已经将约定的加密信号确定下来了,让我先给你做个加工。”

  我就跟着导游来到了一个加工场,进入其中,任由它来操作,当我走出加工场的时候,我突然发现我的模样完全跟变了个人似的。我差点认不出我自己。

  我们就来到了公交站台(浏览器),他看到我们的到来,快速的帮我们排上了班次,紧接着,我们跟着车一直的往前走,我东看看西瞧瞧,我有看到像我一样乔装的自己都认不出来的,也看到了没有经过打扮的,都可以看的一清二楚,我猜那一定不怕别人窥探的吧(没用TLS)。

旅行中转

突然公交车停了下来,播报着:“欢迎来到wmproxy”。

  我有点疑惑的问导游:“我记得我们的目的地不是这里,为什么在这里停下来?”。

  身经百战的导游对我说:“看来我们的目的地被隐藏起来了,用来更好的保护目的地家园不被破坏,只有通过这里中转走专属的路线才能到达目的地。”

  接着我急着问:“那我们在这里要做啥吖?”

  导游回答:“接下来我们走的就是私人的领域了,我们路上看到的都是主人的朋友,并不会把我们的秘密泄漏出去,所以我们需要把我们身上打扮的乱七八糟的还原。”

  我就跟随着来到了加工场,加工场把我们身上乱七八糟的装扮通过特定的方法进行了还原(卸掉TLS转HTTP),走出加工场,我又看到帅气的自己。我问:“那么接下来我们做什么?”

  导游回答:“根据我们原来的信息,他现在要安排我们做私家车(HTTP2),好灵活地做响应,你看,那车已经来了,我们一起上车吧。”

  我们坐上了私家车,我发现我带的东西被切割成了奇奇怪怪的几个部分。我就问司机:“为什么原来我就一个整体,现在变成了奇怪的几个部分?”

  司机笑着回答:“在这车里,通常副驾驶上坐着Header,也就是你带着的那些属性全都组装在这里了,后排通常就是额外的数据包,当然你们数据包兄弟可能会很多,你看看你的手臂上,跟着相同导游的此刻都被挂上了红色的布。”

  我才发现,原来刚在加工场的时候还帮我和导游都做上了特殊的标记了吖,而且我还发现,每个人头上还顶着一个特殊的帽子。包括了颜色,还有一串特殊的数字。看起来附带了我身高体重(实际长度)这些信息。

旅行到达

私家车停在了一个漂亮的房间前面,我想这是旅程的目地吧。

此时我终于知道我这躺的任务了,原来我需要来这里获得一个重要的文件,这文件数据量还大的有点夸张,是我来时数据的上万倍(Content-Length)。

  这时候我有点慌乱的找到导游:“这要带的数据那么多,那么重要,我怎么样才能把他们安全的带回去吖。”

  导游这时候就说:“你还记得我们开始带的工具包列表(Accept-Encoding)吗?”

  我说:“记得记得,当时好像把名字记下来了,好像是说家里有真空机(gzip),压缩机(brotli)吧?”

  导游答:“对的对的,你看到那边的那座大山(gzip)吧,等下我们会带着数据兄弟们爬上那大山,到时候我们就可以瘦很多,那样子接下来我们动用的资源会小很多。”

  我们带着浩浩荡荡的数据大军去爬了山,我确实发现我们的个头都小了许多,但是我觉得这大军的数量远远没有一开始说的上万倍。

  我问:“这大军的数量不对吖,不会有兄弟们迷路了吧?”

  导游笑着回答:“这边的房子就这么大,如果把数据一下子从异次元全部召唤出来(文件中读取)那不直接把这小小的房子全部挤满了吖,看到上面那个指示牌了没有?”

  只见指示牌上面写着:“当前房间可容纳人数4096/4096”,此时前面有100个兄弟走出了房间就变成了,3996/4096,然后又看到异次元召唤出了新的100个兄弟。

  此时我晃然大悟:“原来这东西就是控制着不会膨胀的秘密吖(内存缓冲区已满)。”

旅行返程

当我们瘦完身后,就有一辆辆的小汽车来接我们回家了

  此时一辆辆汽车大军稳稳的向前行驶,突然间速度慢了下来,我就很好奇的问司机:“刚刚不是速度很快的吗,怎么到这个地方突然间速度就慢下来了吖?”

  司机指了指前面说:“前面是一段较窄的路,你看看两边的车流,如果全速全进的话,大家都会堵死在这段路上,所以你看上方,有个牌子100辆/分钟,也就是一分钟只能通过100辆,要不然就会挤到前面的窄路上,所以我们现在速度是慢了下来,但是我们这条线路还是可以每分钟可以通过100辆,也不算慢。”

  于是我就往两边看,两边的车也都是差不多的速度在通行,慢慢的我们来到了比较狭窄的路,确实这里无法通行通行太多的车(从内网转入公网,传输能力下降),我想:“高负载的情况下确实只能通过这种方式来限制,要不然此刻交通应该瘫痪掉了吧,大家越急着挤,越没法正常通行。”

  紧接着,我们又回到了中转站了,我突然很好奇的想着:“要是我们兄弟全部挤到中转站这里,他会不会直接被挤满了?”

  这时我听到导游说:“别发呆了,公交车来了,我们该出发了。”

  我顿时有点迷惑:“我们后面不是还有很多兄弟吗?不用等他们集合完再出发吗?”

  导游就笑着说:“如果全部集合在出发,那我们就得停下来等,然后启动的时候后面的兄弟又得等前面的走完才能走,这样子速度就慢了很多,这是其一。另外,你看这中转台上也容不下这么多的兄弟同时停留在这里,他根据我们帽子的颜色帮我们分好了公交车啦,上车!”(此时代理只处理了头部数据,body数据只做简单的转发)

  我突然想到我们现在来到了公共区域,我问导游:“我们是不是得保证我们的数据安全,现在我们都是属于公共区域了。”

  导游回过神来说,对对我们先去加工厂处理下,那个是我们的专属加工场。还好你提醒,要不然数据就不安全了。(TLS加密)

  我们从加工厂出来乘上公交车,一路平稳的来到了出发的站台(浏览器),这时候我们一个个从加厂场出来(TLS解密),我们的兄弟有点多,浏览器的站台有点放不下了,我就问:“我们不是到达了目的地了吗?他怎么不还来接我们到目的地?”

  导游笑着说:“此次我们带回来的信息量有点大,而且还是经过了瘦身的,我们等下去那个标gzip的房间进行处理,然后你看那边有个异次元空间(临时文件),我们先到那里下,好让后来的兄弟有地方住。”

  我跟着来到了异次元空间,里面是一个空旷,超大的空间,我们这么多兄弟秩序井然的排列在一起,直到最后一个兄弟到达,我们就看到了前面有一个出口,我就问:“从那个出口出去我们就完成任务了吗?”

  导游就回答:“从那个出口,不要乱,现在兄弟都到了,知道大家各自的位置,就不会乱套了,大家排队往前走,不要乱。”

  当我们一个个出来后,慢慢的把身子还原回来,我看着自己变成了一个巨大的人,很完整的,帅气的,我想我应该完成了这一项任务了吧。

此时浏览器播报,数据传输完成,完整无误,任务完成,进行展示。

结语

这是数据的一趟历险记,也是互联网上每天都在发生的,他快速稳定的传播,给我们构建了一个美好的世界。

点击 [关注][在看][点赞] 是对作者最大的支持

22. 从零用Rust编写正反向代理,一个数据包的神奇HTTP历险记!的更多相关文章

  1. bloom-server 基于 rust 编写的 rest api cache 中间件

    bloom-server 基于 rust 编写的 rest api cache 中间件,他位于lb 与api worker 之间,使用redis 作为缓存内容存储, 我们需要做的就是配置proxy,同 ...

  2. 正反向代理、负载均衡、Nginx配置实现

    一.正反向代理 1.前提 我们曾经使用翻墙软件,访问google:使用了代理软件时,需要在浏览器选项中配置代理的地址,我们仅仅有代理这个概念,并不清楚代理还有正向和反向之分. 2.正向代理(代替客户端 ...

  3. 编写你的第一个 Django 程序 第1部分

    原地址:http://django-chinese-docs.readthedocs.org/en/latest/intro/tutorial01.html 让我们通过例子来学习. 在本教程中,我们将 ...

  4. Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程

    Android For JNI(六)--交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程 终于回到我们的 android了,我们先要配置这个NDK的环境,但是之前,我们还要了解一下基本的术 ...

  5. Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序

    Android For JNI(一)--JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序 当你的Android之旅一步步的深入的时候,你其实会发现,很多东西都必须去和framew ...

  6. 编写程序,输入一个N,返回角谷变换(达到1所需)的次数

    import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/6 17:36 * @description ...

  7. Django 2.0.1 官方文档翻译:编写你的第一个djang补丁(page 15)

    编写你的第一个djang补丁(page 15) 介绍 有兴趣为社区做一些贡献?可能你发现了django中的一个你想修复的bug,或者你你想添加一个小小的功能. 回馈django就是解决你遇到的问题的最 ...

  8. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第一部分(Page 6)

    编写你的第一个 Django app,第一部分(Page 6)转载请注明链接地址 Django 2.0.1 官方文档翻译: Django 2.0.1.dev20171223092829 documen ...

  9. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第七部分(Page 12)

    编写你的第一个 Django app,第七部分(Page 12)转载请注明链接地址 本节教程承接第六部分(page 11)的教程.我们继续开发 web-poll应用,并专注于自定义django的自动生 ...

  10. Django 2.0.1 官方文档翻译:编写你的第一个 Django app,第六部分(Page 11)

    编写你的第一个 Django app,第六部分(Page 11)转载请注明链接地址 本教程上接前面第五部分的教程.我们构建了一个经过测试的 web-poll应用,现在我们会添加一个样式表和一张图片. ...

随机推荐

  1. MiniNK WEB 选拔题 by F12

    Start 除了梦想外一无所有的我们,将会和蔑视与困境做最后的斗争,这是最后一舞 N0wayBack 联合战队成立以来一直致力于信息安全技术的研究,作为联合战队活跃在各大 CTF (信息安全竞赛)赛事 ...

  2. iptables简要介绍及使用iptables实践NAT技术

    简介 iptables的文章多如牛毛,但是,我读了一些,发现虽然成体系,但是不便理解,今天就结合自己的理解,好好讲解下,另外,我们也会使用iptables来实验一个nat地址转换的demo,nat转换 ...

  3. web系统字典统一中文翻译问题

    几乎每个web系统都离不开各种状态码.订单新建,待支付,未支付,已支付,待发货. 消息已读未读,任务待标记待审批已审批待流转已完成未完成.等等. 复杂一点的,会有多级状态码. 状态码超出3个的,一般都 ...

  4. React报错:Module not found: Error: Can't resolve 'react-router-dom'

    解决方案 npm install -S react-router-dom@5 参考链接 https://stackoverflow.com/questions/53914013/failed-to-c ...

  5. 【go笔记】标准库-strconv

    前言 标准库strconv提供了字符串类型与其他常用数据类型之间的转换. strconv.FormatX()用于X类型转字符串,如strconv.FormatFloat()用于浮点型转字符串. str ...

  6. 二代水务系统架构设计分享——DDD+个性化

    系统要求 C/S架构的单体桌面应用,可以满足客户个性化需求,易于升级和维护.相比于一代Winform,界面要求美观,控件丰富可定制. 解决方案 依托.Net6开发平台,采用模块化思想设计(即分而治之的 ...

  7. VMware虚拟机的安装与配置

    一.VMware简介 VMware Workstation Pro 是业界标准的桌面 Hypervisor,用于在 Linux 或 Windows PC 上运行虚拟机. Workstation 16 ...

  8. 【技术实战】Vue功能样式实战【七】

    需求实战一 样式展示 代码展示 <template> <transition name="fade-in" appear> <ARow v-if=&q ...

  9. uniapp封装接口

    1 为什么需要封装接口 封装接口是为了提高开发效率.增加代码复用性和提升可维护性.下面对这些原因进行详细解释: 1.1 开发效率 开发效率:减少代码量,简化调用过程 通过封装接口,可以将一些常见的操作 ...

  10. [ABC284F] ABCBAC

    2023-01-09 题目 题目传送门 翻译 翻译 难度&重要性(1~10):2.5 题目来源 AtCoder 题目算法 Z函数,KMP,字符串Hash 解题思路 对于一个 \(f_S\),我 ...