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

2023-11-03 09:00:16

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

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

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

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

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

結語

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

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