HTTP協議簡介

一、TCP/IP 協議介紹

在介紹 HTTP 協議之前,先簡單說一下TCP/IP協議的相關內容。TCP/IP協議是分層的,從底層至應用層分別爲:物理層、鏈路層、網絡層、傳輸層和應用層,如下圖所示:

wKioL1fAPozDvfEAAAJZXwP0sb0462.png

TCP的三次握手建立連接:

wKioL1c7B47BojGFAAC85YyBZPE364.jpg (769×462)

四次揮手釋放:

wKiom1c8LRqQnfhqAACt2BEOqZk589.png (776×519)


在這裏提一下HTTP的長連接和短連接:

HTTP協議是基於請求/響應模式的,因此只要服務端給了響應,本次HTTP連接就結束了,或者更準確的說,是本次HTTP請求就結束了,根本沒有長連接這一說。那麼自然也就沒有短連接這一說了。

網絡上說HTTP分爲長連接和短連接,其實本質上是說的TCP連接。TCP連接是一個雙向的通道,它是可以保持一段時間不關閉的,因此TCP連接纔有真正的長連接和短連接這一說。

HTTP協議說到底是應用層的協議,而TCP纔是真正的傳輸層協議,只有負責傳輸的這一層才需要建立連接。

長連接實際上是指的TCP連接只要設置Connection爲keep-alive就算是長連接現在用的基本上都是HTTP1.1協議,你觀察一下就會發現,基本上Connection都是keep-alive。而且HTTP協議文檔上也提到了,HTTP1.1默認是長連接,也就是默認Connection的值就是keep-alive,也就是我們經常使用的都是長連接模式。

關於長連接還要多提一句,那就是,長連接並不是永久連接的。如果一段時間內(具體的時間長短,是可以在header當中進行設置的,也就是所謂的超時時間),這個連接沒有HTTP請求發出的話,那麼這個長連接就會被斷掉。

----------------------------------------------------------------------------------------------------------

HTTP協議:

超文本傳輸協議(Hypertext Transfer Protocol,簡稱HTTP)是應用層協議,自 1990 年起,HTTP 就已經被應用於 WWW 全球信息服務系統。

HTTP 是一種請求/響應式的協議。一個客戶機與服務器建立連接後,發送一個請求給服務器;服務器接到請求後,給予相應的響應信息。

HTTP 的第一版本 HTTP/0.9是一種簡單的用於網絡間原始數據傳輸的協議;

HTTP/1.0由 RFC 1945 定義 ,在原 HTTP/0.9 的基礎上,有了進一步的改進,允許消息以類 MIME 信息格式存 在,包括請求/響應範式中的已傳輸數據和修飾符等方面的信息;

HTTP/1.1(RFC2616) 的要求更加嚴格以確保服務的可靠性,增強了在HTTP/1.0 沒有充分考慮到分層代理服務器、高速緩衝存儲器、持久連接需求或虛擬主機等方面的效能;

安全增強版的 HTTP (即S-HTTP或HTTPS),則是HTTP協議與安全套接口層(SSL)的結合,使HTTP的協議數據在傳輸過程中更加安全。

以上來源於維基百科。

其中SSL現在已經標準規範爲TSL,以後會寫博客總結。


HTTP協議的結構:

wKioL1fAQPiC1QIfAARJXaA-E3s917.png

實例:
HTTP請求:

GET /index.asp HTTP/1.0  //請求資源的內容
    Host:www.guet.edu.cn  

HTTP響應:

TTP/1.1 200 OK                                              //請求成功
Server: Microsoft-IIS/5.0                                    //web服務器
Date: Thu,08 Mar 200707:17:51 GMT
Connection: Keep-Alive                                 
Content-Length: 23330
Content-Type: text/html
Expries: Thu,08 Mar 2007 07:16:51 GMT
Set-Cookie: ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH; path=/
Cache-control: private


請求格式

a) 通用頭(general-header):

Cache-Control:客戶端希望服務端如何緩存自己的請求數據,如”Cache-Control: no-cache”,”Cache-Control: max-age=0″;

Connection:客戶端是否希望與服務端之間保持長連接,如”Connection: close”, “Connection: keep-alive”;

Date:只有當請求方法爲POST或PUT方法時客戶端纔可能會有些字段;

Pragma:包含了客戶端一些特殊請求信息,如 “Pragma: no-cache” 客戶端希望代理或應用服務器不應緩存與該請求相關的結果數據;

Via:一般用在代理網關嚮應用服務器發送的請求頭中,表明該來自客戶端的請求經過了網關代理,

格式爲:”Via: 請求協議版本  網關標識   [其它信息] “,

如 :” Via: 1.1  webcache_250_199.hexun.com:80 (squid)”

b) 請求頭(request-header):

Accept: 表明客戶同端可接受的請求迴應的媒體類型範圍列表。星號“*”用於按範圍將類型分組,用“*/*”指示可接受全部類型

用“type/*”指示可接受 type類型的所有子類型,如“ Accept: p_w_picpath/gif, p_w_picpath/jpeg, */*”;

Accept-Charset:客戶端所能識別的字符集編碼格式,格式:“Accept-Charset: 字符集1[:權重],字符集2[:權重]”,如:“ Accept-Charset: iso-8859-5, unicode-1-1;q=0.8”;

Accept-Language:客戶端所能識別的語言,格式:“Accept-Language: 語言1[:權重],語言2[:權重]”,如:” Accept-Language: zh, en;q=0.7”;

Host:客戶請求的主機域名或主機IP,格式:“Host: 域名或IP[:端口號]”,如:“Host: www.hexun.com:80“,請求行中若有HTTP/1.1則必須有該請求頭;

User-Agent:表明用戶所使用的瀏覽器標識,主要用於統計的目的;

Referer:指明該請求是從哪個關聯連接而來;

Accept-Encoding:客戶端所能識別的編碼壓縮格式,如:“Accept-Encoding: gzip, deflate”;

If- Modified-Since:該字段與客戶端緩存相關,客戶端所訪問的URL自該指定日期以來在服務端是否被修改過,如果修改過則服務端返回新的修改後 的信息,如果未修改過則服務器返回304表明此請求所指URL未曾修改過,如:“If-Modified-Since: Fri, 2 Sep 2006 19:37:36 GMT”;

If-None-Match:該字段與客戶端緩存相關,客戶端發送URL請求的同時發送該字段及標識,如 果服務端的標識與客戶端的標識一致,則返回304表明此URL未修改過,如果不一致則服務端返回完整的數據信息,如:“If-None-Match: 0f0a893aad8c61:253, 0f0a893aad8c61:252, 0f0a893aad8c61:251”;

Cookie:爲擴展字段,存儲於客戶端,向同一域名的服務端發送屬於該域的cookie,如:“Cookie: MailUserName=whouse”;

c) 實體頭(entity-header): (此類頭存在時要求有數據體)

Content-Encoding:客戶端所能識別的編碼壓縮格式,如:“Content-Encoding: gzip, deflate”;

Content-Length:客戶端以POST方法上傳數據時數據體部分的內容長度,如:“ Content-Length: 24”;

Content- Type:客戶端發送的數據體的內容類型,如:“Content-Type: application/x-www-form-urlencoded”爲以普通的POST方法發送的數據;“Content-Type: multipart/form-data; boundary=—————————5169208281820”,則表明數據體由多部分組成,分隔符爲 “—————————–5169208281820”;

響應格式

a) 通用頭(general-header):

Cache- Control:服務端要求中間代理及客戶端如何緩存自己響應的數據,如“Cache-Control: no-cache”,如:“Cache-Control: private” 不希望被緩存,“Cache-Control: public” 可以被緩存;

Connection:服務端是否希望與客戶端之間保持長連接,如“Connection: close”, “Connection: keep-alive”;

Date:只有當請求方法爲POST或PUT方法時客戶端纔可能會有些字段;

Pragma:包含了服務端一些特殊響應信息,如 “Pragma: no-cache” 服務端希望代理或客戶端不應緩存結果數據;

Transfer-Encoding:服務端向客戶端傳輸數據所採用的傳輸模式(僅在HTTP1.1中出現),如:“Transfer-Encoding: chunked”,注:該字段的優先級要高於“Content-Length” 字段的優先級;

b)響應頭(response-header):

Accept-Ranges:表明服務端接收的數據單位,如:“Accept-Ranges: bytes”, ;

Location:服務端向客戶端返回此信息以使客戶端進行重定向,如:“Location: http://www.hexun.com”;

Server:服務端返回的用於標識自己的一些信息,如:“ Server: Microsoft-IIS/6.0”;

ETag:服務端返回的響應數據的標識字段,客戶端可根據此字段的值向服務器發送某URL是否更新的信息;

c)實體頭(entity-header): (此類頭存在時要求有數據體)

Content-Encoding:服務端所響應數據的編碼格式,如:“Content-Encoding: gzip”;

Content-Length:服務端所返回數據的數據體部分的內容長度,如:“ Content-Length: 24”;

Content-Type:服務端所返回的數據體的內容類型,如:“Content-Type: text/html; charset=gb2312” ;

Set-Cookie:服務端返回給客戶端的cookie數據,如:“ Set-Cookie: ASP.NET_SessionId=icnh2ku2dqlmkciyobgvzl55; path=/”


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