HTTP協議建立連接的方式

HTTP支持2中建立連接的方式:非持久連接和持久連接(HTTP1.1默認的連接方式爲持久連接) 

1) 非持久連接

       讓我們查看一下非持久連接情況下從服務器到客戶傳送一個Web頁面的步驟。假設該貝面由1個基本HTML文件和10個JPEG圖像構成,而且所有這些對象都存放在同一臺服務器主機中。再假設該基本HTML文件的URL爲:gpcuster.cnblogs.com/index.html。

下面是具體步騾:

1.HTTP客戶初始化一個與服務器主機gpcuster.cnblogs.com中的HTTP服務器的TCP連接。HTTP服務器使用默認端口號80監聽來自HTTP客戶的連接建立請求。

2.HTTP客戶經由與TCP連接相關聯的本地套接字發出—個HTTP請求消息。這個消息中包含路徑名/somepath/index.html。 

3.HTTP服務器經由與TCP連接相關聯的本地套接字接收這個請求消息,再從服務器主機的內存或硬盤中取出對象/somepath/index.html,經由同一個套接字發出包含該對象的響應消息。

4.HTTP服務器告知TCP關閉這個TCP連接(不過TCP要到客戶收到剛纔這個響應消息之後纔會真正終止這個連接)。 

5.HTTP客戶經由同一個套接字接收這個響應消息。TCP連接隨後終止。該消息標明所封裝的對象是一個HTML文件。客戶從中取出這個文件,加以分析後發現其中有10個JPEG對象的引用。

6.給每一個引用到的JPEG對象重複步騾1-4。 

上述步驟之所以稱爲使用非持久連接,原因是每次服務器發出一個對象後,相應的TCP連接就被關閉,也就是說每個連接都沒有持續到可用於傳送其他對象。每個TCP連接只用於傳輸一個請求消息和一個響應消息。就上述例子而言,用戶每請求一次那個web頁面,就產生11個TCP連接。 

 

2) 持久連接

非持久連接有些缺點。

首先,客戶得爲每個待請求的對象建立並維護一個新的連接。對於每個這樣的連接,TCP得在客戶端和服務器端分配TCP緩衝區,並維持TCP變量。對於有可能同時爲來自數百個不同客戶的請求提供服務的web服務器來說,這會嚴重增加其負擔。

其次,如前所述,每個對象都有2RTT的響應延長——一個RTT用於建立TCP連接,另—個RTT用於請求和接收對象。

最後,每個對象都遭受TCP緩啓動,因爲每個TCP連接都起始於緩啓動階段。不過並行TCP連接的使用能夠部分減輕RTT延遲和緩啓動延遲的影響。

在持久連接情況下,服務器在發出響應後讓TCP連接繼續打開着。

同一對客戶/服務器之間的後續請求和響應可以通過這個連接發送。

整個Web頁面(上例中爲包含一個基本HTMLL文件和10個圖像的頁面)自不用說可以通過單個持久TCP連接發送:甚至存放在同一個服務器中的多個web頁面也可以通過單個持久TCP連接發送。

通常,HTTP服務器在某個連接閒置一段特定時間後關閉它,而這段時間通常是可以配置的。

持久連接分爲不帶流水線(without pipelining)和帶流水線(with pipelining)兩個版本。

 

如果是不帶流水線的版本,那麼客戶只在收到前一個請求的響應後才發出新的請求。

這種情況下,web頁面所引用的每個對象(上例中的10個圖像)都經歷1RTT的延遲,用於請求和接收該對象。與非持久連接2RTT的延遲相比,不帶流水線的持久連接已有所改善,不過帶流水線的持久連接還能進一步降低響應延遲。不帶流水線版本的另一個缺點是,服務器送出一個對象後開始等待下一個請求,而這個新請求卻不能馬上到達。這段時間服務器資源便閒置了。 

HTTP/1.1的默認模式使用帶流水線的持久連接。

這種情況下,HTTP客戶每碰到一個引用就立即發出一個請求,因而HTTP客戶可以一個接一個緊挨着發出各個引用對象的請求。服務器收到這些請求後,也可以一個接一個緊挨着發出各個對象。如果所有的請求和響應都是緊挨着發送的,那麼所有引用到的對象一共只經歷1RTT的延遲(而不是像不帶流水線的版本那樣,每個引用到的對象都各有1RTT的延遲)。另外,帶流水線的持久連接中服務器空等請求的時間比較少。與非持久連接相比,持久連接(不論是否帶流水線)除降低了1RTT的響應延遲外,緩啓動延遲也比較小。其原因在於既然各個對象使用同一個TCP連接,服務器發出第一個對象後就不必再以一開始的緩慢速率發送後續對象。相反,服務器可以按照第一個對象發送完畢時的速率開始發送下一個對象。

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