HTTP協議簡單介紹


一、HTTP協議(超文本傳輸協議 HyperText Transfer Protocol)

HTTP是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分布式超媒體信息系統。其主要特點:

  • HTTP協議是基於TCP協議的,默認端口是80端口。
  • 支持客戶/服務器模式。
  • 簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。
  • 靈活:HTTP允許傳輸任意類型的數據對象。
  • 無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。
  • 無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。

 二、五大類HTTP狀態碼

 

 常見狀態碼詳解:

 三、HTTP常見字段解析

(一)HTTP請求格式(請求協議):Request

HTTP的請求包括:請求行(request line)、請求頭部(header)、空行 和 請求數據 四個部分組成。

 (1)URI結構

HTTP使用統一資源標識符(URI)來傳輸數據和建立連接。URL(統一資源定位符)是一種特殊種類的URI,包含了用於查找的資源的足夠的信息,我們一般常用的就是URL,而一個完整的URL包含下面幾部分:

從上面的URL可以看出,一個完整的URL包括以下幾部分:
1.協議部分:該URL的協議部分為“http:”,這代表網頁使用的是HTTP協議。在Internet中可以使用多種協議,如HTTP,FTP等等本例中使用的是HTTP協議。在"HTTP"后面的“//”為分隔符

2.域名部分:該URL的域名部分為“www.aspxfans.com”。一個URL中,也可以使用IP地址作為域名使用

3.端口部分:跟在域名后面的是端口,域名和端口之間使用“:”作為分隔符。端口不是一個URL必須的部分,如果省略端口部分,將采用默認端口

4.虛擬目錄部分:從域名后的第一個“/”開始到最后一個“/”為止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。本例中的虛擬目錄是“/news/”

5.文件名部分:從域名后的最后一個“/”開始到“?”為止,是文件名部分,如果沒有“?”,則是從域名后的最后一個“/”開始到“#”為止,是文件部分,如果沒有“?”和“#”,那么從域名后的最后一個“/”開始到結束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一個URL必須的部分,如果省略該部分,則使用默認的文件名

6.錨部分:從“#”開始到最后,都是錨部分。本例中的錨部分是“name”。錨部分也不是一個URL必須的部分

7.參數部分:從“?”開始到“#”為止之間的部分為參數部分,又稱搜索部分、查詢部分。本例中的參數部分為“boardID=5&ID=24618&page=1”。參數可以允許有多個參數,參數與參數之間用“&”作為分隔符。

(原文:http://blog.csdn.net/ergouge/article/details/8185219 )

 (2)wireshark抓包分析

GET /dist/skins/classic/style.common.3a1efb14b303c2709f98.css HTTP/1.1
Host: testingpai.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36
Accept: text/css,*/*;q=0.1
Referer: http://testingpai.com/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9

【請求數據】

第一部分:請求行,用來說明請求類型,要訪問的資源以及所使用的HTTP版本.

GET說明請求類型為GET

/dist/skins/classic/style.common.3a1efb14b303c2709f98.css為要訪問的資源

使用的是HTTP1.1版本。

第二部分:請求頭部,緊接着請求行(即第一行)之后的部分,用來說明服務器要使用的附加信息

Host字段:客戶端發送請求時,用來指定服務器的域名。有了 Host 字段,就可以將請求發往「同一台」服務器上的不同網站。
Connection字段:最常用於客戶端要求服務器使用 TCP 持久連接,以便其他請求復用。
User-Agent字段:服務器端和客戶端腳本都能訪問它,它是瀏覽器類型檢測邏輯的重要基礎。該信息由你的瀏覽器來定義,並且在每個請求中自動發送。
Accept字段:聲明自己可以接受哪些數據格式。
Referer字段:當瀏覽器向web服務器發送請求的時候,一般會帶上Referer,告訴服務器該網頁是從哪個頁面鏈接過來的。
Accept-Encoding字段:客戶端在請求時,用 Accept-Encoding 字段說明自己可以接受哪些壓縮方法。
Accept-Language字段:表示客戶端所希望的語言種類。

第三部分:空行,請求頭部后面的空行是必須的

即使第四部分的請求數據為空,也必須有空行。

第四部分:請求數據也叫主體,可以添加任意的其他數據。

(二)HTTP響應格式(響應協議):Response

一般情況下,服務器收到客戶端的請求后,就會有一個HTTP的響應消息,HTTP響應也由4部分組成,分別是:狀態行、響應頭、空行 和 響應體。

 (1)wireshark抓包分析

HTTP/1.1 200 OK
Server: nginx/1.9.9
Date: Wed, 08 Dec 2021 12:43:05 GMT
Content-Type: text/css
Transfer-Encoding: chunked
Connection: keep-alive
【響應正文】

第一部分:狀態行,由HTTP協議版本號, 狀態碼, 狀態消息三部分組成。

第一行為狀態行,(HTTP/1.1)表明HTTP版本為1.1版本,狀態碼為200,狀態消息為(OK)

第二部分:響應頭部,用來說明客戶端要使用的一些附加信息

Server字段:服務器名字。
Date字段:生成響應的日期和時間。
Content-Type字段:用於服務器回應時,告訴客戶端,本次數據是什么格式。
Transfer-Encoding字段:用來協商采用何種傳輸編碼,但是最新的 HTTP 規范里,只定義了一種傳輸編碼:分塊編碼(chunked)。
Connection字段:表明客戶端和服務器使用 TCP 持久連接。

第三部分:空行,消息報頭后面的空行是必須的

第四部分:響應正文,服務器返回給客戶端的文本信息。

四、HTTP請求方法

根據HTTP標准,HTTP請求可以使用多種請求方法。
HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

 注意:

GET和POST的區別:

    1. GET提交的數據會放在URL之后,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的數據放在HTTP包的Body中.

    2. GET提交的數據大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.

    3. GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值。

    4. GET方式提交數據,會帶來安全問題,比如一個登錄頁面,通過GET方式提交數據時,用戶名和密碼將出現在URL上,如果頁面可以被緩存或者其他人可以訪問這台機器,就可以從歷史記錄獲得該用戶的賬號和密碼.

五、HTTP工作原理

HTTP協議定義Web客戶端如何從Web服務器請求Web頁面,以及服務器如何把Web頁面傳送給客戶端。HTTP協議采用了請求/響應模型。客戶端向服務器發送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求數據。服務器以一個狀態行作為響應,響應的內容包括協議的版本、成功或者錯誤代碼、服務器信息、響應頭部和響應數據。

以下是 HTTP 請求/響應的步驟:

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

一個HTTP客戶端,通常是瀏覽器,與Web服務器的HTTP端口(默認為80)建立一個TCP套接字連接。例如,http://www.oakcms.cn。

2、發送HTTP請求

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

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

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

4、釋放連接TCP連接

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

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

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

例如:在瀏覽器地址欄鍵入URL,按下回車之后會經歷以下流程:

(1) 瀏覽器獲取輸入的域名www.baidu.com

(2) 瀏覽器向DNS請求解析www.baidu.com的IP地址

(3) 域名系統DNS解析出百度服務器的IP地址

(4) 瀏覽器與該服務器建立TCP連接(默認端口號80)

(5) 瀏覽器發出HTTP請求,請求百度首頁

(6) 服務器通過HTTP響應把首頁文件發送給瀏覽器

(7) TCP連接釋放

(8) 瀏覽器將首頁文件進行解析,並將Web頁顯示給用戶。

六、針對HTTP協議的無狀態的特點解決方案(cookie+session):

Cookie 是在 HTTP 協議下,服務器或腳本可以維護用戶信息的一種方式。Cookie 是由 Web 服務器保存在用戶瀏覽器(客戶端)上的小文本文件,它可以包含有關用戶的信息。無論何時用戶訪問到服務器,都會帶上該服務器的 cookie 信息。

一般 Cookie 都是有效期的, Cookie 只在瀏覽器上保存一段規定的時間,一旦超過規定的時間,該 Cookie 就會被系統清除。

Session 將數據存儲在服務器中,服務器會為每一個用戶創建一條 session,用戶訪問服務器的時候需要拿着 session id 去表明自己的身份。

Session 的實現是基於 Cookie, Session 需要借助於 Cookie 來存儲 session ID。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM