假設,當我們通過HTTP請求一個資源,我們得到的響應如下圖所示:瀏覽器如何知道哪個響應屬於哪個請求?
GET/HTTP/1.1
Host: www.google.co.in
HTTP/1.1 200 OK
Date: Thu, 20 Apr 2017 10:03:16 GMT
...
但是,當一個瀏覽器可以同時請求的資源,怎麼能確定哪個請求得到它的響應?
假設,當我們通過HTTP請求一個資源,我們得到的響應如下圖所示:瀏覽器如何知道哪個響應屬於哪個請求?
GET/HTTP/1.1
Host: www.google.co.in
HTTP/1.1 200 OK
Date: Thu, 20 Apr 2017 10:03:16 GMT
...
但是,當一個瀏覽器可以同時請求的資源,怎麼能確定哪個請求得到它的響應?
我想你真的在這裏要求HTTP Pipelining。這是HTTP/1.1中引入的一種技術,通過該技術,客戶端將按順序發送所有請求,並由服務器按照相同的順序進行響應。所有血淋淋的細節現在在RFC 7230, sec. 6.3.2。
HTTP/1.0已經(或有)一種可比較的方法,被稱爲Keep Alive。這將允許客戶在前一個回答後立即發出新的請求。這種方法的好處是客戶端和服務器不再需要通過另一個TCP握手協商新的請求/響應週期。
重要的部分是,在這兩種方法中,響應的順序與通過一個連接發出的請求的順序相匹配。因此,響應可以通過客戶端接收它們的順序唯一地映射到發出請求:第一個響應匹配,第一個請求,第二個響應匹配第二個請求,等等。
HTTP/1.1的流水線(依賴於KeepAlive)和HTTP/1.0之間的區別在於,在前者中,客戶端可以在獲取任何響應之前發出多個請求,但在HTTP/1.0中,客戶端必須等待響應發出新的請求。 – symcbean
@symcbean不需要。 HTTP/1.1的流水線不依賴Keep Alive,請參閱上面的鏈接。 HTTP只是假定連接保持打開狀態直到關閉。請求/響應順序:這幾乎是我寫的,不是嗎? – DaSourcerer
「不依賴Keep Alive」 - 我完全被這個困惑了。如何通過只允許單個請求和響應的通道發送多個請求? – symcbean
當瀏覽器一次請求多個資源時,如何識別哪個請求得到了哪個響應?
瀏覽器可以打開一個或多個連接到Web服務器以請求資源。對於每個這些連接的關於HTTP keep-alive規則是相同的,並且同時適用於HTTP 1.0和1.1:如果HTTP保持活動是關閉的,則該請求由客戶端發送,響應由所述發送
服務器,連接被關閉:
Connection 1: [Open][Request1][Response1][Close]
如果HTTP保持活動上,一個「老大難」的連接可以爲後續的請求被重用。該請求仍然發出連續在同一個連接,所以:
Connection 1: [Open][Request1][Response1][Request3][Response3][Close]
Connection 2: [Open][Request2][Response2][Request4][Response4][Close]
隨着HTTP Pipelining,與HTTP 1.1推出,如果啓用了(大多數瀏覽器是默認情況下禁用,因爲車的服務器) ,瀏覽器可以在不等待響應的情況下相互發出請求,但響應仍然按照請求的順序返回。
這可以在多個同時發生(永久)連接:
Connection 1: [Open][Request1][Request2][Response1][Response2][Close]
Connection 2: [Open][Request3][Request4][Response3][Response4][Close]
兩種方法(保持活動和流水線)仍然利用HTTP的默認的「請求 - 響應」機制:每個響應將按照同一連接上的請求順序到達。他們也有"head of line blocking" problem:如果[Response1]
緩慢和/或較大,它將阻止在該連接上進行的所有響應。
輸入HTTP 2多路複用:What is the difference between HTTP/1.1 pipelining and HTTP/2 multiplexing?。這裏,響應可以是分段的,允許一個單一的TCP連接來傳送混雜不同的請求和響應的片段:
Connection 1: [Open][Rq1][Rq2][Resp1P1][Resp2P1][Rep2P2][Resp1P2][Close]
它通過給每個片段的標識符這是否以指示哪個請求 - 響應對它屬於,所以接收者可以重構消息。
謝謝你的回答。很好的解釋 –
除了上面的解釋,考慮一個瀏覽器可以打開許多並行連接,通常最多6個到同一臺服務器。對於每個連接,它使用不同的套接字。對於每個套接字中的每個請求響應,很容易確定相關性。
它不需要「識別」,請求和響應自動「歸屬」在一起。 – CBroe
服務器是否連續響應,以便通知瀏覽器?這意味着HTTP中沒有優先級。 –
不,請求可以並行發生。客戶端只是打開多個連接,並在每個連接上發送一個HTTP請求,以便響應通過相同的連接到達。 http://blog.catchpoint.com/2010/09/17/anatomyhttp/解釋基礎知識。 – CBroe