Http協議學習

HTTP簡介

  • WEB瀏覽器與WEB服務器之間的一問一答的交互過程必須遵循一定的規則,這個規則就是HTTP協議。
  • HTTP是HyperText Transfer Protocol(超文本傳輸協議)的簡寫,它是TCP/IP協議的一個應用層協議,用於定義WEB瀏覽器與WEB服務器之間交換數據的過程及數據本身的格式
  • HTTP協議的版本:HTTP/1.0、HTTP/1.1
  • HTTP協議是學習JavaWEB開發的基石,不深入瞭解HTTP協議,就不能說掌握了WEB開發,更無法管理和維護一些複雜的WEB站點。

HTTP1.0的基本運行方式

  • 基於HTTP協議的客戶/服務器模式的信息交換過程,如圖所示,它分四個過程,建立連接、發送請求信息、發送響應信息、關閉連接。

                 215512_niaP_2427074.png

  • 瀏覽器與WEB服務器的連接過程是短暫的,每次連接只處理一個請求和響應。對每一個頁面的訪問,瀏覽器與WEB服務器都要建立一次單獨的連接。
  • 瀏覽器到WEB服務器之間的所有通訊都是完全獨立分開的請求和響應。
  • 無狀態

HTTP1.1與HTTP1.0的比較

    HTTP1.1的特點:

  • 在一個TCP連接上可以傳送多個HTTP請求和響應
  • 多個請求和響應過程可以重疊
  • 增加了更多的請求頭和響應頭,比如Host、If-Unmodified-Since請求頭等

           215705_H0wb_2427074.png

HTTP請求消息

客戶端連上服務器後,向服務器請求某個web資源,稱之爲客戶端向服務器發送了一個HTTP請求。

一個完整的HTTP請求包括如下內容: 一個請求行、若干消息頭、以及請求正文,其中的一些消息頭和正文都是可選的,消息頭和正文內容之間要用空行隔開。

     220343_nJoP_2427074.png

HTTP響應消息

一個HTTP響應代表服務器向客戶端回送的數據。

一個完整的HTTP響應包括如下內容: 一個狀態行、若干消息頭、以及響應正文,其中的一些消息頭和正文都是可選的,消息頭和正文內容之間要用空行隔開。

      220915_4IBa_2427074.png

HTTP消息頭(請求和響應共性)

  • 使用消息頭,可以實現HTTP客戶機與服務器之間的條件請求和應答,消息頭相當於服務器和瀏覽器之間的一些暗號指令。
  • 每個消息頭包含一個頭字段名稱,然後依次是冒號、空格、值、回車和換行符     如: Accept-Encoding: gzip, deflate
  • 消息頭字段名是不區分大小寫的,但習慣上講每個單詞的第一個字母大寫。
  • 整個消息頭部分中的各行消息頭可按任何順序排列。 消息頭又可分爲通用信息頭、請求頭、響應頭、實體頭等四類 許多請求頭字段都允許客戶端在值部分指定多個可接受的選項,多個選項之間以逗號分隔。
  • 有些頭字段可以出現多次,例如,響應消息中可以包含有多個」Warning」頭字段。

HTTP請求的細節——請求行 

請求行 格式:請求方式 資源路徑 HTTP版本號<CRLF>

    舉例:GET /temp3o116.shtml HTTP/1.1

    請求方式:GETPOST、HEAD、OPTIONS、DELETE、TRACE、PUT

    用戶如沒有設置,默認情況下瀏覽器向服務器發送的都是get請求,例如在瀏覽器直接輸地址訪問,點超鏈接訪問等都是get,用戶如想把請求方式改爲post,可通過更改表單的提交方式實現。 不管POST或GET,都用於向服務器請求某個WEB資源,這兩種方式的區別主要表現在數據傳遞上。 GET方式 如請求方式爲GET方式,則可以在請求的URL地址後以?的形式帶上交給服務器的數據,多個數據之間以&進行分隔,例如: GET /mail/1.html?name=abc&password=xyz HTTP/1.1

GET方式的特點:在URL地址後附帶的參數是有限制的,其數據容量通常不能超過1K。

POST方式 如請求方式爲POST方式,則可以在請求的正文內容中向服務器發送數據,Post方式的特點:傳送的數據量無限制。

 

HTTP響應的細節——狀態行

狀態行     

格式: HTTP版本號 狀態碼 原因敘述<CRLF>     

舉例:HTTP/1.1 200 OK

狀態碼用於表示服務器對請求的各種不同處理結果和狀態,它是一個三位的十進制數。響應狀態碼分爲5類,使用最高位爲1到5來進行分類如下所示:

113515_WlPj_2427074.png

常用狀態碼:

200(正常) 表示一切正常,返回的是正常請求結果

302/307(臨時重定向) 指出被請求的文檔已被臨時移動到別處,此文檔的新的URL在Location響應頭中給出。

304(未修改) 表示客戶機緩存的版本是最新的,客戶機可以繼續使用它,無需到服務器請求。

404(找不到) 服務器上不存在客戶機所請求的資源。

500(服務器內部錯誤) 服務器端的程序發生錯誤

請求頭細節

請求頭字段用於客戶端在請求消息中向服務器傳遞附加信息,主要包括客戶端可以接受的數據類型(MIME類型)、壓縮方法、語言以及發出請求的超鏈接所屬頁面的URL地址等信息。 常用請求頭:

Accept:瀏覽器可接受的MIME類型

Accept-Charset: 瀏覽器通過這個頭告訴服務器,它支持哪種字符集

Accept-Encoding:瀏覽器能夠進行解碼的數據編碼方式,比如gzip

Accept-Language:瀏覽器所希望的語言種類,當服務器能夠提供一種以上的語言版本時要用到。 可以在瀏覽器中進行設置。

Host:初始URL中的主機和端口

Referer:包含一個URL,用戶從該URL代表的頁面出發訪問當前請求的頁面

Content-Type:內容類型

If-Modified-Since: Wed, 02 Feb 2011 12:04:56 GMT利用這個頭與服務器的文件進行比對,如果一致,則從緩存中直接讀取文件。

User-Agent:瀏覽器類型.

Content-Length:表示請求消息正文的長度

Connection:表示是否需要持久連接。如果服務器看到這裏的值爲「Keep -Alive」,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認進行持久連接

Cookie:這是最重要的請求頭信息之一

Date:Date: Mon, 22 Aug 2011 01:55:39 GMT請求時間GMT

響應頭細節

Location: http://www.it315.org/index.jsp指示新的資源的位置

Server:apache tomcat指示服務器的類型

Content-Encoding: gzip服務器發送的數據採用的編碼類型

Content-Length: 80 告訴瀏覽器正文的長度

Content-Language: zh-cn服務發送的文本的語言

Content-Type: text/html; charset=GB2312服務器發送的內容的MIME類型

Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT文件的最後修改時間

Refresh: 1;url=http://www.it315.org指示客戶端刷新頻率。單位是秒

Content-Disposition: attachment; filename=aaa.zip指示客戶端下載文件

Set-Cookie:SS=Q0=5Lb_nQ; path=/search服務器端發送的

Cookie Expires: -1 Cache-Control: no-cache (1.1)  

Pragma: no-cache   (1.0) Connection: close/Keep-Alive   Date: Tue, 11 Jul 2000 18:23:51 GMT

說明:cookie的信息都是放置在頭中的。

表單提交涉及到的Http請求響應分析

在Form元素的語法中,EncType表明提交數據的格式 用 Enctype 屬性指定將數據回發到服務器時瀏覽器使用的編碼類型。 例如:

application/x-www-form-urlencoded: 窗體數據被編碼爲名稱/值對。這是標準的編碼格式。

multipart/form-data: 窗體數據被編碼爲一條消息,頁上的每個控件對應消息中的一個部分,這個一般文件上傳時用。

text/plain: 窗體數據以純文本形式進行編碼,其中不含任何控件或格式字符。 

form的enctype屬性爲編碼方式,常用有兩種:application/x-www-form-urlencoded和multipart/form-data,默認爲application/x-www-form-urlencoded。

1.x-www-form-urlencoded

當action爲get時候,瀏覽器用x-www-form-urlencoded的編碼方式把form數據轉換成一個字串(name1=value1&name2=value2…),然後把這個字串append到url後面,用?分割,加載這個新的url。

當action爲post時候,就是將數據封裝到當前請求的請求體當中。

2.multipart/form-data

當action爲post時候,瀏覽器把form數據封裝到http body中,然後發送到server。 如果沒有type=file的控件,用默認的application/x-www-form-urlencoded就可以了。 但是如果有type=file的話,就要用到multipart/form-data了。瀏覽器會把整個表單以控件爲單位分割,併爲每個部分加上Content-Disposition(form-data或者file),Content-Type(默認爲text/plain),name(控件name)等信息,並加上分割符(boundary)。

另外,文件下載也是需要設置響應頭中的Content-Disposition這個消息頭

 

轉載於:https://my.oschina.net/whling/blog/1782846