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

問蒙服務框架發表於2023-11-03

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

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

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

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

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

結語

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

點選 [關注][在看][點贊] 是對作者最大的支援

相關文章