HTTP協議

請求報文/相應報文

  • 請求報文的格式:html

請求方法 URL HTTP協議的版本\r\n
若干個首部對
\r\n /* 這一個是不可少的,指示首部對結束 */
[實體]
    • 請求方法,能夠是 GET,POST,等等,該字段是大小寫敏感的.瀏覽器

    • HTTP協議的版本,HTTP/主版本號.次版本號,如 HTTP/1.1,HTTP/1.0tomcat

  • 響應報文的格式服務器

HTTP協議的版本 狀態碼 狀態碼的字符串描述\r\n
若干個首部對
\r\n/* 不可少,指示首部對的結束 */
[實體]

首部對

  • 首部對,每個首部對的格式爲 NAME:VALUE\r\n;在 VALUE 以前能夠有任意個空格;其中網絡

    • NAME,大小寫無關,dom

    • VALUE,通常狀況下,VALUE 只是簡單的一個字符串;可是在某些狀況下,VALUE能夠看做由若干個 element 組成,element 之間使用','隔開;每個 element 按照';'又能夠分爲幾個部分,除第一個部分以外,其餘部分能夠看做這個 element 的屬性,以下:編碼

If-Modified-Since:"Mon, 01 Dec 2014 12:20:07 GMT" /* 此時 VALUE 就是一串普通的字符串 */
Accept-Language:"zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"
/* 此時 VALUE 能夠分爲 4 個 element;以下,分別是:
zh-cn
zh;q=0.8 第一部分:zh,第2部分:q=0.8,能夠看做這個 element 的屬性
en-us;q=0.5
en;q=0.3 */

實體

  • 與實體有關的首部:Content-Length,Content-Type,Content-Encoding,以下詳細敘述:spa

  • Content-Length,實體的字節長度..net

  • Content-Type,實體的類型,如: Content-Type:"text/html",代表此時實體的內容是 html 文本.code

  • Content-Encoding,實體的編碼方法,對實體進行編碼能夠減小實體的大小,該首部的工做流程:

    1. 客戶端在發送的 HTTP 請求中,使用 Accept-Encoding 首部來代表客戶端支持的編碼方法.如 Accept-Encoding:"gzip, deflate"

    2. 服務器在收到請求以後,生成原始響應,此時有原始的 Content-Length,以及 Content-Type;

    3. 服務器爲了減小實體的大小,將使用客戶端支持的編碼方法對實體進行編碼獲得新的實體,編碼後,Content-Length 被更改成新實體的字節大小,而且服務器將在 HTTP 響應報文中添加首部 Content-Encoding 來代表其使用的編碼方法.

    4. 客戶端在收到 HTTP 響應以後,利用 Content-Encoding 中包含的信息對收到的實體進行解碼,獲得原始響應.

Cookie

  • 會話Cookie,存放在內存中,當用戶退出瀏覽器時,會話Cookie將會被清除.

  • 持久Cookie,存放在硬盤中,當用戶退出瀏覽器,或者計算機重啓以後,持久Cookie都不會被清除.

Cookie的組成

  • Cookie的組成:NAME=VALUE;屬性1=值;屬性2=值;...

  • 若 NAME(或VALUE)未被雙引號包含,則 NAME(或VALUE)中不能出現逗號,分號,等號,空格.

domain屬性

  • 當瀏覽器發送一個 HTTP 請求時,將根據 Cookie 的 domain 屬性來決定是否發送該Cookie,如下將用一個例子來講明:

    • 若某次 HTTP 響應中有首部(見下),則表示 test1=wangwei 將發送給域 wangwei 下的全部主機,包括名爲 wangwei 的主機(參見 DNS 域名結構來理解);而 test2=wangwei 僅發送給主機 wangwei.

Set-Cookie: test1=wangwei;domain=.wangwei.hfut.edu.cn /* 注意 wangwei 前面有一個點 */
Set-Cookie: test2=wangwei;domain=wangwei.hfut.edu.cn
  • 若 Set-Cookie 首部中,未指定 domain 的值,則默認爲產生 Set-Cookie 響應的服務器的主機名,以下:

// 向主機 210.45.240.29 發送 HTTP 請求,收到的響應有
Set-Cookie:rxnd=2011; path=/
// 則 Cookie(rxnd) 的 domain 取值爲 210.45.240.29

// 向主機 tkkc.hfut.edu.cn 發送 HTTP 請求,收到的響應有
Set-Cookie:JSESSIONID=FC1154C9D221BB12B6F3BB3998CF6A34.tomcat2; Path=/
// 則 Cookie(JSESSIONID) 的 domain 取值爲 tkkc.hfut.edu.cn

path屬性

  • 僅當 HTTP 請求的 URL 以 path 屬性的值爲前綴時,纔會發送該 Cookie,以下

    • 有 Cookie:

test1=wangwei;Path=/;domain=tkkc.hfut.edu.cn
test2=wangwei;Path=/student/;domain=tkkc.hfut.edu.cn
    • 服務器 tkkc.hfut.edu.cn 的文件結構:

    • 則當 http://tkkc.hfut.edu.cn/student/exam/ManageExam.do 時會發送 Cookie(test1),Cookie(test2);由於此時 URL 爲 /student/exam/ManageExam.do 是以'/'和'/student/'爲前綴的.

    • 則當 http://tkkc.hfut.edu.cn/image/login_bg.png 時只會發送 Cookie(test1),由於此時 URL=/image/login_bg.png 只以 '/' 爲前綴.

  • 若爲 PATH 屬性指定值,則其值爲產生 Set-Cookie 響應的 URL 路徑.以下:

//向 localhost:9503/test/s.html 發送 GET 請求,在生成的 HTTP 響應中有:
Set-Cookie:"test1=wangwei
// 則 Cookie(test1) 的 PATH 屬性的取值是 /test/

//向 localhost:9503/s.html 發送 GET 請求,在生成的 HTTP 響應中有:
Set-Cookie:"test1=wangwei
// 則 Cookie(test1) 的 PATH 屬性的取值是 /

expires屬性

  • expires 屬性指定了 Cookie 的過時時間,格式:星期幾,日-月-年 時:分:秒 GMT.如: expires=Sun, 01-Dec-2015 12:16:27 GMT

  • 若未指定 expires 屬性的值,則該 Cookie 爲會話 Cookie.

傳輸編碼

  • 傳輸編碼,改變了實體在網絡中的傳輸方式.目前僅有一種傳輸編碼,即分塊編碼(chunked).

  • 瀏覽器,也可使用分塊編碼來發送 HTTP 請求,只不過此時服務器可能不支持.

TE/Transfer-Encoding

  • TE,瀏覽器經過 TE 首部來指出其支持的傳輸編碼,如:

TE: chunked
TE: trailers,chunked /* 此時代表瀏覽器支持塊以後的託掛 */
  • Transfer-Encoding,HTTP 響應中的 Transfer-Encoding 首部代表了當前響應採用的傳輸編碼.如 Transfer-Encoding:chunked

分塊編碼

  • 分塊編碼,把實體分割爲若干個大小已知的塊,塊之間是緊挨着發送的.這樣服務器就能夠邊生成,邊發送.

  • 每個塊的格式:

塊包含實體數據的字節長度(16進制)\r\n
塊包含的實體數據
\r\n
    • 最後一個塊的格式爲:

30\r\n /* 30,即 0x30.即'0' */
\r\n
  • 拖掛,拖掛中存放的是若干個首部對,位於最後一個塊後面;拖掛中的首部須要實如今 Trailer 首部中說明.除 Transfer-Encoding,Trailer,Content-Length 首部以外,其餘 HTTP 首部均可以做爲拖掛發送.

相關文章
相關標籤/搜索