真正“搞”懂http協議01—背景故事


  去年讀了《圖解HTTP》、《圖解TCP/IP》以及《圖解網絡硬件》但是讀了之后並沒有什么深刻的印象,只是有了一層模糊的脈絡,剛好最近又接觸了一些有關http的相關內容。所以,就打算把它寫成一個系列,一方面可以讓自己對http的理解更為深入。也可以為不懂不會http的同學在學習的路上先把荊棘剔除,以便學習的路更加的快速順暢。

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

一、http含義

  http的大名叫做超文本傳輸協議HyperText Transfer Protocol),那么什么是超文本傳輸協議呢?我們先從字面意思來理解,就是傳輸“超文本”的協議。比方說A和B兩個人,每個人手里都有一份文件叫做“超文本”,A按照“協議”把“超文本”文件“遞給(傳輸)”B。這就是超文本傳輸協議的一個比較形象的說明。那么,A按照協議傳遞給B的是超文本,協議我們比較容易理解,就是一種規則嘛...我們在A和B之間傳遞“超文本”的時候要遵守這種規則。就像是你開車不能喝酒,酒駕被抓輕則扣分重則拘留。所以大家一定要注意開酒不喝車,喝車不開酒,至理名言啊。那么協議我們理解了,那什么是超文本呢?超文本就是超級文本!說的真有道理....哎呦...住手..不對...住腳...輕點踢...哎呦...確實是這樣的。文本我們知道,可以解釋為有圖文內容的文件。那么超級文本(Hypertext)是啥子呢?嘿...這個就比較有意思了。超文本簡單來說就是文本內容中有超鏈接(Hyperlink)的文本,你點擊超鏈接就可以跳轉到其它內容。這就是超文本了。超文本的格式有很多,目前最常用的就是超文本標記語言。唉?超文本標記語言?聽着有點耳熟啊?超文本標記語言(HyperText Markup Language)。卧槽,就是HTML嘛?是的...沒錯。我們走了一小圈,繞到了這里。用一句話來解釋HTTP就是,用來在網頁(小A和小B)間傳遞(傳輸)HTML(超文本)的一種規則(協議)。

二、http從出生到現在 

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

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

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

  時間繼續慢慢悠悠的走,此時大概過了半年左右,http的成長極為迅速。在1997年初,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命名空間。

  其實URL和URN是URI的子集,我們看一張圖,圖片來源維基百科相關條目:

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

六、報文格式

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

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

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

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

 

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


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com