網(wǎng)絡(luò)基礎(chǔ)知識之HTTP協(xié)議

作為一個開發(fā)人員,掌握必要的 HTTP 協(xié)議十分重要,下面就通過本文記錄自己對 HTTP 協(xié)議的理解。

HTTP 基本概念

HTTP,全稱為 HyperText Transfer Protocol,即為超文本傳輸協(xié)議。是互聯(lián)網(wǎng)應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,所有的 www 文件都必須遵守這個標(biāo)準(zhǔn)。
它是一種建立在TCP/IP上的無狀態(tài)連接,默認(rèn)端口為80。整個基本的工作流程是客戶端發(fā)送一個HTTP請求,說明客戶端想要訪問的資源和請求的動作,服務(wù)端收到請求之后,服務(wù)端開始處理請求,并根據(jù)請求做出相應(yīng)的動作訪問服務(wù)器資源,最后通過發(fā)送HTTP響應(yīng)把結(jié)果返回給客戶端。其中一個請求的開始到一個響應(yīng)的結(jié)束稱為事務(wù),當(dāng)一個事物結(jié)束后還會在服務(wù)端添加一條日志條目。

HTTP可分為兩個部分:請求和響應(yīng)

1.HTTP請求

HTTP請求是客戶端往服務(wù)端發(fā)送請求動作,告知服務(wù)器自己的要求。
HTTP請求由狀態(tài)行、請求頭、請求正文三部分組成:

  • 狀態(tài)行:包括請求方式Method、資源路徑URL、協(xié)議版本Version;
  • 請求頭:包括一些訪問的域名、用戶代理、Cookie等信息;
  • 請求正文:就是HTTP請求的數(shù)據(jù)。
HTTP請求報文:
image.png
報文實例:
image.png

1.請求報文的起始由請求行構(gòu)成(有些資料稱為狀態(tài)行,名字不一樣而已,都是指的一個東西),用來說明該請求想要做什么,由<Method>、<URL>、<Version> 三個字段組成,注意每個字段之間都有一個空格。
其中<Method>字段有不同的值:

  • GET --- 訪問服務(wù)器的資源
  • POST --- 向服務(wù)器發(fā)送要修改的數(shù)據(jù)
  • HEAD --- 獲取服務(wù)器文檔的首部
  • PUT --- 向服務(wù)器上傳資源
  • DELETE--- 刪除服務(wù)器的資源

<URL>字段表示服務(wù)器的資源目錄定位
<Version>字段表示使用的http協(xié)議版本

2.首部部分由多個請求頭(也叫首部行)構(gòu)成,那些首部字段名有如下,不全:

  • Accept 指定客戶端能夠接收的內(nèi)容格式類型
  • Accept-Language 指定客戶端能夠接受的語言類型
  • Accept-Ecoding 指定客戶端能夠接受的編碼類型
  • User-Agent 用戶代理,向服務(wù)器說明自己的操作系統(tǒng)、瀏覽器等信息
  • Connection 是否開啟持久連接(keepalive)
  • Host 服務(wù)器域名
  • ...

3.主體部分就是報文的具體數(shù)據(jù)。

附 get方法和post方法的區(qū)別
1.GET 一般用于信息獲取,比如剛才我們?yōu)g覽百度首頁,其使用的就是GET方法。GET 請求一般不會產(chǎn)生副作用,它僅僅只是獲取資源信息,就像數(shù)據(jù)庫查詢一樣,不會修改、增加數(shù)據(jù),不會影響資源的狀態(tài),并且對同一個 URL 的多次GET請求應(yīng)該返回相同的結(jié)果。
而 POST 請求表示可能會修改服務(wù)器上的資源。
2.GET 和 POST 請求參數(shù)位置不同,GET 請求對應(yīng)的參數(shù)放在 URL 中,而 POST 請求對應(yīng)的參數(shù)放在 HTTP 請求主體中。(但是這只是一種約定,GET 請求中出現(xiàn) Body 也是被允許的)
3.GET 請求的參數(shù)在 URL 中,因此絕不能用 GET 請求傳輸敏感數(shù)據(jù)。POST 請求數(shù)據(jù)則寫在 HTTP 的請求頭中,安全性略高于 GET 請求。處于安全考慮,在一些涉及安全的請求比如:登錄請求需要用 POST 提交表單,而GET 請求一般用來獲取靜態(tài)資源。

可用Chrome開發(fā)者工具來對HTTP請求進行查看

image.png

2.HTTP響應(yīng)

HTTP 響應(yīng)是服務(wù)器在客戶端發(fā)送 HTTP 請求后經(jīng)過一些處理而做出的響應(yīng),HTTP 響應(yīng)和 HTTP 請求相似,也是由三個部分構(gòu)成。分別是:狀態(tài)行,響應(yīng)頭(Response Header),響應(yīng)正文。

HTTP響應(yīng)報文:
image.png
報文實例:
image.png

1.響應(yīng)報文的起始由狀態(tài)行構(gòu)成,用來說明服務(wù)器做了什么,由<Version>、<Status-Code>、<Phrase>三個字段組成,同樣的每個字段之間留有空格;
狀態(tài)行中包含一個狀態(tài)碼,用來表示服務(wù)器對客戶端響應(yīng)的結(jié)果。
狀態(tài)碼一般由3位構(gòu)成:
1xx : 表示請求已經(jīng)接受了,繼續(xù)處理。
2xx : 表示請求已經(jīng)處理掉了。
3xx : 重定向。
4xx : 一般表示客戶端有錯誤,請求無法實現(xiàn)。
5xx : 一般為服務(wù)器端的錯誤。
比如常見的狀態(tài)碼:
200 OK 客戶端請求成功。
301 Moved Permanently 請求永久重定向。
302 Moved Temporarily 請求臨時重定向。
304 Not Modified 文件未修改,可以直接使用緩存的文件。
400 Bad Request 由于客戶端請求有語法錯誤,不能被服務(wù)器所理解。
401 Unauthorized 請求未經(jīng)授權(quán),無法訪問。
403 Forbidden 服務(wù)器收到請求,但是拒絕提供服務(wù)。服務(wù)器通常會在響應(yīng)正文中給出不提供服務(wù)的原因。
404 Not Found 請求的資源不存在,比如輸入了錯誤的URL。
500 Internal Server Error 服務(wù)器發(fā)生不可預(yù)期的錯誤,導(dǎo)致無法完成客戶端的請求。
503 Service Unavailable 服務(wù)器當(dāng)前不能夠處理客戶端的請求,在一段時間之后,服務(wù)器可能會恢復(fù)正常。
2.首部由多個響應(yīng)頭(也叫首部行)組成, 首部字段名如下,不全:

  • Server 服務(wù)器軟件名,Apache/Nginx
  • Date 服務(wù)器發(fā)出響應(yīng)報文的時間
  • Last-Modified 請求資源的最后的修改時間
  • ...

4.主體部分是響應(yīng)報文的具體數(shù)據(jù)。

可用Chrome開發(fā)者工具來對HTTP響應(yīng)進行查看

image.png

知道了 HTTP 請求和響應(yīng)后,一個完整的流程一般是這樣的:
通常,由 HTTP 客戶端發(fā)起一個請求,建立一個到服務(wù)器指定端口(默認(rèn)是 80 端口)的 TCP 連接。HTTP 服務(wù)器則在那個端口監(jiān)聽客戶端發(fā)送過來的請求。一旦收到請求,服務(wù)器(向客戶端)發(fā)回一個狀態(tài)行,比如"HTTP/1.1 200 OK",和(響應(yīng)的)消息,消息的消息體可能是請求的文件、錯誤消息、或者其它一些信息。


用 curl 創(chuàng)造一個請求,并得到響應(yīng)
例如:curl -s -v -H "Frank: xxx" -- "https://www.baidu.com"

image.png

?著作權(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)容