Http學習筆記

HTTP

一次完整的HTTP通信過程中,瀏覽器與web服務器的7個步驟:

  1.建立TCP連接

   在HTTP工作開始前,瀏覽器首先要通過網絡與服務器建立連接,該連接是通過TCP來完成的。HTTP是比TCP更高層次的應用層協議,根據規則,只有底層協議建立之後才能進行更高層次協議的連接。

  2.瀏覽器向服務器發送請求命令

  一旦建立了TCP連接,瀏覽器就會想服務器發送請求命令。例如:GET/sample/hello.html HTTP/1.1

      3.瀏覽器發送請求頭信息

      瀏覽器發送請求命令之後,還要以頭信息的形式向服務器發送一些別的信息,之後瀏覽器發送了空白行來通知服務器,表示已經結束了該頭信息的發送。

  4.服務器應答

  客戶端向服務器發送請求之後,服務器會向客戶端會送應答。

       HTTP/1.1 200 OK

       應答的第一部分是協議的版本號和應答狀態碼

       5. 服務器發送應答頭信息

    正如客戶端會隨同請求發送自身信息一樣,服務器也會隨同應答向用戶發送關於它自己的數據和被請求的文檔。

   6.服務器向瀏覽器發送數據

  服務器向瀏覽器發送頭信息後,它會發送一個空白行來表示頭信息的發送到此爲結束,接着,它就已Content-Type應答頭信息所描述的格式發送用戶所請求的實際數據。

  7.服務器關閉TCP連接

  一般情況下,一旦服務器向瀏覽器發送了應答數據,就要關閉TCP連接,然後如果瀏覽器或者服務器在其頭信息加入了這行信息:

  Connection:keep-alive

  TCP連接在發送後將仍然保持打開狀態,於是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了爲每個請求建立新連接所花費的時間,還節約了網絡寬帶。

HTTP請求與響應

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方式。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方式。

  •  POST

對於不適合使用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

HEAD就像GET,只不過服務端接受到HEAD請求後只返回響應頭,而不會發送響應內容。當我們只需要查看某個頁面的狀態的時候,使用HEAD是非常高效的,因爲在傳輸的過程中省去了頁面內容。

報文頭:

④是HTTP的報文頭,報文頭包含若干個屬性,格式爲“屬性名:屬性值”,服務端據此獲取客戶端的信息。  ⑤是報文體,它將一個頁面表單中的組件值通過param1=value1&param2=value2的鍵值對形式編碼成一個格式化串,它承載多個請求參數的數據。不但報文體可以傳遞請求參數,請求URL也可以通過類似於“/aremiyi/wonter.html? param1=value1&param2=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)其他人查看瀏覽器的歷史紀錄,那麼別人就可以拿到你的賬號和密碼了。

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