HTTP協(xié)議入門

HTTP協(xié)議是Hypertext Transfer Protocol超文本傳輸協(xié)議的縮寫。HTTP協(xié)議屬于應(yīng)用層協(xié)議,它構(gòu)建在TCP和IP協(xié)議之上,處于TCP/IP體系架構(gòu)中的頂端,使用TCP/IP協(xié)議來傳輸數(shù)據(jù)。這樣一來它就不必處理下層協(xié)議間諸如丟包補發(fā)、握手及數(shù)據(jù)的分段和重新組裝等。


image.png

主要特點:

  • 簡單快速:客戶向服務(wù)器請求服務(wù)時,只需傳送請求方法和路徑。請求方法常用的有GET、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同。由于HTTP協(xié)議簡單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。
  • 靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對象。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。
    無連接:無連接的含義是限制每次連接只處理一個請求。服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時間。
  • 無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時它的應(yīng)答就較快。為了解決這個問題,引入cookie和session。

HTTP請求與響應(yīng)過程

1.瀏覽器根據(jù)所使用的HTTP協(xié)議,解析出url對應(yīng)的域名;
2.通過DNS域名解析,查詢出該域名對應(yīng)的IP地址;
3.通過URL解析出對應(yīng)的端口號,如果是80,默認(rèn)可以省略;
4.瀏覽器根據(jù)ip和端口建立TCP連接;
5.瀏覽器向服務(wù)器發(fā)送一條HTTP請求報文,比如get請求;
6.服務(wù)器相應(yīng)請求,并發(fā)送給瀏覽器返回報文;
7.瀏覽器渲染網(wǎng)頁并關(guān)閉與服務(wù)器的連接。

HTTP請求的報文格式

一個HTTP請求報文由請求行(request line)、請求頭部(request header)、空行和請求數(shù)據(jù)組成,如下圖:
image.png
第一部分:請求行:請求行分為三個部分:請求方法、請求地址和協(xié)議版本。
  • 請求方法:根據(jù)HTTP標(biāo)準(zhǔn),HTTP請求可以使用多種請求方法。
    HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。
    HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

GET 請求指定的頁面信息,并返回實體主體。
HEAD 類似于get請求,只不過返回的響應(yīng)中沒有具體的內(nèi)容,用于獲取報頭
POST 向指定資源提交數(shù)據(jù)進(jìn)行處理請求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請求體中。POST請求可能會導(dǎo)致新的資源的建立和/或已有資源的修改。
PUT 從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容。
DELETE 請求服務(wù)器刪除指定的頁面。
CONNECT HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
OPTIONS 允許客戶端查看服務(wù)器的性能。
TRACE 回顯服務(wù)器收到的請求,主要用于測試或診斷。

  • 協(xié)議版本:格式為:HTTP/主版本號.次版本號,常用的有HTTP/1.0和HTTP/1.1。
第二部分:請求頭部,緊接著請求行(即第一行)之后的部分,用來說明服務(wù)器要使用的附加信息

從第二行起為請求頭部,HOST將指出請求的目的地.User-Agent,服務(wù)器端和客戶端腳本都能訪問它,它是瀏覽器類型檢測邏輯的重要基礎(chǔ).該信息由你的瀏覽器來定義,并且在每個請求中自動發(fā)送等等

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

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

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

這個例子的請求數(shù)據(jù)為空。

POST請求例子,使用Charles抓取的request:
POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive

name=Professional%20Ajax&publisher=Wiley
第一部分:請求行,第一行明了是post請求,以及http1.1版本。
第二部分:請求頭部,第二行至第六行。
第三部分:空行,第七行的空行。
第四部分:請求數(shù)據(jù),第八行。

HTTP響應(yīng)的報文格式

HTTP響應(yīng)報文主要由狀態(tài)行、響應(yīng)頭部、空行以及響應(yīng)數(shù)據(jù)組成。


image.png
狀態(tài)行:

3部分組成,分別為:協(xié)議版本,狀態(tài)碼,狀態(tài)碼描述。

  • 狀態(tài)碼:
    狀態(tài)代碼為3位數(shù)字。
    1xx:指示信息--表示請求已接收,繼續(xù)處理。
    2xx:成功--表示請求已被成功接收、理解、接受。
    3xx:重定向--要完成請求必須進(jìn)行更進(jìn)一步的操作。
    4xx:客戶端錯誤--請求有語法錯誤或請求無法實現(xiàn)。
    5xx:服務(wù)器端錯誤--服務(wù)器未能實現(xiàn)合法的請求。

比如200表示響應(yīng)成功,404表示請求的網(wǎng)頁不存在,500表示服務(wù)器內(nèi)部錯誤等。

GET和POST的區(qū)別

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

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

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

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

參考:
https://segmentfault.com/a/1190000014999721?utm_source=index-hottest#articleHeader1
https://www.cnblogs.com/ranyonsue/p/5984001.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容