真正「搞」懂http協議01 背景故事

2022-07-12 09:03:11 字數 4367 閱讀 9683

http是前後端溝通的橋梁,無論是前端還是後端,都是極為重要的基礎知識。大多數前端開發只關注頁面布局好不好,css簡不簡潔,js的可讀性可復用性是不是還行,框架用的熟不熟練。但是我覺得像http這種基礎知識是十分重要的。也是程式設計師生涯中無法迴避的問題。

一、http含義

http的大名叫做超文字傳輸協議hypertexttransferprotocol),那麼什麼是超文字傳輸協議呢?我們先從字面意思來理解,就是傳輸「超文字」的協議。比方說a和b兩個人,每個人手裡都有乙份檔案叫做「超文字」,a按照「協議」把「超文字」檔案「遞給(傳輸)」b。這就是超文字傳輸協議的乙個比較形象的說明。那麼,a按照協議傳遞給b的是超文字,協議我們比較容易理解,就是一種規則嘛...我們在a和b之間傳遞「超文字」的時候要遵守這種規則。就像是你開車不能喝酒,酒駕被抓輕則扣分重則拘留。所以大家一定要注意開酒不喝車,喝車不開酒,至理名言啊。那麼協議我們理解了,那什麼是超文字呢?超文字就是超級文字!說的真有道理....哎呦...住手..不對...住腳...輕點踢...哎呦...確實是這樣的。文字我們知道,可以解釋為有**內容的檔案。那麼超級文字(hypertext)是啥子呢?嘿...這個就比較有意思了。超文字簡單來說就是文字內容中有超連結(hyperlink)的文字,你點選超連結就可以跳轉到其它內容。這就是超文字了。超文字的格式有很多,目前最常用的就是超文字標記語言。唉?超文字標記語言?聽著有點耳熟啊?超文字標記語言(hypertextmarkuplanguage)。臥槽,就是html嘛?是的...沒錯。我們走了一小圈,繞到了這裡。用一句話來解釋http就是,用來在網頁(小a和小b)間傳遞(傳輸)html(超文字)的一種規則(協議)。

二、http從出生到現在

我們了解了http的名字是什麼含義,就像是張全蛋、王二嘎這種名字也都是父母在起名時賦有深刻寓意在裡面的。所以我們了解人家名字的含義更有助於我們了解其本身,還是十分必要的。那麼我們再來看看http從出生到成長的人生歷程。

2023年我們的http0.9版本終於誕生(發布),當然,在發布之前還必須「懷胎十月」,但是我們不去糾結人家是怎麼懷上的,我們來糾結一下生下來之後都發生了什麼。剛出生的http還比較年幼,好吧,廢話了,誰出生的時候不年幼...所以它的能力還並不是很強。只有乙個get技能,並且還只能傳遞html格式的字串,比如今天的json啊,xml啊,txt啊什麼的。想都別想。畢竟我年紀還小啊。。。要求這麼多。。。真是的。並且在0.9版本,每個http請求都是短鏈結(後面會具體介紹什麼是短鏈結)。

時間飛逝,我們來到了2023年,此時在5年的時間中,http一邊工作,一邊成長,終於,http1.0版本產生了,我們的小朋友也長大了,有了更多的社會閱歷和見解,隨之而來的,它的能力也提公升了不少。此時的http擁有了更多的技能,post和head。擁有了更多的功能,包括我們現在耳熟能詳的狀態碼(status code)、快取(cache)、重定向(redirect)、許可權(authorization)等等一大堆的內容。此時的http可以說成長為了乙個可以支撐起一片天地的一家之主了。

時間繼續慢慢悠悠的走,此時大概過了半年左右,http的成長極為迅速。在2023年初,http1.1發布了,此時的http技能更加的多,比如像options,put, delete, trace, connect等方法。要知道,http1.1是我們目前最為常用的http版本。

再簡單說一下http2https吧,其實大家可以發現,現在普遍的瀏覽器網域名稱位址前的http都已經變為了https,簡單來說,https就是http的安全版本,其實https就是加密資料過後的http,使網路傳輸的資料更加安全,而加密的過程實際上就是在七層網路模型中的表示層和會話層來完成的,而http2其實是為了適應當代瀏覽器及網路發展速度而產生的乙個各方面效能都更好的http版本。

三、網路模型

我們的目的不是搞懂整個網際網路絡模型,而是在學習http前極為必要的「背景故事」之一,所以,我會簡單介紹一下網際網路絡模型。咱們先來看張圖:

圖中左邊的是五層網路模型,中間是七層網路模型,最右邊是每一層的作用。實際上,七層網路模型不過是在應用層中又細分出了表示層和會話層。如果大家想要深入了解整個網際網路模型的過程及具體的內容,大家可以去看一下阮一峰老師的網際網路協議入門(一)。也可以自己取查詢資料。這不是本系列的重點。要知道這是乙個龐大的知識體系。

我們每一次傳送的網路請求在客戶端都是從上至下,到了伺服器端再從下至上的乙個過程。當然,從伺服器返回到客戶端的響應也是在伺服器端從上至下,到客戶端再從下至上的獲取到。也就是說,**傳輸出去的,就是從應用層直到物理層,**接收的,就是從物理層直到應用層。

四、三次握手

在客戶端與伺服器傳送http請求及返回響應的過程中,我們需要建立乙個確保http可以傳遞的通道,也就是傳輸層所建立起來的tcp connection。在連線已經建立之後,我們才可以完成http的請求與響應。那麼如何才能確定tcp connection已經建立了呢?那麼就需要通過三次握手,來確定連線已經建立。我們來看張圖,了解一下三次握手是如何工作的:

首先客戶端傳送乙個資料報,包的內容是乙個標誌位syn和乙個隨機數seq,然後傳送給伺服器。這時候伺服器知道了,噢這個客戶端想要請求連線,那麼就會返回乙個新的資料報,同樣的包括syn,並且再返回乙個ack標誌位,並在接收到的seq基礎上+1作為ack的值返回,重新生成乙個新的隨機數seq傳遞給客戶端,意思是我確實收到了這個請求。客戶端此時收到了第二次返回的資料報,於是再告訴伺服器我收到了你得資訊,把計算後的ack和新生成的seq再傳遞給伺服器。至此,三次握手完成,可以進行http請求了。

五、uri—url、urn

在開始http真正的內容之前,我們還需要了解一下什麼是uri、url以及urn。因為我們幾乎所有的http請求都是通過url來完成的。所以我們有必要了解一下url相關的知識。

uri統一資源標誌符(uniform resource identifier),是乙個用於標識某一網際網路資源名稱的字串。

url統一資源定位符(uniform resource locator),如同在網路上的門牌,是網際網路上標準的資源的位址。

urn統一資源名稱(uniform resource name),期望為資源提供持久的、位置無關的標識方式,並允許簡單地將多個命名空間對映到單個urn命名空間。

urn我們並不常見,做個了解就行了。

六、報文格式

我們先來看一張圖,這張圖是我在網上隨便找的乙個http請求的截圖:

大家可以自己開啟瀏覽器的f12,在netwrok隨便找乙個請求看一下, 那麼這是所有的「請求」資訊。包括通用資訊(general)以及請求頭(request header)和響應頭(response header)。但是可能你看到的跟我截圖中的不一樣。這是因為瀏覽器為我們做了格式化,讓我們可以更快速的獲取到想要的資訊。你點一下下圖中的按鈕,就可以看到source資訊,而不是parsed後的資訊了。

第一張圖中的紅框部分,就是我們的起始行,在view parsed的時候,我們的瀏覽器把起始行省略掉了,只留下了報文首部,也就是紅框外的其它部分。除了起始行和首部外還有乙個主體,就是我們伺服器返回的響應的內容,我們可以在preview中檢視格式化後的主體內容。

上面的內容講解的都十分基礎,沒有深入的去探索,但是對於我們接下來學習http是足夠且必要的前提。如果大家想要深入了解其中的每一項內容,可以自行查詢資料。網路上有關的內容還是相當多的。那麼,本文到這裡就結束了,下面會開始http的正式內容。還望大家準時搬好小板凳,不要遲到噢。

最後,由於本人水平有限,能力與大神仍相差甚遠,若有錯誤或不明之處,還望大家不吝賜教指正。非常感謝!

搞懂http協議(一)

http定義了瀏覽器怎樣向全球資訊網伺服器請求全球資訊網文件,以及伺服器怎樣把文件傳給瀏覽器。http是面向事務的。http協議的特點 簡單 快速 無連線 無狀態。http與tcp之間的關係 http中的握手與揮手 http是屬於應用層的,在http的請求與響應之間是通過tcp來實現的,因此http...

HTTP協議 01 請求 響應

http請求 http請求由三部分 請求行 請求頭域 請求正文 約定的請求結構 請求行 請求方法 method 方法 描述get 請求uri標識的資源 post 請求uri標識的資源並傳遞資料 head 請求獲取由uri標識的資源的響應訊息報頭 put請求儲存乙個資源,類似ftp中的put dele...

HTTP協議 01 請求 響應

http請求 http請求由三部分 請求行 請求頭域 請求正文 約定的請求結構 請求行 請求方法 method 方法 描述get 請求uri標識的資源 post 請求uri標識的資源並傳遞資料 head 請求獲取由uri標識的資源的響應訊息報頭 put請求儲存乙個資源,類似ftp中的put dele...