http協議報頭詳解HTTP協議結構


http協議

請求報文和響應報文都是由以下4部分組成

1.請求行

2.請求頭

3.空行

4.消息主體

下圖為http請求的報文結構

下圖為http響應報文結構

請求行

格式為:

Method Request-URI HTTP-Version 結尾符

結尾符一般用\r\n

請求頭

通用報頭

既可以出現在請求報頭,也可以出現在響應報頭中

Date:表示消息產生的日期和時間

Connection:允許發送指定連接的選項,例如指定連接是連續的,或者指定“close”選項,通知服務器,在響應完成后,關閉連接

Cache-Control:用於指定緩存指令,緩存指令是單向的(響應中出現的緩存指令在請求中未必會出現),且是獨立的(一個消息的緩存指令不會影響另一個消息處理的緩存機制)

請求報頭

請求報頭通知服務器關於客戶端求求的信息,典型的請求頭有:

Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機

User-Agent:發送請求的瀏覽器類型、操作系統等信息

Accept:客戶端可識別的內容類型列表,用於指定客戶端接收那些類型的信息

Accept-Encoding:客戶端可識別的數據編碼

Accept-Language:表示瀏覽器所支持的語言類型

Connection:允許客戶端和服務器指定與請求/響應連接有關的選項,例如這是為Keep-Alive則表示保持連接。

Transfer-Encoding:告知接收端為了保證報文的可靠傳輸,對報文采用了什么編碼方式。

響應報頭

用於服務器傳遞自身信息的響應,常見的響應報頭:

Location:用於重定向接受者到一個新的位置,常用在更換域名的時候

Server:包含可服務器用來處理請求的系統信息,與User-Agent請求報頭是相對應的

實體報頭

實體報頭用來定於被傳送資源的信息,既可以用於請求也可用於響應。請求和響應消息都可以傳送一個實體,常見的實體報頭為:

Content-Type:發送給接收者的實體正文的媒體類型

Content-Lenght:實體正文的長度

Content-Language:描述資源所用的自然語言,沒有設置則該選項則認為實體內容將提供給所有的語言閱讀

Content-Encoding:實體報頭被用作媒體類型的修飾符,它的值指示了已經被應用到實體正文的附加內容的編碼,因而要獲得Content-Type報頭域中所引用的媒體類型,必須采用相應的解碼機制。

Last-Modified:實體報頭用於指示資源的最后修改日期和時間

Expires:實體報頭給出響應過期的日期和時間

空行

http協議規定的格式,一般采用\r\n

消息主體

一般用於http的post method。通過實體報頭規定消息主體的格式內容、

例如 Content-Type=text/plain

該實體報頭規定了消息主體的數據是純文本格式

常見的還有

Content-Type=application/x-www-form-urlencoded,定義為Key=value格式

Content-Type=application/json,定義為序列化為的json字符串

Content-Type= multipart/form-data,定義為表單數據提交,該格式比較復雜,詳細解釋一下。

multipart/form-data

1. 該格式是post的常見提交方式,也就是說是由post方法來組合實現的

2. 使用該提交方法需要規定一個內容分割符用於分割請求體中的多個post的內容,如文件內容和文本內容自然需要分割開來,不然接收方就無法正常解析和還原這個文件了。具體的頭信息如下:

Content-Type: multipart/form-data; boundary=${bound} 

其中${bound}是自定義的分隔符,一般情況用一長串不會和業務數據重復的字符串表示 ,例如9431149156168

3. 分割符前面需要加上--

4. 最后的分割符后面也需要加上—

5. 所有的數據請求頭和數據之間都用\r\n\r\n分開,兩個數據間用 --${bound}\r\n分開

實例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

POST /bucketname HTTP/1.1

Host: Host Server

User-Agent: browser_data

Accept: file_types

Accept-Language: Regions

Accept-Encoding: encoding

Accept-Charset: character_set

Keep-Alive: 300

Connection: keep-alive

Content-Type: multipart/form-data; boundary=9431149156168

Content-Length: 123456

--9431149156168

Content-Disposition: form-data; name="key"<br>

acl

--9431149156168

Content-Disposition: form-data; name="success_action_redirect"<br>

success_redirect

--9431149156168

Content-Disposition: form-data; name="content-Type"<br>

text/plain

--9431149156168

Content-Disposition: form-data; name="x-amz-meta-uuid"<br>

uuid

--9431149156168

Content-Disposition: form-data; name="x-amz-meta-tag"<br>

metadata

--9431149156168--

回到頂部

參考資料

// http協議介紹

http://liuwangshu.cn/application/network/1-http.html

// multipart提交方式詳細介紹

http://blog.csdn.net/MSPinyin/article/details/6141638



1. http協議簡介

  HTTP是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫。它的發展是萬維網協會(World Wide Web Consortium)[5]和Internet工作小組IETF(Internet Engineering Task Force)合作的結果,(他們)最終發布了一系列的RFC,RFC 1945定義了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC 2616定義了今天普遍使用的一個版本——HTTP 1.1。為紀念Tim Berners-Lee提出HTTP后對互聯網發展的貢獻,萬維網協會保留有他最原始提交的版本。
  HTTP協議(HyperText Transfer Protocol,超文本轉移協議)是用於從WWW服務器傳輸超文本到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,使網絡傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示(如文本先於圖形)等。
  HTTP是一個應用層協議,由請求和響應構成,是一個標准的客戶端服務器模型。HTTP是一個無狀態的協議。
  (引自百度百科)

2. http報頭舉例

  這里我們就用常用的百度搜索舉例吧,雖然很多程序員看不起百度搜索!

Remote Address:61.135.169.125:80
Request URL:http://www.baidu.com/
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
Cache-Control:max-age=0
Connection:keep-alive
Cookie:BDUT=eiceD23DDBB7D809C94A0E669E114AB2FAA613c5bfe280c0; SSUDBTSP=1374456410; SSUDB=NvMHE1a3NMSXQ5UFMxaVpvREtCV0ZuZmx1cWlXUUZsTHVNeDdMSnMxQmFGeFJTQVFBQUFBJCQAAAAAAAAAAAEAAACCVrIP4qvL9szDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFqK7FFaiuxRbn; BAIDUID=32C89B2CF77C0E3B9D2BC062E61A8A86:FG=1; BDUSS=0RnOGJ4ZW1rWHV-OGVRNkI0Vk90Wm1ZWXJ4YzRUaUFKZUhMQUNBSUJ0Q0Z6WmRUQVFBQUFBJCQAAAAAAAAAAAEAAACCVrIP4qvL9szDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIVAcFOFQHBTc; MCITY=-%3A; BDRCVFR[vR9GIm5IegC]=aeXf-1x8UdYcs; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; BD_CK_SAM=1; H_PS_PSSID=6225_5230_1461_5224_6553_6506_4759_6018_6676_6698_6441_6774_6502_6819_6838
Host:www.baidu.com
Referer:http://tieba.baidu.com/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36
Response Headersview source
BDPAGETYPE:2
BDQID:0xa86e37090000192c
BDUSERID:263345794
Cache-Control:private
Connection:Keep-Alive
Content-Encoding:gzip
Content-Type:text/html
Date:Fri, 30 May 2014 06:07:20 GMT
Expires:Fri, 30 May 2014 06:07:19 GMT
Server:BWS/1.1
Set-Cookie:H_PS_PSSID=6225_5230_1461_5224_6553_6506_4759_6018_6676_6698_6441_6774_6502_6819_6838; path=/; domain=.baidu.com
Set-Cookie:BDSVRTM=133; path=/
Transfer-Encoding:chunked
 
 
 
         
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

再上張圖片:
image

3. http報頭詳解

  這里我就根據上面的那個例子把所有的字段說一下,當然,有的字段,我們通過他的名字就已經知道大概的意思了!有鏈接的字段,我們在下面進行了更詳細的講解!

表1 公共頭部

字段
說明

Remote Address
請求的遠程地址

Request URL
請求的域名

Request Method
頁面請求的方式:GET/POST

Status Code
請求的返回狀態

表2 請求頭

字段
說明

Accept
表示瀏覽器支持的 MIME 類型

Accept-Encoding
瀏覽器支持的壓縮類型

Accept-Language
瀏覽器支持的語言類型,並且優先支持靠前的語言類型

Cache-Control
指定請求和響應遵循的緩存機制

Connection
當瀏覽器與服務器通信時對於長連接如何進行處理:close/keep-alive

Cookie
向服務器返回cookie,這些cookie是之前服務器發給瀏覽器的

Host
請求的服務器URL

Referer
該頁面的來源URL

User-Agent
用戶客戶端的一些必要信息

表3 返回頭

字段
說明

Cache-Control
告訴瀏覽器或者其他客戶,什么環境可以安全地緩存文檔

Connection
當client和server通信時對於長鏈接如何進行處理

Content-Encoding
數據在傳輸過程中所使用的壓縮編碼方式

Content-Type
數據的類型

Date
數據從服務器發送的時間

Expires
應該在什么時候認為文檔已經過期,從而不再緩存它?

Server
服務器名字。Servlet一般不設置這個值,而是由Web服務器自己設置

Set-Cookie
設置和頁面關聯的cookie

Transfer-Encoding
數據傳輸的方式

4. 幾個字段的說明

4.1 ACCEPT

  例子中的Accept字段是這樣子的:Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8。意思是:瀏覽器支持的MIME類型分別是text/html、application/xhtml+xml、application/xml和/,優先順序是它們從左到右的排列順序。   Accept表示瀏覽器支持的 MIME 類型;

  MIME的英文全稱是 Multipurpose Internet Mail Extensions(多功能 Internet 郵件擴充服務),它是一種多用途網際郵件擴充協議,在1992年最早應用於電子郵件系統,但后來也應用到瀏覽器。

  text/html,application/xhtml+xml,application/xml 都是 MIME 類型,也可以稱為媒體類型和內容類型,斜杠前面的是 type(類型),斜杠后面的是 subtype(子類型);type 指定大的范圍,subtype 是 type 中范圍更明確的類型,即大類中的小類。

  Text:用於標准化地表示的文本信息,文本消息可以是多種字符集和或者多種格式的;

  text/html表示 html 文檔;

  Application:用於傳輸應用程序數據或者二進制數據;

  application/xhtml+xml表示 xhtml 文檔;

  application/xml表示 xml 文檔。

4.2 CACHE-CONTROL

  Cache-Control指定請求和響應遵循的緩存機制。在請求消息或響應消息中設置Cache-Control並不會影響到另一個消息處理過程中的緩存處理過程。   請求時的緩存指令包括:no-cache, no-store, max-age, max-stale, min-fresh, only-if-cached。   響應消息中的指令包括:public, private, no-cache, no-store, no-transform, must-revalidate, proxy-revalidate, max-age。   各個指令的含義:   Public:指示響應可被任何緩存區緩存。

  Private:指示對於單個用戶的整個或部分響應消息,不能被共享緩存處理。這允許服務器僅僅描述當前用戶的部分響應消息,此響應消息對於其他用戶的請求無效。

  no-cache:指示請求或響應消息不能緩存

  no-store:用於防止重要的信息被無意的發布。在請求消息中發送將使得請求和響應消息都不使用緩存。

  max-age:指示客戶機可以接收生存期不大於指定時間(以秒為單位)的響應。

  min-fresh:指示客戶機可以接收響應時間小於當前時間加上指定時間的響應。

  max-stale:指示客戶機可以接收超出超時期間的響應消息。如果指定max-stale消息的值,那么客戶機可以接收超出超時期指定值之內的響應消息。

4.3 USER-AGENT

  User-Agent的值是:用戶使用的客戶端的一些必要信息,比如操作系統、瀏覽器及版本、瀏覽器渲染引擎等。

4.4 TRANSFER-ENCODING

  transfer-encoding的可選值有:chunked,identity,從字面意義可以理解,前者指把要發送傳輸的數據切割成一系列的塊數據傳輸,后者指傳輸時不做任何處理,自身的本質數據形式傳輸。舉個例子,如果我們要傳輸一本“紅樓夢”小說到服務器,chunked方式就會先把這本小說分成一章一章的,然后逐個章節上傳,而identity方式則是從小說的第一個字按順序傳輸到最后一個字結束。

5. 總結

  http報頭讓客戶端和服務器之間傳遞了更多的信息,服務器能夠發送過來的報頭了解到用戶的一些必要信息,服務器傳回的報頭,讓客戶端更好的理解和解析。

6. 參考文章

http://www.cnblogs.com/jcli/archive/2012/10/19/2730440.html
http://hi.baidu.com/ah__fu/item/1b8c6e6c5e78950da0cf0f53
http://jingyan.baidu.com/article/375c8e19770f0e25f2a22900.html
http://blog.csdn.net/wiwipetter/article/details/4559183
http://baike.baidu.com/view/293520.htm#5


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM