Http權威指南筆記(八)——網關、隧道、中繼

本章主要介紹網關、隧道、中繼。都是屬於通過HTTP訪問不同資源的實現方法。

1 網關

網關可以作爲某種翻譯器使用,它抽象出了一種能夠到達資源的方法。網關是資源和應用程序之間的粘合劑。
有些網關會自動將 HTTP 流量轉換爲其他協議,這樣 HTTP 客戶端無需瞭解其他協議,就可以與其他應用程序進行交互了,如下圖所示:
網關
一般來說,Web網關在一側使用HTTP協議,另一側使用其他協議,可以使用一個斜槓(/)來分割客戶端和服務端的協議,如下:

客戶端協議/服務端協議

我們用術語服務器端網關和客戶端網關來說明對話是在網關的哪一側進行的。

  • 服務器端網關:通過HTTP與客戶端進行對話,用其他協議與服務器進行對話
  • 客戶端網關:通過其他協議與客戶端進行對話,用HTTP協議與服務器進行對話

下面介紹常用的兩種網關——協議網關和資源網關

1.1 協議網關

協議網關就是如其名字所說,主要用於協議轉換的,比如將HTTP協議轉爲FTP協議進行文件資源獲取。常見的如下幾種:

  • 服務器端Web網關(HTTP/*):請求流入原始服務器時,服務器端 Web 網關會將客戶端 HTTP 請求轉換爲其他協議。如下圖,收到一個對FTP資源的HTTP請求的處理。
    Web服務端網關
  • 服務器端安全網關(HTTP/HTTPS):一個組織可以通過網關對所有的輸入 Web 請求加密,以提供額外的隱私和安全性保護。客戶端可以用普通的 HTTP 瀏覽 Web 內容,但網關會自動加密用戶的對話
  • 客戶端安全網關(HTTPS/HTTP):這些 HTTPS/HTTP 網關位於 Web 服務器之前,通常作爲不可見的攔截網關或反向代理使用。它們接收安全的 HTTPS 流量,對安全流進行解密,並向服務器發送HTTP請求。

1.2 資源網關

除了上面說的協議網關,常見的另一種網關是資源網關。該種網關是一種應用程序服務器,該網關同客戶端通過HTTP進行通信,同時服務器應用程序相連。如:
資源網關
兩個客戶端是通過 HTTP 連接到應用程序服務器的。但應用程序服務器並沒有回送文件,而是將請求通過一個網關應用編程接口(Application Programming Interface,API)發送給運行在服務器上的應用程序。
較早的一個應用程序網關API就是通用網關接口(Common Gateway Interface,CGI)。只是現在用的沒有那麼多了,現在大多數使用java語言實現的服務器使用Servlet技術較多。

2 隧道

說完網關,接着說我們第二個重要的概念呢,Web隧道(Web tunnel)。通過隧道也可以達到使用HTTP協議訪問非HTTP協議的應用程序。
Web 隧道允許用戶通過 HTTP 連接發送非 HTTP 流量,這樣就可以在 HTTP 上捎帶其他協議數據了。使用 Web 隧道最常見的原因就是要在 HTTP 連接中嵌入非 HTTP 流量,這樣,這類流量就可以穿過只允許 Web 流量通過的防火牆了。

2.1 建立隧道

可以通過用 HTTP 的 CONNECT 方法建立Web隧道。CONNECT 方法雖然不是 HTTP/1.1 核心規範的一部分,但是卻得到了廣泛的使用。CONNECT方法可以創建一條道任務服務器和端口的TCP連接,在建立起隧道後,隧道就會對服務器和客戶端之間的數據進行盲轉發。
CONNECT方法請求語法格式如下:
CONNECT home.netscape.com:443 HTTP/1.0
其和普通的HTTP方法差不多,只是將後面的URL替換成了一個主機名:端口號格式的數據。
CONNECT的響應也同HTTP普通方法差不多,建立成功則返回200的狀態碼,只是後面的message一般顯示爲“Connection Established”。
HTTP/1.0 200 Connection Established

一條隧道的建立的整個過程如下圖所示:
建立隧道

2.2 數據隧道和連接管理

隧道一旦建立起了,數據就可以在任意時間流向任意方向。隧道的兩端必須做好任意時間接收數據的準備,並且需要將數據立即轉發出去。因爲隧道僅僅是進行數據的轉發,對於數據之間的關係和順序不能做任何假設和干預,而且有可能轉發的數據之間存在有依賴關係,所以隧道不能忽略任何數據,而且要按照原順序做及時轉發,否則可能出現數據問題。如果數據的消費端出現數據消耗不足,就可能造成生成者這端的掛起。
爲了提高CONNECT的效率,作爲一種優化,允許客戶端在發送完CONNECT請求之後,收到響應之前,先進行隧道數據的發送,但是前提是網關要能正確處理這一數據。同時我們的客戶端在收到連接請求的響應如果不是200(但是不是一些致命錯誤),需要準備好重試的準備。

2.3 SSL隧道

SSL協議,其信息是加密的,雖然我們一般可以通過443端口直接進行SSL連接,但是無法通過傳統的有HTTP防火牆的代理服務器轉發。這個時候可以利用隧道通過一條 HTTP 連接來傳輸 SSL 流量,以穿過端口 80 的 HTTP 防火牆。
通過HTTP隧道建立SSL連接的過程如下:
SSL隧道
前面在介紹網關的時候,提到客戶端可以通過HTTP/HTTPS網關進行與服務器進行SSL會話,這裏我們還可以通過隧道的方式進行SSL會話。那這兩者有一定區別的:

  • HTTP/HTTPS網關:客戶端到網關之間的連接是普通的HTTP連接,所以這一段傳輸是不安全的,另外通過網關同服務器進行SSL認證的,所以我們的網關要支持完整的SSL。
  • SSL隧道:這種方實現,HTTP僅僅作爲傳輸了加密數據的作用,中間的代理無需實現SSL,只要轉發數據即可,同時SSL會話是建立在客戶端和服務器端之間的,所以整個會話的過程也更加安全。
    實際使用過程中,我們是可以將兩者結合起來使用的,可以對客戶端建立隧道的請求進行認證。這樣可以避免客戶端亂用隧道的情況,如下:
    隧道和認證

3 中繼

HTTP 中繼(relay)是沒有完全遵循 HTTP 規範的簡單 HTTP 代理。中繼負責處理 HTTP 中建立連接的部分,然後對字節進行盲轉發。
所以中繼的優點是實現簡單,當我們只是提供一個簡單的過濾、診斷或內容轉換功能的代理的時候,可以考慮使用中繼。但是由於其盲轉發的特性,所以會引起很多互操作性的問題(如Connection首部等)。這個問題,在之前介紹代理的時候,已經說過了,這裏就不再贅述了。

這篇內容不多,相當於是對前面代理中的一些特殊代理提取出來進行一個簡單的介紹。但是本篇介紹的東西,在實際開發中遇到的不多,理解不是很清楚,透徹,所以可能語言組織和描述上有很多問題,甚至有錯誤的描述,還請諒解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章