2009-08-10 150 views
1

我正在嘗試使用與Web瀏覽器使用的技術類似的技術來實現HTTP隧道,以模擬使用Netty框架的Java中的全雙工連接。我希望以這樣一種方式實現它,它將在現實世界的HTTP代理存在的情況下工作。我試圖在不使用servlet容器的情況下執行此操作,以避免庫依賴性方面的不必要開銷,並且因爲servlet API不適合全雙工http隧道的使用模式。HTTP代理連接共享

我所知道的一些限制,即HTTP代理強加「破發」的HTTP協議的一些潛在的用途:

  1. HTTP流水線可能不會超越客戶端與代理之間的連接兌現。即代理可以在發送下一個請求之前發送單個請求並等待響應,即使客戶端已經向代理髮送了多個流水線請求。
  2. 除了以類似方式代理之間的連接之外,分塊編碼可能無法兌現:服務器可能以塊的形式發回響應,但代理可能會在將完整的,經過分解的響應分發給客戶端之前等待結束塊。
  3. HTTP CONNECT通常僅被允許用於SSL/TLS端口,通常只有端口443,因此這不能用作偷偷摸摸的方式來獲得與外界無約束的TCP連接。

但是還有一種額外的可能性,我不確定:現實世界中的HTTP代理是否也在多個客戶端之間共享一個服務器的持久連接?例如:

  • 客戶端A發送請求A1,A2和A3設置爲服務器X
  • 客戶端B發送請求B1和B2到服務器X
  • 客戶端C發送請求C1,C2和C3到服務器X

請問代理然後可能打開到服務器X的單個連接,並在順序發送消息:

A1,A2,B1,C1,B2,A3,C2,C3

或類似的順序,保留每個客戶端的排序,但可能交錯?或者更糟的是,可能到服務器並散佈消息代理打開多個連接與連接之間的每個客戶端,即

Connection 1: A1, C1, C2, C3 
Connection 2: B1, B2, A2, A3 

如果是這樣,我的方法需要更多的思考,我可能需要去複用這些信息分成不同的隊列對於每個隧道而言,並不能簡單地依賴於將連接識別爲用於特定客戶端。

有誰知道任何描述常用HTTP代理和狀態檢查防火牆的怪癖的好資源嗎?

回答

1

HTTP 1.1 spec包含此段落8.1.4現實思考:使用永久連接的應該限制他們維持到給定服務器的併發連接數

客戶。單用戶客戶端不應與任何服務器或代理保持2個以上的連接。代理應該使用最多2 * N個連接到另一臺服務器或代理,其中N是同時活動用戶的數量。這些準則旨在改進HTTP響應時間並避免擁塞。

雖然我不知道真實世界的代理實現如何處理這個需求。

也許你會在Caching Tutorial中發現一些東西,即使它只是有用的鏈接。最終的行動可能是發送郵件給Mark Nottingham([email protected])。如果他不知道,沒有人會這樣做。

0

我知道NetScaler可以配置爲在它和服務器之間使用keepalive,而不管客戶端上的keepalive設置如何。