1. 揭開http報文的神秘面紗

        共 5352字,需瀏覽 11分鐘

         ·

        2021-04-22 17:10


        點擊上方藍(lán)色“邁莫coding”,選擇“設(shè)為星標(biāo)”

         

        今天是計網(wǎng)的第二彈,主要敘述http報文的神秘面紗。相信大家在寫項目中,或多或少遇到過,進(jìn)行http訪問時,header頭部上需要加上Content-Type、Host等等,但有時候為了項目順利完成,可能沒有時間思考為什么需要加上他們,他們的含義是什么?......

         

        今天就會揭開http報文的什么面紗,拭目以待......

         

        計網(wǎng)以往文章

         


        前言

         

        在上一篇文章中談了談http的特點及其含義,由<<http到底有什么魔性,備受青睞>>文章知:http是超文本傳輸協(xié)議。那么問題來了,http傳輸?shù)膬?nèi)容到底是什么,http報文組成成分又是什么?

         

        接下來,泡一杯枸杞,慢慢聊一聊http報文的組成成分 


        http報文結(jié)構(gòu)

         

        http的請求報文和http響應(yīng)報文結(jié)構(gòu)基本類似,都是由三部分組成:

         

        • 起始行(start line):描述請求或響應(yīng)的基本信息

         

        • 頭部字段集合(header):使用 key-value 形式更詳細(xì)地說明報文

         

        • 消息正文(entity):實際傳輸?shù)臄?shù)據(jù),它不一定是純文本,可以是圖片、視頻等二進(jìn)制數(shù)據(jù)

         

        這其中前兩部分起始行和頭部字段經(jīng)常又合稱為“請求頭”或“響應(yīng)頭”,消息正文又稱為“實體”,但與“header”對應(yīng),很多時候就直接稱為“body”。

         

        HTTP 協(xié)議規(guī)定報文必須有 header,但可以沒有 body,而且在 header 之后必須要有一個“空行”,也就是“CRLF”,十六進(jìn)制的“0D0A”。

         

        所以,一個完整的 HTTP 報文就像是下圖的這個樣子,注意在 header 和 body 之間有一個“空行”。

         


        http 請求行

         

        聊完http的報文結(jié)構(gòu),那么接下里看一下http請求報文組成結(jié)構(gòu)的第一組成部分:http起始行(http請求行)。

         

         

        由圖可知,http請求行有三部分組成:

         

        • 請求方法:如GET、POST請求方式,表示對資源的操作

         

        • 請求地址:表示請求方法要操作的資源

         

        • 版本號:表示報文所使用的http版本號

         

        拿個實際的請求行來解釋一下,加深影響

         

        GET / HTTP/1.1
         

        在這個請求行里,“GET”是請求方法,“/”是請求目標(biāo),“HTTP/1.1”是版本號,把這三部分連起來,意思就是“服務(wù)器你好,我想獲取網(wǎng)站根目錄下的默認(rèn)文件,我用的協(xié)議版本號是 1.1,請不要用 1.0 或者 2.0 回復(fù)我。”


        http請求頭部header

         

        http請求頭部用來說明服務(wù)器要使用的附加信息,他的結(jié)構(gòu)類型是key-value形式。key和 value 之間用“:”分隔,最后用 CRLF 換行表示字段結(jié)束。比如請求頭中"host:127.0.0.1",在這一行中"host"為key值,"127.0.0.1"為value值。

         

        下面這張圖展示了http請求報文所包含的信息,也會借此圖詳細(xì)說明每個header信息的作用及其含義。

         

         

        以這個圖中的header頭字段進(jìn)行解釋,比如Accept、Accept-Language、Connection、Host、Referer、User-Agent等等。

         

        • Host

         

        Host表示將請求發(fā)送的目的地-服務(wù)端。告訴服務(wù)端由那些主機進(jìn)行處理,當(dāng)一臺計算機上托管了多個虛擬主機的時候,服務(wù)器端就需要用 Host 字段來選擇,有點像是一個簡單的“路由重定向”。

         

        • Connection

         

        Connection 表示當(dāng)client和server通信時對于長鏈接如何進(jìn)行處理,取值范圍為【"Keep-Alive", "Close"】。

         

        取值為【Keep-Alive】:若 client使用http1.1協(xié)議,但希望使用長鏈接,則需要在header中指明connection的值為Keep-Alive;如果server方 也想支持長鏈接,則在response中也需要明確說明connection的值為Keep-Alive。

         

        取值為【Close】:若 client使用http1.1協(xié)議,但又不希望使用長鏈接,則需要在header中指明connection的值為close;如果server方 也不想支持長鏈接,則在response中也需要明確說明connection的值為close。

         

         不論request還是response的header中包含了值為close的connection,都表明當(dāng)前正在使用的tcp鏈接在當(dāng)天請求處理完畢后會被斷掉。以后client再進(jìn)行新的請求時就必須創(chuàng)建新的tcp鏈接了。

         

        • User-Agent

         

        User-Agent 用一個字符串表示發(fā)起請求的http客戶端,服務(wù)器可以依據(jù)它來返回瀏覽器最適合的頁面。

         

        但由于歷史的原因,User-Agent 非常混亂,每個瀏覽器都自稱是“Mozilla”“Chrome”“Safari”,企圖使用這個字段來互相“偽裝”,導(dǎo)致 User-Agent 變得越來越長,最終變得毫無意義。

         

        不過有的比較“誠實”的爬蟲會在 User-Agent 里用“spider”標(biāo)明自己是爬蟲,所以可以利用這個字段實現(xiàn)簡單的反爬蟲策略。

         

        • Accept

         

        Accept 標(biāo)記客戶端可以識別的MIME type,若支持多個類型的話,則用逗號進(jìn)行分割;這樣讓服務(wù)端選擇適合的類型進(jìn)行返回。

         

        例如 如下這個Accept 結(jié)構(gòu):

         

        Accept: text/html,application/xml,image/webp,image/png
         

        這表示:告訴服務(wù)端,我(客戶端)支持四種類型,HTML、XML 的文本,還有 webp 和 png 的圖片,你需要按照我支持的類型進(jìn)行返回,其他的類型我不認(rèn)識。

         

        • Accept-Encoding

         

        Accept-Encoding 表示客戶端支持的壓縮格式,例如gzip、deflate等,如果支持多個的話,也是以逗號進(jìn)行分割。服務(wù)端就會按照客戶端支持的壓縮格式選擇其中一種來進(jìn)行壓縮。

         

        例如 如下Accept-Encoding 結(jié)構(gòu):

         

        Accept-Encoding: gzip, deflate, br
         

        這表示:告訴服務(wù)端,我(客戶端)支持的壓縮格式有三種,你需要按照我支持的壓縮格式進(jìn)行壓縮返回。

         

        • Accept-Language

         

        Accept-Language 表示客戶端支持的自然語言,如果支持多個話,也是以逗號進(jìn)行分割。

         

        例如 如下Accept-Language 結(jié)構(gòu)

         

        Accept-Language: zh-CN, zh, en
         

        這表示:告訴服務(wù)端,我(客戶端)支持的自然語言有三種,但最后以zh-CN 格式給我,如果沒有就用其他的漢語方言,如果還沒有就給英文。

         

        • Content-Type

         

        content-type 標(biāo)記客戶端中實體字段類型,指明body數(shù)據(jù)的類型,如果使用POST請求的話,需要添加上該字段屬性。

         

        例如 如下Content-Type 結(jié)構(gòu)

         

        Content-Type: application/json
         

        這表示:告訴服務(wù)端,我(客戶端)傳輸?shù)臄?shù)據(jù)類型為application/json格式,你需要按照此格式類型進(jìn)行解析數(shù)據(jù)。

         

        到這里,http請求報文的細(xì)節(jié)已經(jīng)到達(dá)尾聲了,接下來,一起看一下http響應(yīng)報文那些事兒~~~


        http響應(yīng)行

         

        聊完了http請求行、請求頭部的一些字段屬性,那么接下里聊一聊http響應(yīng)報文的響應(yīng)行、響應(yīng)頭部。首先,我們先聊一聊響應(yīng)行,格式如下所示:

         

         

        由圖可知,響應(yīng)行由三部分組成:

         

        • 版本號http協(xié)議版本號。

         

        • 狀態(tài)碼一個三位數(shù),用代碼的形式表示處理的結(jié)果,比如 200 是成功,500 是服務(wù)器錯誤。

         

        • 原因作為數(shù)字狀態(tài)碼補充,是更詳細(xì)的解釋文字,幫助人理解原因。

         

        舉例說明一下響應(yīng)行:

         

        HTTP/1.1 200 OK
         

        這表示:瀏覽器你好,我已經(jīng)處理完了你的請求,這個報文使用的協(xié)議版本號是 1.1,狀態(tài)碼是 200,一切OK?!?/span>


        http響應(yīng)頭部

         

        說完了響應(yīng)行,那么接下來看一下http的響應(yīng)頭部。下面這張圖展示了http響應(yīng)報文所包含的信息,也會借此圖詳細(xì)說明每個header信息的作用及其含義。

         

         

        • Server

         

        Server 響應(yīng)字段,它告訴客戶端正在提供web服務(wù)的軟件名稱和版本號,但這個字段不是非必須的,一般網(wǎng)站都不會暴露自己真實的服務(wù)名稱,反正黑客進(jìn)行攻擊,一般會填寫無關(guān)緊要的信息,比如 Nginx.com。

         

        比如GitHub網(wǎng)址,server 字段中看不出是使用了nginx還是Apache。server字段如下:

         

        Server: GitHub.com
         
        • Date

         

        Date 表示http報文創(chuàng)建的時間,目的讓客戶端使用該字段和其他字段配合起來決定緩存策略。

         

        • Content-Type

         

        Content-Type 標(biāo)記服務(wù)端返回給客戶端的結(jié)構(gòu)類型,和請求頭部中的Content-Type使用方式一樣。

         

        例如 Content-Type格式如下

         

        Content-Type: application/json
         

        這表示:服務(wù)端返回給客戶端的數(shù)據(jù)結(jié)構(gòu)類型為application/json。

         

        • Content-Length

         

        Content-Length 報文里body 的長度,也就是請求頭或響應(yīng)頭空行后面數(shù)據(jù)的長度。服務(wù)器看到這個字段,就知道了后續(xù)有多少數(shù)據(jù),可以直接接收。如果沒有這個字段,那么 body 就是不定長的,需要使用 chunked 方式分段傳輸。

         

        • Content-Language

         

        Content-Language 告訴客戶端實體數(shù)據(jù)使用的實際語言類型

         

        • Content-Encoding

         

        Content-Encoding 告訴客戶端實體數(shù)據(jù)是使用那個壓縮格式進(jìn)行壓縮的

         

        到這里,http響應(yīng)報文的細(xì)節(jié)已經(jīng)到達(dá)尾聲了,相信大家都有不一樣的體會~~~


        總結(jié)

         

        今天我們聊了一下http報文那些事兒,在這兒做一個簡單的小結(jié)。

         

        • http報文結(jié)構(gòu)由三部分組成:起始行+頭部字段集合+消息主體

         

        • http報文可以沒有消息主體,但一定有起起始行+頭部字段集合

         

        • 請求報文中請求行由三部分組成:請求方法+請求URI資源地址+http協(xié)議版本號

         

        • 響應(yīng)報文中響應(yīng)行由三部分組成:http協(xié)議版本號+狀態(tài)碼+原因

         

        • 頭部字段是 key-value 的形式,用“:”分隔,不區(qū)分大小寫,順序任意,除了規(guī)定的標(biāo)準(zhǔn)頭,也可以任意添加自定義字段,實現(xiàn)功能擴(kuò)展

         

        • http請求頭字段中常用的字段:Host、Accept、Accept-Encoding、Accept-Language、Content-Type、Connection

         

        • http響應(yīng)字段中常用的字段:Server、Date、Content-Type、Content-Language、Content-Encoding、Content-Length

         

         

        讀到這里,相信大家也對http報文有了不一樣的理解。好了,今天就到這里,我們下期再見~~~

         

        我叫邁莫,普普通通的互聯(lián)網(wǎng)打工人



        分割線




        往期推薦


        http到底有什么魔性,備受青睞

        elasticsearch入門篇

        go語言十分鐘入門教程

        你真的知道怎么實現(xiàn)一個延遲隊列嗎?

        mysql那些事兒|深入淺出mysql索引(上)

        【七天從零實現(xiàn)ORM框架】Day06:用戶CRUD操作API

        面試官常問的redis數(shù)據(jù)結(jié)構(gòu),建議收藏


        文章也會持續(xù)更新,可以微信搜索「 邁莫coding 」第一時間閱讀。每天分享優(yōu)質(zhì)文章、大廠經(jīng)驗、大廠面經(jīng),助力面試,是每個程序員值得關(guān)注的平臺。




        1. 你點的每個贊,我都認(rèn)真當(dāng)成了喜歡
        瀏覽 70
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 好紧好爽好舒服 | 韩国成人啪啪无码高潮 | 娇妻被别人调教成绿奴电影 | 91久久国产露脸精品国产吴梦梦 | 一本色道久久88亚洲综合加勒比 |