2013-06-25 20 views
5

我想了解什麼是HTTP管道和HTTP保持連接,並試圖建立這兩個主題和服務器發送事件技術之間的連接。HTTP:流水線,保持活動和服務器發送事件之間的關係是什麼?

據我瞭解, HTTP保持活動連接是在HTTP默認使用TCP的1.1方式時,一旦建立TCP連接用於發送幾個HTTP請求一個接一個。 HTTP流水線是客戶端向服務器發送請求的能力,而對先前請求的響應尚未使用相同的TCP連接接收,通常不用作瀏覽器的默認方式。

我的問題:

1)是否有可能一個使用一個TCP連接後幾個請求發送到服務器的一個 - 如何在客戶端的響應區分?我猜客戶端使用FIFO發送服務器響應的順序?

2)爲什麼非冪等請求,如POST請求不應該流水線(根據維基百科)?

3)web服務器的侷限性是什麼:可能的開放式TCP連接數是否有限?如果是的話,那麼如果一些客戶端持有保持連接狀態,其他客戶端不能建立連接,這可能會導致問題,對吧?

4)服務器發送的事件正在使用保持連接,但據我所知,SSE沒有使用流水線。相反,他們設法處理對一個請求的多個響應,或者可能只是在下一個響應事件到達時才發送另一個請求。哪個猜測是正確的?

5)一個TCP連接意味着一個套接字?一個套接字是指一個TCP連接?關閉/打開套接字是指關閉/打開TCP連接?

回答

4
  1. 是的,FIFO。 TCP/IP保證按順序發送數據,因此響應無法以不同的順序到達(如果服務器/代理服務器出問題並以錯誤的順序發送響應,則完全無法使用)。

  2. 我不記得任何HTTP規範的任何理由。這可能只是謹慎,因爲流水線在某些代理/服務器上執行得不好。

  3. HTTP規範建議每個服務器有2個連接,瀏覽器每個服務器有6-8個連接,但沒有固定的限制。缺少連接是Apache的一個實際問題,對於高負載情況,建議在Apache中禁用KeepAlive並使用代理(例如HAProxy),它可以便宜地爲客戶端提供Keep-Alive功能。
    代理的好處是一個代理可以分發連接到多個服務器(有助於擴展),或者可以修改流量(例如,即使服務器端軟件沒有,gzip也會壓縮一切)。

  4. SSE不依賴Keep-Alive。它沒有使用多個響應。這是一個永遠需要「下載」的單一響應,所以流水線或保持活動與SSE無關。在發送SSE響應時,TCP/IP連接無法返回任何更多響應。
    只要連接處於打開狀態,SSE就會使服務器保持忙碌狀態(對於每個用戶而言,通常都是這樣)。這就是爲什麼最好使用SSE和Node.js/Tornado,它們可以處理數十萬個連接,而不是一次爲少數連接設計的PHP/Apache。

  5. 套接字是用於TCP/IP連接的編程接口。通常是的,一個套接字是一個連接。

+0

Thanks porneL! 1)但是,如果某些迴應與發送的訂單相關的錯誤順序到達了怎麼辦? 3)使用代理的好處是什麼?它必須與服務器建立相同的連接? 4)所以使用SSE意味着+1連接,從而提高服務器負載? – KutaBeach

+0

@KutaBeach我已經擴展了我的答案 – Kornel

相關問題