Http協議詳解

Http協議是一個應用層協議,由請求和響應構成,是一個標準的客戶端服務器端模型,是一個無狀態的協議。
http協議一般承載於tcp協議之上,有時也承載於tls或ssl協議層之上,這就造成了https。http協議端口是80,https協議端口443.
Web服務器、瀏覽器、代理服務器:
  當咱們輸入url後,瀏覽器就會給web服務器發送一個Request,web服務器接收到Request後進行處理,生成相應的Response而後發送給瀏覽器,瀏覽器解析Response中的html,這樣咱們就看到了網頁。
咱們的Request也有可能通過了代理服務器,最後纔到達web服務器。其主要功能以下:
(1)提升訪問速度,大多的代理服務器都有緩存功能。
(2)突破限制,也就是FQ了。
(3)隱藏身份。
URL詳解:
URL地址用於描述一個網絡上的資源,其格式以下:
schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]
schema:指定低層使用的協議(例如http,https,ftp)
host:http服務器的ip地址或域名
port#:http服務器的默認端口是80,這種狀況下端口號能夠省略。若是使用了別的端口則必須指明。
path:訪問資源的路徑。
url-params:
query-string:發送給服務器的數據。
http協議是無狀態的,同一客戶端的此次請求和上次請求是沒有對應關係的,對http服務器來講,它並不知道兩個請求來自
同一個客戶端。爲了解決這個問題,web應用程序引入了cookie機制來維護狀態。
消息結構:
Request:分爲3部分。第一部分叫作請求行,第二部分叫作http header,第三部分是body,header和body之間有個空行。
METHOD/path-to-resource HTTP/Version-number
Header-Name-1:value
Header-Name-2:valuehtml

Optional request bodyweb

(1)METHOD表示請求方法,如「post」,「get」。
(2)path-to-resource表示請求的資源。
(3)HTTP/Version-number表示http協議的版本號。跨域

Response:分爲3部分,第一部分叫作request line,第二部分叫作request header,第三部分是body,header和body之間空行
HTTP/Version-number status code message
Header-Name-1:value
Header-Name-2:value瀏覽器

Optional request body緩存

(1)http/version-number表示http協議的版本號
(2)status code狀態碼
(3)message狀態信息安全

get和post的區別:
  1. GET提交的數據會放在URL以後,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的數據放在HTTP包的Body中(因此get方式下body爲空).
   2. GET提交的數據大小有限制(由於瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.
   3. GET方式須要使用Request.QueryString來取得變量的值,而POST方式經過Request.Form來獲取變量的值。
   4. GET方式提交數據,會帶來安全問題,好比一個登陸頁面,經過GET方式提交數據時,用戶名和密碼將出如今URL上,若是頁面能夠被緩存或者其餘人能夠訪問這臺機器,就能夠從歷史記錄得到該用戶的帳號和密碼.

狀態碼:
http1.1定義了5中狀態碼:
  1xx:提示信息,表示請求已被成功接收,繼續處理。
  2xx:成功,表示請求已被成功接收,理解,接收。
  3xx:重定向,要完成請求必須更進一步的處理。重定向狀態碼用來告訴 瀏覽器客戶端,他們訪問的資源已被移動,web服務器會發送一個重定向狀態碼和一個可選的Location Header,告訴客戶端新的資源地址在哪。瀏覽器客戶端會自動用Location中提供的地址,從新發送新的Request。
  4xx:客戶端錯誤,請求有語法錯誤或請求沒法完成。
  5xx:服務器端錯誤,服務器未能實現合法的請求。
常見狀態碼:
  200 ok:表示該請求被成功的接受並完成,所請求的資源發回到客戶端。
  302 Found:這裏的移除是臨時的,客戶端會使用Location中給出的URL,從新發送新的http Request。
  304 Not Modified:表示上次請求的文檔緩存是最新的,即請求的文檔沒有發生變化,直接使用客戶端緩存。
  若是不想使用本地緩存,可以使用Ctrl+F5強制刷新頁面。
  400 Bad Request:發送的Request中的數據有錯誤(表單有錯誤,cookie錯誤)。客戶端請求有語法錯誤,不能被服務器端所理解。
  403 Forbidden:服務器收到請求,可是拒絕提供服務。
  404 Not Found:請求的資源不存在。
  500 Internal Server Error:服務器發生了不可預期的錯誤,沒法爲請求提供服務。
  503 Service Unavailable:服務器目前沒法爲請求提供服務,但多一段時間就能夠恢復。

http Request Header:
Cache頭域:
  (1)If-Modified-Since:將瀏覽器端緩存頁面的最後修改時間發送到服務器去,服務器會把這個時間和服務器上實際文件的最後修改時間做比較,若是時間一致,那麼返回304(Not Modified),客戶端直接使用本地緩存文件。若是不一致,就會返回200和新的文件內容。客戶端接到以後,會丟棄舊文件,把新文件緩存起來,並顯示在瀏覽器中。例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT 該時間回和Response Header中Entity中的Last-Modified: Web,Thu, 09 Feb 2012 09:07:57 GMT 做比較,相同時返回304,直接使用客戶端緩存。
  (2)if-None-Match:if-None-Match和ETag一塊兒工做,工做原理是在Http Response中添加ETag信息。當用戶再次請求該資源時,將在Http Request中加入if-None-Match信息,服務器將會驗證if-None-Match的值和ETag的值,並做比較,若是值同樣,表示資源沒有更新,則返回304,直接使用本地緩存資源。不然返回200和新的內容,並從新進行緩存。服務器

  (3)Pragma:防止頁面被緩存。
  (4)Cache-Control:用來指定請求和響應所遵循的緩存機制。Cache-Control:no-cache表示全部內容都不會被緩存。
Client頭域:
  (1)Accept:瀏覽器能夠接受的媒體類型。例如:Accept:text/html表示瀏覽器接收服務器發回的類型爲text/html也就是咱們常說的html文檔。Accept:*/*表示瀏覽器能夠處理全部類型(最經常使用)。
  (2)Accept-Encoding:瀏覽器申明本身接收的編碼方法,一般指定壓縮方法,是否支持壓縮,支持什麼壓縮。例如:Accept-Encoding:gzip,deflate。
  (3)Accept-Language:瀏覽器申明本身接收的語言。例如:Accept-Language:en-us。
  (4)User-Agent:告訴http服務器,客戶端使用的操做系統和瀏覽器的名稱及版本號。
  (5)Accept-Charset:瀏覽器 申明本身接收的字符集,如gb2312,urf-8.
Cookie/Login頭域:最重要的Header,將cookie的值發送給HTTP服務器。
Entity頭域:
  (1)Content-length:發送給http服務器的數據長度。例如:Content-Length:38.
  (2)Content-type:
Transport頭域:
  (1)Connection:Keep-Alive表示當一個網頁打開完成後,客戶端和服務器端的tcp鏈接不會關閉。當再次請求時就使用這個已創建的鏈接。
  (2)Host:請求報頭域主要用於指定被請求資源的Internet主機和端口號。

http Response Header:
Cache頭域:
  (1)Data:生成消息的具體日期和時間。
  (2)Expires:瀏覽器會在指定過時時間內使用本地緩存。
Cookie/Login頭域:
  (1)P3P:用於跨域設置cookie,這樣能夠解決iframe跨域訪問cookie的問題。
  (2)Set-Cookie:用於把cookie發送到客戶端瀏覽器,每個寫入cookie都會生成一個set-cookie。cookie

其它基本都和請求頭沒有區別。網絡

HTTP Keep-Alive做用:
  Keep-Alive使得客戶端到服務器端的鏈接持續有效,當出現對服務器端的後續請求時,Keep-Alive避免了從新創建鏈接,而直接使用已創建的鏈接。
  缺點:在處理暫停期間原本能夠釋放的資源仍然被佔用。
  幾個參數:Keep-Alive timeout=5,max=100
  timeout:過時時間爲5秒。max:最多請求一百次後強制斷開鏈接。
  http1.0:在http1.0中默認關閉Keep-Alive。若是客戶端瀏覽器支持Keep-Alive,則在http請求頭中加一個Conntion:Keep-Alive,當
  服務器收到帶有Conntion:Keep-Alive的請求時,它會在響應頭中加上Conntion:Keep-Alive,以使得客戶端和服務器端的鏈接
  被保持。當客戶端發送另一個請求時,就是用已有的鏈接。
  http1.1:在http1.1中默認開啓Keep-Alive,則全部鏈接都被保持,除非在請求頭或響應頭中指明要關閉:Connection:close。tcp

好了,以上基本是看資料學習的總結。若是有什麼不對的地方,歡迎指正。

本文系博主原創,轉載請標明出處。

相關文章
相關標籤/搜索