自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

基于 HTTP/2 的 WEB 內(nèi)網(wǎng)穿透實現(xiàn)

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
HTTP/2 引入了二進制分幀層,將 HTTP/1.1 中的請求和響應(yīng)拆成顆粒度更細的幀(frame),從而實現(xiàn)了優(yōu)先級、流量控制和 Server Push 等功能;HTTP/2 在單條 TCP 連接上可以打開多個流,從而實現(xiàn)了多路復(fù)用;HTTP/2 使用靜態(tài)字典、動態(tài)字典以及哈夫曼編碼,對請求 / 響應(yīng)頭部進行壓縮。總之,HTTP/2 從協(xié)議層面解決了 HTTP/1.1 的諸多問題。

HTTP/2 引入了二進制分幀層,將 HTTP/1.1 中的請求和響應(yīng)拆成顆粒度更細的幀(frame),從而實現(xiàn)了優(yōu)先級、流量控制和 Server Push 等功能;HTTP/2 在單條 TCP 連接上可以打開多個流,從而實現(xiàn)了多路復(fù)用;HTTP/2 使用靜態(tài)字典、動態(tài)字典以及哈夫曼編碼,對請求 / 響應(yīng)頭部進行壓縮??傊?,HTTP/2 從協(xié)議層面解決了 HTTP/1.1 的諸多問題。

在我之前寫的文章里,我介紹了如何通過 ngrok 讓內(nèi)網(wǎng) WEB 在其它網(wǎng)絡(luò)環(huán)境中能夠被訪問。本文要實現(xiàn)的服務(wù)與 ngrok 類似,我把它稱之為 Pangolin,中文是穿山甲的意思(名字來自于同事的類似項目,在此表示感謝)。Pangolin 客戶端和服務(wù)端之間的報文轉(zhuǎn)發(fā),是用 node-http2 這個 Node.js 模塊提供的 HTTP/2 服務(wù)來實現(xiàn)的。

Pangolin 的需求來自于本博客用戶評論(via)。實際上,能實現(xiàn)類似功能的軟件很多,有使用私有協(xié)議進行轉(zhuǎn)發(fā)的,有使用 WebSocket 進行轉(zhuǎn)發(fā)的。而我認為 HTTP/2 應(yīng)該是個不錯的選擇,打算試一下。最終我花了一個小時實現(xiàn)了一個初步能用的版本,除開 node-http2,全部代碼不超過 200 行。代碼我放在了 github 上,有興趣的同學(xué)可以玩一下。

下面簡單介紹它的原理,我畫了一張草圖:

 基于 HTTP/2 的 WEB 內(nèi)網(wǎng)穿透實現(xiàn)

最左側(cè)是最終用來訪問服務(wù)的瀏覽器,它可能位于公網(wǎng),也可能位于其它內(nèi)網(wǎng);最右側(cè)是實際提供 WEB 服務(wù)的 HTTP Server,它位于內(nèi)網(wǎng)。顯然,左側(cè)瀏覽器沒辦法直接訪問右側(cè) WEB 服務(wù),只能借助公網(wǎng)節(jié)點作為橋梁。中間的 pangolin 服務(wù)端運行在公網(wǎng)節(jié)點上;Pangolin 客戶端運行在與 WEB 服務(wù)同臺機器或者同一網(wǎng)段內(nèi)。

瀏覽器發(fā)起請求后,請求報文沿著綠色箭頭從左到右流動,每個節(jié)點都相當(dāng)于左側(cè)相鄰節(jié)點的 HTTP Server。***的問題出現(xiàn)在 Pangolin 服務(wù)端和客戶端之間:客戶端位于內(nèi)網(wǎng),正常情況下 Pangolin 服務(wù)端連不上客戶端提供的 HTTP Server。

這個問題我用了一個取巧的辦法解決:由于 Pangolin 服務(wù)端有公網(wǎng) IP,可以開啟 TCP Server,客戶端可以通過 IP 和約定的端口與服務(wù)端建立 TCP 連接。那么只要稍微改造一下 node-http2 的代碼,使它可以基于指定 socket 創(chuàng)建 HTTP/2 Server、發(fā)送 HTTP/2 Request,就可以打通所有節(jié)點了。這個問題解決后,左側(cè)的請求可以順利到達右側(cè),響應(yīng)數(shù)據(jù)也可以沿著之前的連接逐級返回。

Pangolin 服務(wù)端和客戶端內(nèi)部之間使用 HTTP/2,可以大幅提高性能,降低程序復(fù)雜性;對外使用 HTTP/1.1,保證了與已有系統(tǒng)的兼容性。

為了實現(xiàn)內(nèi)網(wǎng)穿透,Pangolin 需要做以下準(zhǔn)備工作:

Pangolin 服務(wù)端開啟 TCP Server;

Pangolin 客戶端啟動 TCP Client,與 Pangolin 服務(wù)端連接,得到 socket 長連接;

Pangolin 客戶端基于這個 socket 連接,開啟 HTTP/2 Server;

Pangolin 服務(wù)端開啟 HTTP/1.1 Server,等待瀏覽器來訪問;

實際的數(shù)據(jù)傳輸流程如下:

瀏覽器向 Pangolin 服務(wù)端發(fā)起請求(HTTP/1.1);

Pangolin 服務(wù)端基于已有 socket,向 Pangolin 客戶端發(fā)起請求(HTTP/2);

Pangolin 客戶端向內(nèi)網(wǎng) WEB 服務(wù)發(fā)起請求,得到響應(yīng)(HTTP/1.1);

Pangolin 客戶端基于已有 socket,將響應(yīng)返回給 Pangolin 服務(wù)端(HTTP/2);

Pangolin 服務(wù)端將響應(yīng)返回給瀏覽器(HTTP/1.1);

由于 Pangolin 客戶端采用了 HTTP 轉(zhuǎn)發(fā),而不是 TCP 隧道,所以可以輕松實現(xiàn) ngrok 那樣的管理界面,用來查看完整的 Request/Response 信息。目前我還只是簡單地打印了請求日志。

HTTP/2 協(xié)議本身并沒有規(guī)定它必須基于 TLS 部署,沒有安全層的 HTTP/2 被稱之為 h2c(HTTP/2 Cleartext)。目前來看,所有瀏覽器都不打算支持 h2c。但如果一個系統(tǒng)的某些環(huán)節(jié)對安全沒有那么高的要求,或者已經(jīng)通過了其它方案確保了安全,部署 h2c 也是一個非常好的選擇?,F(xiàn)在很多 HTTP/2 工具和類庫同時支持 h2 和 h2c,node-http2 也是如此。

實際上,我為了測試方便,在實現(xiàn) pangolin 時也選擇了 h2c。通過 Wireshark 抓包可以看出,HTTP/2 層下面直接就是 TCP 層:

 基于 HTTP/2 的 WEB 內(nèi)網(wǎng)穿透實現(xiàn)

責(zé)任編輯:何妍 來源: Jerry Qu的小站
相關(guān)推薦

2024-04-30 09:10:55

HTTP2TCP內(nèi)網(wǎng)

2020-10-15 08:52:36

Frp內(nèi)網(wǎng)Web

2020-10-13 14:03:50

搭建ngrok服務(wù)

2020-09-03 08:03:52

內(nèi)網(wǎng)穿透

2024-11-25 16:25:23

內(nèi)網(wǎng)穿透網(wǎng)絡(luò)協(xié)議

2024-10-12 20:56:19

ProxyChain

2025-02-25 10:56:32

內(nèi)網(wǎng)穿透開源桌面應(yīng)用程序

2019-06-12 09:02:20

2022-09-19 13:11:56

命令SSH內(nèi)網(wǎng)穿透

2019-02-28 08:44:19

內(nèi)網(wǎng)釘釘Web

2021-10-27 20:40:24

辦公

2021-11-02 10:40:51

內(nèi)網(wǎng)穿透代理工具Linux

2015-09-15 10:40:26

HTTP2 WEB 性能優(yōu)化

2015-09-15 10:46:29

2024-03-13 08:03:02

2015-09-15 10:54:54

HTTP2 WEB 性能優(yōu)化

2013-04-22 10:07:08

2025-04-29 10:28:25

2022-02-17 13:46:15

SSH命令內(nèi)網(wǎng)

2023-11-29 10:16:45

內(nèi)網(wǎng)開源
點贊
收藏

51CTO技術(shù)棧公眾號