HTTP協(xié)議

本篇文章來自簡書轉(zhuǎn)載,非原創(chuàng),感謝種樹人~。

圖片可以點擊放大查看。高清圖片下載地址::GitHub。

HTTP協(xié)議:?

關(guān)鍵詞提煉(服務(wù)器? 傳送超文本??到本地瀏覽器??的傳輸協(xié)議)超文本傳輸協(xié)議。

是服務(wù)器傳送超文本到本地瀏覽器的傳輸協(xié)議。應(yīng)用層協(xié)議。?

HTTP協(xié)議所在的協(xié)議層

HTTP協(xié)議通常承載于TCP協(xié)議之上,有時也承載于TLS或SSL協(xié)議層之上,這個時候,就成了我們常說的HTTPS。?Http 對應(yīng) TCP/IP 協(xié)議層的 應(yīng)用層,TCP對應(yīng) 傳輸層、IP對應(yīng) 網(wǎng)絡(luò)層。默認HTTP的端口號為80,HTTPS的端口號為443。

什么是協(xié)議:

關(guān)鍵詞提煉(通信雙方的一種規(guī)定)

協(xié)議其實就是通信雙方的一種規(guī)定。在計算機領(lǐng)域就是大家規(guī)定好的一個標示位。比如收到一個字節(jié),這個字節(jié)第一位表示男女,后面6位表示年齡,最后一位是校驗位。

HTTP請求格式

客戶端通過發(fā)送 HTTP 請求向服務(wù)器請求對資源的訪問。?它向服務(wù)器傳遞了一個數(shù)據(jù)塊,也就是請求信息,規(guī)范把 HTTP 請求分為三個部分:請求行、? 請求頭和請求正文。

該請求的內(nèi)容格式如下所示:

請求行(請求首行)

請求頭

信息空行

請求體(請求正文)

HTTP 1.1中的8種請求方式

HTTP定義了與服務(wù)器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用于描述一個網(wǎng)絡(luò)上的資源,而 HTTP 中的GET,POST,PUT,DELETE就對應(yīng)著對這個資源的查,增,改,刪4個操作。

HTTP響應(yīng)格式

當服務(wù)器收到客戶端的請求后,會發(fā)送響應(yīng)消息給客戶端。一個完整的響應(yīng)消息主要包括

響應(yīng)首行、

響應(yīng)頭信息、

空行

響應(yīng)正文。

其中,每個部分都代表了不同的含義。

HTTP請求響應(yīng)模型?

HTTP由請求和響應(yīng)構(gòu)成,是一個標準的客戶端服務(wù)器模型(B/S)。HTTP協(xié)議永遠都是客戶端發(fā)起請求,服務(wù)器回送響應(yīng)。見下圖:

?HTTP是一個無狀態(tài)的協(xié)議。無狀態(tài)是指客戶機(Web瀏覽器)和服務(wù)器之間不需要建立持久的連接,這意味著當一個客戶端向服務(wù)器端發(fā)出請求,然后服務(wù)器返回響應(yīng)(response),連接就被關(guān)閉了,在服務(wù)器端不保留連接的有關(guān)信息.HTTP遵循請求(Request)/應(yīng)答(Response)模型。客戶機(瀏覽器)向服務(wù)器發(fā)送請求,服務(wù)器處理請求并返回適當?shù)膽?yīng)答。所有HTTP連接都被構(gòu)造成一套請求和應(yīng)答。

GET POST報文實例

1 GET 可提交的數(shù)據(jù)量受到URL長度的限制,HTTP 協(xié)議規(guī)范沒有對 URL 長度進行限制。這個限制是特定的瀏覽器及服務(wù)器對它的限制

2 理論上講,POST 是沒有大小限制的,HTTP 協(xié)議規(guī)范也沒有進行大小限制,出于安全考慮,服務(wù)器軟件在實現(xiàn)時會做一定限制

3 參考上面的報文示例,可以發(fā)現(xiàn) GET 和 POST 數(shù)據(jù)內(nèi)容是一模一樣的,只是位置不同,一個在URL里,一個在 HTTP 包的包體里

提交數(shù)據(jù)的方式

HTTP 協(xié)議中規(guī)定 POST 提交的數(shù)據(jù)必須在 body 部分中,但是協(xié)議中沒有規(guī)定數(shù)據(jù)使用哪種編碼方式或者數(shù)據(jù)格式。實際上,開發(fā)者完全可以自己決定消息主體的格式,只要最后發(fā)送的 HTTP 請求滿足上面的格式就可以。

但是,數(shù)據(jù)發(fā)送出去,還要服務(wù)端解析成功才有意義。一般服務(wù)端語言如 php、python 等,以及它們的 framework,都內(nèi)置了自動解析常見數(shù)據(jù)格式的功能。服務(wù)端通常是根據(jù)請求頭(headers)中的 Content-Type 字段來獲知請求中的消息主體是用何種方式編碼,再對主體進行解析。

application/x-www-form-urlencoded

multipart/form-data

HTTP工作流程

?一次HTTP操作稱為一個事務(wù),其工作整個過程如下:

1 ) 、地址解析【應(yīng)用層】

如用客戶端瀏覽器請求這個頁面:http://localhost.com:8080/index.htm

從中分解出協(xié)議名、主機名、端口、對象路徑等部分,對于我們的這個地址,解析得到的結(jié)果如下:

協(xié)議名:http

主機名:localhost.com

端口:8080

對象路徑:/index.htm

在這一步,需要域名系統(tǒng)DNS解析域名localhost.com,得主機的IP地址。

? 2)、封裝HTTP請求數(shù)據(jù)包【應(yīng)用層】

???? 把以上部分結(jié)合本機自己的信息,封裝成一個HTTP請求數(shù)據(jù)包

?3)封裝成TCP包,建立TCP連接(TCP的三次握手)【傳輸層】

在HTTP工作開始之前,客戶機(Web瀏覽器)首先要通過網(wǎng)絡(luò)與服務(wù)器建立連接,該連接是通過TCP來完成的,該協(xié)議與IP協(xié)議共同構(gòu)建Internet,即著名的TCP/IP協(xié)議族,因此Internet又被稱作是TCP/IP網(wǎng)絡(luò)。HTTP是比TCP更高層次的應(yīng)用層協(xié)議,根據(jù)規(guī)則,只有低層協(xié)議建立之后才能,才能進行更層協(xié)議的連接,因此,首先要建立TCP連接,一般TCP連接的端口號是80。這里是8080端口

?4)客戶機發(fā)送請求命令【網(wǎng)絡(luò)層,鏈路層,物理層】

?建立連接后,客戶機發(fā)送一個請求給服務(wù)器,請求方式的格式為:統(tǒng)一資源標識符(URL)、協(xié)議版本號,后邊是MIME信息包括請求修飾符、客戶機信息和可內(nèi)容。

?5)服務(wù)器響應(yīng)

?????服務(wù)器接到請求后,給予相應(yīng)的響應(yīng)信息,其格式為一個狀態(tài)行,包括信息的協(xié)議版本號、一個成功或錯誤的代碼,后邊是MIME信息包括服務(wù)器信息、實體信息和可能的內(nèi)容。

??????? 實體消息是服務(wù)器向瀏覽器發(fā)送頭信息后,它會發(fā)送一個空白行來表示頭信息的發(fā)送到此為結(jié)束,接著,它就以Content-Type應(yīng)答頭信息所描述的格式發(fā)送用戶所請求的實際數(shù)據(jù)。

6)服務(wù)器關(guān)閉TCP連接

?一般情況下,一旦Web服務(wù)器向瀏覽器發(fā)送了請求數(shù)據(jù),它就要關(guān)閉TCP連接,然后如果瀏覽器或者服務(wù)器在其頭信息加入了這行代碼

????Connection:keep-alive

TCP連接在發(fā)送后將仍然保持打開狀態(tài),于是,瀏覽器可以繼續(xù)通過相同的連接發(fā)送請求。保持連接節(jié)省了為每個請求建立新連接所需的時間,還節(jié)約了網(wǎng)絡(luò)帶寬。

HTTP中重要的請求頭和響應(yīng)頭字段

GET請求為例

(1)首先分析其請求首行:GET ?/ Example04?username=zhangsan&password=123 / HTTP/1.1

GET?:指的是請求方式。

Example04?username=zhangsan&password=123?:指的是請求地址,即URL。

HTTP/1.1?:指的是協(xié)議及版本號。

(2)我們來分析這些請求頭,理解它們的作用:

Accept?:告訴服務(wù)器當前瀏覽器支持的MIME類型。

Accept-Language?:告訴服務(wù)器當前瀏覽器支持的語言環(huán)境,這里的值是en-US,zh-CN。enà表示英文,USà表示美國,zhà表示中文,CNà表示中國。

User-Agent?:表示當前瀏覽器的類型和OS的類型,其中MSIE 8.0表示是ie瀏覽器,版本是8.0等。

Accept-Encoding?:當前瀏覽器支持的數(shù)據(jù)壓縮格式,有時候服務(wù)器給瀏覽器發(fā)送的東西很大,這時候服務(wù)器就要考慮當數(shù)據(jù)被壓縮后,瀏覽器能不能給解壓出來,那么這個請求頭就是瀏覽器告訴服務(wù)器它能夠解壓的格式。

Host?:瀏覽器請求的主機名和端口號,在這里它請求的主機是localhost,雖然后面沒有顯示端口號,但是你要知道這個端口號是80,它是http協(xié)議默認的端口號。

Connection?:連接的方式,Keep-Alive表示的意思是連接一會。

Cookie?:這是一個與cookie相關(guān)的請求頭。

(3)請求信息中的空行,處于請求頭和請求正文之間。

(4)以上請求信息中沒有請求正文,是因為該請求方式是GET請求,而GET方式的請求信息中是沒有請求正文的,POST請求有請求正文。?

POST請求為例

Post方式請求信息與Get方式請求信息進行比較,有以下兩點區(qū)別:

1.請求首行區(qū)別:請求參數(shù)的位置不同以上兩種請求方式都是帶參數(shù)的請求,POST請求首行是:POST /Example04/index.jsp HTTP/1.1,GET請求首行為:?GET /Example04?username=zhangsan&password=123 HTTP/1.1,其中GET請求首行中,”?”后面的是請求參數(shù),多個請求參數(shù)之間用”&”連接??梢钥闯?,POST請求的請求參數(shù)并不在請求首行中。

2.GET請求沒有請求體,POST請求有請求體。從例1圖可以看出,請求體的內(nèi)容是從form.html頁面提交過來的參數(shù)。這些參數(shù)的格式:參數(shù)名=參數(shù)值&參數(shù)名=參數(shù)值&…,get請求沒有請求體,它的請求參數(shù)附加在請求首行的url后面。

HTTP常用狀態(tài)碼及其含義


作者:蝸??炫躾zzz

鏈接:http://www.itdecent.cn/p/8d3ab4e718e1

來源:簡書

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

最后編輯于
?著作權(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)容