22. 從零用Rust編寫正反向代理,一個數據包的神奇HTTP歷險記!

来源:https://www.cnblogs.com/wmproxy/archive/2023/11/03/17806808.html
-Advertisement-
Play Games

一個數據包在HTP的旅游中的暢游之旅,帶你瞭解HTTPS/HTTP2,及反向代理處理,經歷壓縮限流等奇特的歷險記。 ...


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的房間進行處理,然後你看那邊有個異次元空間(臨時文件),我們先到那裡下,好讓後來的兄弟有地方住。”

  我跟著來到了異次元空間,裡面是一個空曠,超大的空間,我們這麼多兄弟秩序井然的排列在一起,直到最後一個兄弟到達,我們就看到了前面有一個出口,我就問:“從那個出口出去我們就完成任務了嗎?”

  導游就回答:“從那個出口,不要亂,現在兄弟都到了,知道大家各自的位置,就不會亂套了,大家排隊往前走,不要亂。”

  當我們一個個出來後,慢慢的把身子還原回來,我看著自己變成了一個巨大的人,很完整的,帥氣的,我想我應該完成了這一項任務了吧。

此時瀏覽器播報,數據傳輸完成,完整無誤,任務完成,進行展示。

結語

這是數據的一趟歷險記,也是互聯網上每天都在發生的,他快速穩定的傳播,給我們構建了一個美好的世界。

點擊 [關註][在看][點贊] 是對作者最大的支持


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 早在Java7的時候就被提出,但由於其複雜性,不斷跳票,直到Java9才有,那麼Java模塊化到底是什麼,在實際開發中又有什麼用呢? ...
  • 之前對接支付寶商家扣款的時候,在簽約協議的部分卡了很久,今天把之前遇到的簽約問題彙總記錄一下~ 協議簽約流程 首先幫大家捋一下簽約的順序,便於直觀理解: 其次還需要知道的是,支付寶的商家扣款的簽約介面有兩個: 一個是單獨簽約介面: 另一個是支付並簽約介面: 這兩個介面都可以簽約,主要區別在於簽約的時 ...
  • HashMap簡介 HashMap是Java語言中的一種集合類,它實現了Map介面,用於存儲Key-Value對。它基於哈希表數據結構,通過計算Key的哈希值來快速定位Value的位置,從而實現高效的插入、刪除和查找操作。下麵我們對照著JAVA1.8中的HashMap源碼來分析一下它的內部實現邏輯 ...
  • 在Go編程語言中處理數據時,經常會遇到數組和切片。這兩者是不同的數據結構,有各自的特性和用途。本文將對Go中的數組和切片進行比較,以幫助大家更好地理解它們。 1. 長度不同 一個主要的區別是長度。在Go中,數組是具有固定長度的數據結構,一旦創建,其大小不可更改。相比之下,切片具有動態大小,可以在運行 ...
  • 集合類不安全 List不安全 單線程情況下集合類和很多其他的類都是安全的,因為同一時間只有一個線程在對他們進行修改,但是如果是多線程情況下,那麼集合類就不一定是安全的,可能會出現一條線程正在修改的同時另一條線程啟動來對這個集合進行修改,這種情況下就會導致發生併發修改異常(在jdk11的環境下多次測試 ...
  • Spring Boot 是一種廣泛使用且非常流行的企業級高性能框架。以下是一些最佳實踐和一些技巧,我們可以使用它們來改進 Spring Boot 應用程式並使其更加高效。這篇文章會有點長,完整讀完文章需要一些時間。 1.正確的包目錄風格 正確的包目錄將有助於輕鬆理解代碼和應用程式的流程。 我們可以使 ...
  • 傅里葉變換是一種數學變換,它可以將一個函數或信號轉換為另一個函數或信號,它可以將時域信號轉換為頻域信號,也可以將頻域信號轉換為時域信號。在很多的領域都有廣泛的應用,例如信號處理、通信、圖像處理、電腦科學、物理學、生物學等。 它最大的功能是能夠分析和提取信號的特征,將複雜的信號分解為簡單的信號。有人 ...
  • 一、前言 在現代軟體開發中,事務處理是必不可少的一部分。當多個操作需要作為一個整體來執行時,事務可以確保數據的完整性和一致性,並避免出現異常和錯誤情況。在SpringBoot框架中,我們可以使用聲明式事務和編程式事務來管理事務處理。其中事務的坑也是不少,比較常見的就是事務失效,大家可以看看!後面小編 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...