請求報文的格式: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,實體的編碼方法,對實體進行編碼能夠減小實體的大小,該首部的工做流程:
客戶端在發送的 HTTP 請求中,使用 Accept-Encoding 首部來代表客戶端支持的編碼方法.如 Accept-Encoding:"gzip, deflate"
服務器在收到請求以後,生成原始響應,此時有原始的 Content-Length,以及 Content-Type;
服務器爲了減小實體的大小,將使用客戶端支持的編碼方法對實體進行編碼獲得新的實體,編碼後,Content-Length 被更改成新實體的字節大小,而且服務器將在 HTTP 響應報文中添加首部 Content-Encoding 來代表其使用的編碼方法.
客戶端在收到 HTTP 響應以後,利用 Content-Encoding 中包含的信息對收到的實體進行解碼,獲得原始響應.
會話Cookie,存放在內存中,當用戶退出瀏覽器時,會話Cookie將會被清除.
持久Cookie,存放在硬盤中,當用戶退出瀏覽器,或者計算機重啓以後,持久Cookie都不會被清除.
Cookie的組成:NAME=VALUE;屬性1=值;屬性2=值;...
若 NAME(或VALUE)未被雙引號包含,則 NAME(或VALUE)中不能出現逗號,分號,等號,空格.
當瀏覽器發送一個 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
僅當 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 屬性指定了 Cookie 的過時時間,格式:星期幾,日-月-年 時:分:秒 GMT.如: expires=Sun, 01-Dec-2015 12:16:27 GMT
若未指定 expires 屬性的值,則該 Cookie 爲會話 Cookie.
傳輸編碼,改變了實體在網絡中的傳輸方式.目前僅有一種傳輸編碼,即分塊編碼(chunked).
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 首部均可以做爲拖掛發送.