Web技術1:http協議詳解

Http

http協議:Hyper Text Transfer Protocl,即插我文本傳輸協議,是用於萬維網www服務器傳輸超文本到本地瀏覽器的傳輸協議。Http協議是基於TCP/IP協議來進行傳遞數據的

主要特點

Http協議是屬於應用層的面向對象的協議,有着一下特點

  1. 簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯繫的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。

  2. 靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。

  3. 無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。

  4. 無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。

  5. 支持B/S及C/S模式。

一次Http請求

在這裏插入圖片描述

1、客戶端連接到Web服務器

一個HTTP客戶端,通常是瀏覽器,點擊某個鏈接,與Web服務器的HTTP端口(默認爲80)建立一個TCP套接字連接

2、發送HTTP請求

通過TCP套接字,客戶端向Web服務器發送一個文本的請求報文,一個請求報文由請求行、請求頭部、空行和請求數據4部分組成

3、服務器接受請求並返回HTTP響應

Web服務器解析請求,定位請求資源。服務器將資源複本寫到TCP套接字,由客戶端讀取。一個響應由狀態行、響應頭部、空行和響應數據4部分組成

4、釋放連接TCP連接

若connection 模式爲close,則服務器主動關閉TCP鏈接,客戶端被動關閉連接,釋放TCP鏈接;若connection 模式爲keepalive,則該連接會保持一段時間,在該時間內可以繼續接收請求;

5、客戶端瀏覽器解析HTML內容

客戶端瀏覽器首先解析狀態行,查看錶明請求是否成功的狀態代碼。然後解析每一個響應頭,響應頭告知以下爲若干字節的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應數據HTML,根據HTML的語法對其進行格式化,並在瀏覽器窗口中顯示。

HTTP請求Request在這裏插入圖片描述

發出的請求信息(message request)包括以下幾個:

POST / HTTP1.1//請求行
Host:www.xxxxx.com//請求頭部
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Content-Type:application/json
Content-Length:40
Connection: Keep-Alive//請求頭部,中間都是的
    //空行
name=xxxxx//請求數據
  • 請求行,用來說明請求類型,要訪問的資源以及所使用的HTTP版本(例如GET /images/logo.gif HTTP/1.1,表示從/images目錄下請求logo.gif這個文件)

  • 請求頭,用來說明服務器要使用的附加信息(例如Accept-Language: en或者User-Agent等)
    在這裏插入圖片描述

  • 空行,請求頭部後面的空行是必須的,即使第四部分的請求數據爲空,也必須有空行。

  • 請求數據,也叫主體,可以添加任意的其他數據,也可以爲空。

HTTP響應Response

HTTP/1.1 200 OK//狀態行
Date: Fri, 22 May 2009 06:07:21 GMT//消息報頭
Content-Type: text/html; charset=UTF-8//消息報頭
//空行
<html>//以下爲響應徵文
      <head></head>
      <body>
            <!--body goes here-->
      </body>
</html>
  • 狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成
  • 消息報頭,用來說明客戶端要使用的一些附加信息, Date:生成響應的日期和時間;Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8
  • 空行,消息報頭後面的空行是必須的
  • 響應正文,服務器返回給客戶端的文本信息。

HTTP常見請求頭和響應頭

圖片來自《深入分析Java Web技術內幕》
在這裏插入圖片描述

HTTP之狀態碼

狀態代碼的第一個數字代表當前響應的類型:

  • 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        //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常

更多狀態碼可查看更多狀態碼

GET和POST請求的區別

  1. GET提交的數據會放在URL之後,以?分割URL和傳輸數據,參數之間以&相連,如/api/v1/fitz?name=fitz&pwd=123456。 POST方法是把提交的數據放在HTTP包的Body中.
  2. GET提交的數據大小有限制(因爲瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.
  3. GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值。
  4. GET方式提交數據,會帶來安全問題,比如一個登錄頁面,通過GET方式提交數據時,用戶名和密碼將出現在URL上,如果頁面可以被緩存或者其他人可以訪問這臺機器,就可以從歷史記錄獲得該用戶的賬號和密碼.

本文參考https://www.jianshu.com/p/80e25cb1d81a

wikihttps://zh.wikipedia.org/wiki/超文本傳輸協議

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