一次完整的HTTP通訊過程當中,瀏覽器與web服務器的7個步驟:html
1.創建TCP鏈接web
在HTTP工做開始前,瀏覽器首先要經過網絡與服務器創建鏈接,該鏈接是經過TCP來完成的。HTTP是比TCP更高層次的應用層協議,根據規則,只有底層協議創建以後才能進行更高層次協議的鏈接。後端
2.瀏覽器向服務器發送請求命令瀏覽器
一旦創建了TCP鏈接,瀏覽器就會想服務器發送請求命令。例如:GET/sample/hello.html HTTP/1.1緩存
3.瀏覽器發送請求頭信息安全
瀏覽器發送請求命令以後,還要以頭信息的形式向服務器發送一些別的信息,以後瀏覽器發送了空白行來通知服務器,表示已經結束了該頭信息的發送。服務器
4.服務器應答網絡
客戶端向服務器發送請求以後,服務器會向客戶端會送應答。app
HTTP/1.1 200 OKdom
應答的第一部分是協議的版本號和應答狀態碼
5. 服務器發送應答頭信息
正如客戶端會隨同請求發送自身信息同樣,服務器也會隨同應答向用戶發送關於它本身的數據和被請求的文檔。
6.服務器向瀏覽器發送數據
服務器向瀏覽器發送頭信息後,它會發送一個空白行來表示頭信息的發送到此爲結束,接着,它就已Content-Type應答頭信息所描述的格式發送用戶所請求的實際數據。
7.服務器關閉TCP鏈接
通常狀況下,一旦服務器向瀏覽器發送了應答數據,就要關閉TCP鏈接,而後若是瀏覽器或者服務器在其頭信息加入了這行信息:
Connection:keep-alive
TCP鏈接在發送後將仍然保持打開狀態,因而,瀏覽器能夠繼續經過相同的鏈接發送請求。保持鏈接節省了爲每一個請求創建新鏈接所花費的時間,還節約了網絡寬帶。
HTTP報文是面向文本的,報文中的每個字段都是一些ASCII碼串,各個字段的長度是不肯定的,HTTP有兩類報文:請求報文和響應報文
以下圖所示:
一個HTTP請求報文是由請求行(request line)、請求頭部(header)、空行和請求數據4個部分組成。
請求行由請求方法字段、URL字段和HTTP協議版本字段3個字段組成,它們用空格分隔。
例如:GET /index.html HTTP/1.1
HTTP協議的請求方法有GET、POST、HEAD、DELETE、OPTIONS、TRACE、CONNECT。
而常見的有如下幾種:
最多見的一種請求,當客戶端從服務器中讀取文檔時,當點擊網頁上的連接或者經過在瀏覽器的地址欄輸入網址來瀏覽頁面時,都是使用的GET方式。GET方法要求服務器將URL定位的資源放在響應報文數據部分,回送給客戶端。使用GET方法時,請求參數和對應的值放在URL後面,利用一個問號'?'表明URL的結尾和請求參數的開始。傳遞參數受到長度限制。
例如: GET /index.jsp?id=100&op=bind,這樣經過GET方式傳遞的數據直接顯示在地址中。
下面是一個請求:
1 GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1 2 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, 3 application/msword, application/x-silverlight, application/x-shockwave-flash, */* 4 Referer: <a href="http://www.google.cn/">http://www.google.cn/</a> 5 Accept-Language: zh-cn 6 Accept-Encoding: gzip, deflate 7 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld) 8 Host: <a href="http://www.google.cn">www.google.cn</a> 9 Connection: Keep-Alive 10 Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; 11 NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y- 12 FxlRugatx63JLv7CWMD6UB_O_r
能夠看到,GET方式的請求通常不包含「請求內容」部分,請求數據以地址的形式表如今請求行。地址連接以下:
<a href="http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=">http://www.google.cn/search?hl=zh-CN&source=hp &q=domety&aq=f&oq=</a>
地址中」?」以後的部分就是經過GET發送的請求數據,咱們能夠在地址欄中清楚的看到,各個數據之間用」&」符號隔開。顯然,這種方式不適合傳送私密數據。另外,因爲不一樣的瀏覽器對地址的字符限制也有所不一樣,通常最多隻能識別1024個字符,因此若是須要傳送大量數據的時候,也不適合使用GET方式。
對於不適合使用GET方式的狀況,能夠考慮使用POST方式,由於使用POST方法能夠容許客戶端給服務器提供信息更多一些。POST方法將請求參數封裝在HTTP請求數據中,以名稱/值的形式出現,能夠傳輸大量數據,這樣POST方式對傳送的數據大小沒有限制,並且也不會顯示在URL中。還以上面的搜索domety爲例,若是使用POST方式的話,格式以下:
POST /search HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, application/x-shockwave-flash, */* Referer: <a href="http://www.google.cn/">http://www.google.cn/</a> Accept-Language: zh-cn Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld) Host: <a href="http://www.google.cn">www.google.cn</a> Connection: Keep-Alive Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y- FxlRugatx63JLv7CWMD6UB_O_r hl=zh-CN&source=hp&q=domety
能夠看到,POST方式請求行中不包含數據字符串,這些數據保存在」請求內容」部分,各數據之間也是使用」&」符號隔開。POST方式大多用於頁 面的表單中。由於POST也能完成GET的功能,所以多數人在設計表單的時候一概都使用POST方式,其實這是一個誤區。GET方式也有本身的特色和優 勢,咱們應該根據不一樣的狀況來選擇是使用GET仍是使用POST。
HEAD就像GET,只不過服務端接受到HEAD請求後只返回響應頭,而不會發送響應內容。當咱們只須要查看某個頁面的狀態的時候,使用HEAD是很是高效的,由於在傳輸的過程當中省去了頁面內容。
報文頭:
④是HTTP的報文頭,報文頭包含若干個屬性,格式爲「屬性名:屬性值」,服務端據此獲取客戶端的信息。
⑤是報文體,它將一個頁面表單中的組件值經過param1=value1¶m2=value2的鍵值對形式編碼成一個格式化串,它承載多個請求參數的數據。不但報文體能夠傳遞請求參數,請求URL也能夠經過相似於「/aremiyi/wonter.html? param1=value1¶m2=value2」的方式傳遞請求參數。
消息頭:
accept:瀏覽器經過這個頭告訴瀏覽器,他所支持的數據類型
Accept-Charset: 瀏覽器經過這個頭告訴服務器,它支持哪一種字符集
Accept-Encoding:瀏覽器經過這個頭告訴服務器,支持的壓縮格式
Accept-Language:瀏覽器經過這個頭告訴服務器,它的語言環境
Host:瀏覽器經過這個頭告訴服務器,想訪問哪臺主機
If-Modified-Since: 瀏覽器經過這個頭告訴服務器,緩存數據的時間
Referer:瀏覽器經過這個頭告訴服務器,客戶機是哪一個頁面來的 防盜鏈
Connection:瀏覽器經過這個頭告訴服務器,請求完後是斷開連接仍是何持連接
響應報文:
目前,對於同一個域名,大多數瀏覽器容許同時創建6個持久鏈接。
1xx: 信息性狀態碼
100, 101
2xx: 成功狀態碼
200:OK
3xx: 重定向狀態碼
301: 永久重定向, Location響應首部的值仍爲當前URL,所以爲隱藏重定向;
302: 臨時重定向,顯式重定向, Location響應首部的值爲新的URL
304:Not Modified 未修改,好比本地緩存的資源文件和服務器上比較時,發現並無修改,服務器返回一個304狀態碼,
告訴瀏覽器,你不用請求該資源,直接使用本地的資源便可。
4xx: 客戶端錯誤狀態碼
404: Not Found 請求的URL資源並不存在
5xx: 服務器端錯誤狀態碼
500: Internal Server Error 服務器內部錯誤
502: Bad Gateway 前面代理服務器聯繫不到後端的服務器時出現
504:Gateway Timeout 這個是代理能聯繫到後端的服務器,可是後端的服務器在規定的時間內沒有給代理服務器響應
Location: 服務器經過這個頭,來告訴瀏覽器跳到哪裏
Server:服務器經過這個頭,告訴瀏覽器服務器的型號
Content-Encoding:服務器經過這個頭,告訴瀏覽器,數據的壓縮格式
Content-Length: 服務器經過這個頭,告訴瀏覽器回送數據的長度
Content-Language: 服務器經過這個頭,告訴瀏覽器語言環境
Content-Type:服務器經過這個頭,告訴瀏覽器回送數據的類型
Refresh:服務器經過這個頭,告訴瀏覽器定時刷新
Content-Disposition: 服務器經過這個頭,告訴瀏覽器如下載方式打數據
Transfer-Encoding:服務器經過這個頭,告訴瀏覽器數據是以分塊方式回送的
Expires: -1 控制瀏覽器不要緩存
Cache-Control: no-cache
Pragma: no-cache
1.GET提交,請求的數據會附在URL以後(就是把數據放置在HTTP協議頭<request-line>中), 以?分割URL和傳輸數據,多個參數用&鏈接;例如:login.action?name=hyddd& password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。若是數據是英文字母/數字,原樣發送,若是是空格,轉換爲+,若是是中文/其餘字符,則直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX爲該符號以16進製表示的ASCII。
POST提交:把提交的數據放置在是HTTP包的包體<request-body>中。上文示例中紅色字體標明的就是實際的傳輸數據
所以,GET提交的數據會在地址欄中顯示出來,而POST提交,地址欄不會改變。
2.傳輸數據的大小:
首先聲明,HTTP協議沒有對傳輸的數據大小進行限制,HTTP協議規範也沒有對URL長度進行限制。 而在實際開發中存在的限制主要有:
GET:特定瀏覽器和服務器對URL長度有限制,例如IE對URL長度的限制是2083字節(2K+35)。對於其餘瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操做系統的支持。
所以對於GET提交時,傳輸數據就會受到URL長度的限制。
POST:因爲不是經過URL傳值,理論上數據不受限。但實際各個WEB服務器會規定對post提交數據大小進行限制,Apache、IIS6都有各自的配置。
3.安全性:
POST的安全性要比GET的安全性高。注意:這裏所說的安全性和上面GET提到的「安全」不是同個概念。上面「安全」的含義僅僅是不做數據修改,而這裏安全的含義是真正的Security的含義,好比:經過GET提交數據,用戶名和密碼將明文出如今URL上,由於(1)登陸頁面有可能被瀏覽器緩存, (2)其餘人查看瀏覽器的歷史紀錄,那麼別人就能夠拿到你的帳號和密碼了。