http協議詳解

 

 

 

HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於從萬維網服務器傳輸超文本到本地瀏覽器的傳送協議。html

HTTP 協議是以 ASCII 碼傳輸,創建在 TCP/IP 協議之上的應用層規範。規範把 HTTP 請求分爲三個部分:狀態行、請求頭、消息主體。相似於下面這樣:python

<method> <request-URL> <version>
<headers>
<entity-body>

HTTP定義了與服務器交互的不一樣方法,最基本的方法有4種,分別是GETPOSTPUTDELETEURL全稱是資源描述符,咱們能夠這樣認爲:一個URL地址,它用於描述一個網絡上的資源,而 HTTP 中的GETPOSTPUTDELETE就對應着對這個資源的查,增,改,刪4個操做。瀏覽器

 

1. GET:安全

GET請求報文示例:服務器

GET /books/?sex=man&name=Professional HTTP/1.1
 Host: www.example.com
 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
 Gecko/20050225 Firefox/1.0.1
 Connection: Keep-Alive

POST表示可能修改變服務器上的資源的請求。網絡

POST / HTTP/1.1
 Host: www.example.com
 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
 Gecko/20050225 Firefox/1.0.1
 Content-Type: application/x-www-form-urlencoded
 Content-Length: 40
 Connection: Keep-Alive

 sex=man&name=Professional
  • GET 可提交的數據量受到URL長度的限制,HTTP 協議規範沒有對 URL 長度進行限制。這個限制是特定的瀏覽器及服務器對它的限制
  • 理論上講,POST 是沒有大小限制的,HTTP 協議規範也沒有進行大小限制,出於安全考慮,服務器軟件在實現時會作必定限制
  • 參考上面的報文示例,能夠發現 GET 和 POST 數據內容是如出一轍的,只是位置不一樣,一個在URL裏,一個在 HTTP 包的包體裏

咱們知道 HTTP 協議採用「請求-應答」模式,當使用普通模式,即非 Keep-Alive 模式時,每一個請求/應答客戶和服務器都要新建一個鏈接,完成以後當即斷開鏈接(HTTP協議爲無鏈接的協議);當使用 Keep-Alive 模式(又稱持久鏈接、鏈接重用)時,Keep-Alive 功能使客戶端到服務器端的鏈接持續有效,當出現對服務器的後繼請求時,Keep-Alive 功能避免了創建或者從新創建鏈接。app

 

  • HTTP Keep-Alive 簡單說就是保持當前的TCP鏈接,避免了從新創建鏈接。編碼

  • HTTP 長鏈接不可能一直保持,例如 Keep-Alive: timeout=5, max=100,表示這個TCP通道能夠保持5秒,max=100,表示這個長鏈接最多接收100次請求就斷開。url

  • HTTP是一個無狀態協議,這意味着每一個請求都是獨立的,Keep-Alive沒能改變這個結果。另外,Keep-Alive也不能保證客戶端和服務器之間的鏈接必定是活躍的,在HTTP1.1版本中也如此。惟一能保證的就是當鏈接被關閉時你能獲得一個通知,因此不該該讓程序依賴於Keep-Alive的保持鏈接特性,不然會有意想不到的後果。code

  • 使用長鏈接以後,客戶端、服務端怎麼知道本次傳輸結束呢?兩部分:1. 判斷傳輸數據是否達到了Content-Length 指示的大小;2. 動態生成的文件沒有 Content-Length ,它是分塊傳輸(chunked),這時候就要根據 chunked 編碼來判斷,chunked 編碼的數據在最後有一個空 chunked 塊,代表本次傳輸數據結束,詳見這裏。什麼是 chunked 分塊傳輸呢?下面咱們就來介紹

 


1xx:指示信息--表示請求已接收,繼續處理

2xx:成功--表示請求已被成功接收、理解、接受

3xx:重定向--要完成請求必須進行更進一步的操做

4xx:客戶端錯誤--請求有語法錯誤或請求沒法實現

5xx:服務器端錯誤--服務器未能實現合法的請求

200 OK      //客戶端請求成功
400 Bad Request  //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經受權,這個狀態代碼必須和WWW-Authenticate報頭域一塊兒使用 
403 Forbidden  //服務器收到請求,可是拒絕提供服務
404 Not Found  //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable  //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常

 

urllib 和urllib2之間的區別是:

在python2中,urllib和urllib2都是接受URL請求的相關模塊,可是提供了不一樣的功能。兩個最顯著的不一樣以下:

一、urllib2能夠接受一個Request類的實例來設置URL請求的headers

2urllib僅能夠接受URL。這意味着,你不能夠假裝你的User Agent字符串等。

可是urllib提供urlencode方法用來GET查詢字符串的產生,而urllib2沒有。這是就是爲什麼urllib常和urllib2一塊兒使用的緣由。

python urllib2直接open和經過request再open有什麼區別。

 

 

 

 

 

 

http://zhuoqiang.me/python-urllib2-usage.html

 

 

 

 

 

 

 

HTTP容許傳輸任意類型的數據對象

相關文章
相關標籤/搜索