# HTTP協(xié)議 # ——基本理解記錄

一、 介紹

  1. HTTP協(xié)議是應(yīng)用層協(xié)議,在互聯(lián)網(wǎng)上廣泛被使用,BS(browser瀏覽器-server服務(wù)端)結(jié)構(gòu)通訊的基礎(chǔ)協(xié)議。瀏覽器與服務(wù)端之間就是使用HTTP協(xié)議交互數(shù)據(jù)的,而HTTP協(xié)議要求必須建立在可靠的傳輸協(xié)議基礎(chǔ)之上進行,所以底層的通訊協(xié)議通常使用TCP協(xié)議。

  2. HTTP協(xié)議規(guī)定了客戶端(瀏覽器)與服務(wù)端之間傳輸?shù)臄?shù)據(jù)的格式及內(nèi)容,并且也規(guī)定了兩者之間的通訊方式。

  3. 在HTTP協(xié)議中要求的通訊方式為:一次請求一次響應(yīng)。

  • 即:
    客戶端主動連接服務(wù)端并發(fā)起請求(Request),服務(wù)端在收到請求后給予響應(yīng)(Response)。
    服務(wù)端永遠不會主動連接客戶端,也不會主動發(fā)送任何響應(yīng)。
  1. HTTP常見的兩個版本:1.0和1.1,現(xiàn)在基本都是使用HTTP1.1。

    • 協(xié)議1.0與1.1協(xié)議有一個比較明顯的改動:
      • 1.0協(xié)議在通訊時,客戶端與服務(wù)端建立一次TCP連接后,發(fā)送一次請求,當(dāng)服務(wù)端處理并給予響應(yīng)后即斷開連接。
      • 1.1協(xié)議則是在建立一次TCP連接后,可以經(jīng)歷多次請求與響應(yīng)的過程后再斷開連接。在當(dāng)今互聯(lián)網(wǎng)應(yīng)用中,這樣的做法可以減少不小的系統(tǒng)開銷并提高響應(yīng)效率。
  2. HTTP協(xié)議中所有字符信息所使用的字符集為:ISO8859-1,該字符集是一個歐洲編碼集,里面不含有中文等字符信息。所以HTTP協(xié)議中的字符信息部分不得出現(xiàn)如中文這樣的字符,一般只用字母,數(shù)字,符號。

二、內(nèi)容

2.1 HTTP請求(Request)

一個請求應(yīng)當(dāng)包含三部分:請求行,消息頭,消息正文
2.2.1 請求行:
  1. 請求行是由一行字符串組成的(以CRLF兩個符號結(jié)尾表示一行結(jié)束)

  2. 格式:

    method  url  protocol(CRLF)
    
    method url protocol(CRLF)
    請求方式get/post 請求資源路徑 協(xié)議版本(CRLF)
    • 例:

      GET    /index.html?a=1&b=2   HTTP/1.1(CRLF)
      //表示使用get方式進行請求,請求的資源是index.html,使用1.1協(xié)議版本(回車換行標記)
      
    • 注:
      - CR,LF是兩個不可見符號,在ASC編碼中對應(yīng)的數(shù)字為13,10
      - CR:回車符 LF:換行符 用于解析時候做區(qū)分標記

  3. 請求方式method常見的有兩種:

    • GET:地址欄請求,用戶若傳遞數(shù)據(jù)則是直接拼在資源路徑中(快而便捷,但由于明文傳輸不安全)
    • POST:將用戶傳遞的數(shù)據(jù)包含在消息正文中傳遞(相對get略慢,但是相對更安全,傳輸密碼之類加密信息可使用post)
  4. url后面可以加參數(shù),通過?標記參數(shù)的開始,參數(shù)之間用&分隔

2.2.2 消息頭
  1. 消息頭是由若干行構(gòu)成,每一行為一個消息頭。

  2. 消息頭是客戶端通訊過程中傳遞給服務(wù)端的一些附加信息,比如有的用來告知服務(wù)端客戶端的基本情況(瀏覽器內(nèi)核,操作系統(tǒng)信息等),有的是用來維持通訊過程的必要信息,有的是用來說明是否含有消息正文以及正文內(nèi)容及長度等等。

  3. 一個request中可以有很多個消息頭以便傳輸多個數(shù)據(jù)

  4. 每個消息頭的格式:

     name:value(CRLF)
    
    name value(CRLF)
    頭的名字 值(CRLF)
  • 在最后一個消息頭后面還會再單獨跟一個CRLF,表示消息頭部分結(jié)束

    • 例如:
      Host: localhost:8088(CRLF)
      Connection: keep-alive(CRLF)
      ……
      Accept-Language: zh-CN,zh;q=0.9(CRLF)(CRLF)
  • 消息正文

    • 一個請求中可以包含也可以不包含消息正文部分,消息正文是2進制數(shù)據(jù)。是用戶提交給服務(wù)端的數(shù)據(jù)。具體消息正文有多少字節(jié),這些字節(jié)表示的是什么類型的數(shù)據(jù)可以根據(jù)該請求中的兩個消息頭:Content-Type與Content-Length得知。
  • 一個請求的大致內(nèi)容為:這里已經(jīng)把(CRLF)省略因為實際上看不見

    GET /index.html HTTP/1.1
    Host: localhost:8088
    Connection: keep-alive
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Encoding: gzip, deflate, sdch
    Accept-Language: zh-CN,zh;q=0.8
    

2.2 HTTP響應(yīng)(Response)

  • 響應(yīng)是服務(wù)端發(fā)送給客戶端的內(nèi)容,HTTP協(xié)議對應(yīng)響應(yīng)的格式有所規(guī)定。一個響應(yīng)也有三個部分:狀態(tài)行、響應(yīng)頭、響應(yīng)正文。

  • 狀態(tài)行:也是有一串字符串構(gòu)成(CRLF結(jié)尾)

    • 格式:

      protocol status_code status_reason
      協(xié)議版本 狀態(tài)碼 狀態(tài)描述
    • 狀態(tài)碼是由一個三位數(shù)組成,不同的狀態(tài)碼是用來告知客戶端服務(wù)端對此請求的處理結(jié)果

      • 分5類:

        • 1xx:1.0協(xié)議視為保留部分,未啟用
        • 2xx:成功
        • 3xx:重定向
        • 4xx:客戶端錯誤
        • 5xx:服務(wù)端錯誤
      • 常見的狀態(tài)碼:
        200:請求處理成功,正常響應(yīng)客戶端
        302:要求客戶端重定向到指定地址
        404:客戶端請求錯誤,服務(wù)端無法處理該請求
        500:服務(wù)端處理請求時發(fā)生了錯誤

      • 狀態(tài)代碼與對應(yīng)的描述:

        200    OK
        201    Created
        202    Accepted
        204    No Content
        
        301    Moved Permanently
        302    Moved Temporarily
        304    Not Modified
        
        400    Bad Request
        401    Unauthorized
        403    Forbidden
        404    Not Found
        
        500    Internal Server Error
        501    Not Implemented
        502    Bad Gateway
        503    Service Unavailable
        
  • 響應(yīng)頭

    • 響應(yīng)頭是服務(wù)端發(fā)送給客戶端的附加信息。

    • 響應(yīng)頭的格式與請求中的消息頭一樣,由若干行組成,每行的

    • 格式:

      name value(CRLF)
      響應(yīng)頭名 值(CRLF)
    • 在最后一個響應(yīng)頭后面還會再單獨跟一個CRLF,表示響應(yīng)頭部分發(fā)送完畢。

  • 響應(yīng)正文

    • 響應(yīng)正文也是2進制數(shù)據(jù),是服務(wù)端響應(yīng)客戶端所請求的資源數(shù)據(jù)。這些數(shù)據(jù)可以是文本文件、二進制文件、文本數(shù)據(jù)等,正因為種類很多,所以統(tǒng)一使用二進制數(shù)據(jù)進行傳輸。
  • 一個響應(yīng)大致內(nèi)容如下:
    HTTP/1.1 200 OK(CRLF)
    Content-Type: text/html(CRLF)
    Content-Length: 3452(CRLF)(CRLF)
    10010110100101010100101001.......

三、web(http)服務(wù)器

  • 主要做的事情就是接受客戶端請求,解析請求內(nèi)容,根據(jù)請求內(nèi)容尋找、處理資源,然后匯總信息創(chuàng)建響應(yīng)最終給客戶端返回包含各類資源的響應(yīng)。
  • 他是一個運行在服務(wù)器端的軟件
  • 常用的web服務(wù)器軟件有:Tomcat、Apache-httpd、nginx。其中Tomcat是我們javaWeb常用的服務(wù)器,通過實戰(zhàn)了解其內(nèi)部原理——>Tomdog服務(wù)器——手動實現(xiàn)+從源頭了解tomcat基本實現(xiàn)原理以及http協(xié)議
最后編輯于
?著作權(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ù)。

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