天天看點

詳談HTTP協定和HTTPS以及HTTP2.0

前言

詳談之前,先講一下本文可能有點長,但是很通俗。學習嘛,無非就是一個耐心,其實生活亦是如此。。。。

1、HTTP的發展曆史

1、1989年HTTP 協定始于三十年前蒂姆·伯納斯 - 李的一篇論文;URI:即統一資源辨別符,作為網際網路上資源的唯一身份;HTML:即超文本标記語言,描述超文本文檔;HTTP:即超文本傳輸協定,用來傳輸超文本。這哥們算是寫了第一行web代碼。

2、HTTP/0.9 是個簡單的文本協定,隻能擷取文本資源;

3、1996年NCSA(美國國家超級計算應用中心)HTTP/1.0 确立了大部分現在使用的技術,但它不是正式标準;

4、1999年推出HTTP/1.1 ,也是目前網際網路上使用最廣泛的協定,功能也非常完善;

5、2015年HTTP/2 基于 Google 的 SPDY 協定,注重性能改善,但還未普及;

6、2018年HTTP/3 基于 Google 的 QUIC 協定,是将來的發展方向。

詳談HTTP協定和HTTPS以及HTTP2.0
這裡隻記錄了發展的幾件大事,其中裡面有很多有趣的故事,
 比如網景公司跟微軟的浏覽器大戰推動了http1.0出現,然後火狐誕生了,騰訊,網易,搜狐等等網際網路公司也如雨後春筍一般
 這其實也為後來的網絡發展奠定了基礎,Google也是通過浏覽器推廣推動了http2.0
           

2、HTTP是什麼?HTTP又不是什麼?

HTTP 就是超文本傳輸協定,也就是 HyperText Transfer Protocol,估計這是一個萬金油的答案。如果面試這麼回答面試官,肯定會被一通追問

詳談HTTP協定和HTTPS以及HTTP2.0
BOSS立馬追問
你是怎麼了解 HTTP 字面上的“超文本”和“傳輸協定”的?
能否談一下你對 HTTP 的認識?越多越好。
HTTP 有什麼特點?有什麼優點和缺點?
HTTP 下層都有哪些協定?是如何工作的?
……

是不是這個時候就有點懵?

其實協定是對參與者的一種行為約定和規範,協定意味着有多個參與者為了達成某個共同的目的而站在了一起,除了要無疑義地溝通交流之外,還必須明确地規定各方的“責、權、利”,約定該做什麼不該做什麼,先做什麼後做什麼,做錯了怎麼辦,有沒有補救措施等等。

其次HTTP 是一個“傳輸協定”,所謂的“傳輸”(Transfer)其實很好了解,就是把一堆東西從 A 點搬到 B 點,或者從 B 點搬到 A 點,即“A<===>B”。

除了“協定”和“傳輸”,現在,我們終于到 HTTP 字面裡的第三部分:“超文本”。

所謂“超文本”,就是“超越了普通文本的文本”,它是文字、圖檔、音頻和視訊等的混合體,最關鍵的是含有“超連結”,能夠從一個“超文本”跳躍到另一個“超文本”,形成複雜的非線性、網狀的結構關系。不像TCP/UDP這些底層協定裡被切分的雜亂無章的二進制包(010100101010010101)。

簡單點說就是:這就是一個合同(協定),一切都按合同辦事(規範),辦事是雙方的,你給我辦事,我也給你辦事(傳輸),辦的都是人事,都看的懂(超文本)

HTTP不是什麼?

HTTP 不是網際網路。

HTTP 不是作業系統。

HTTP 不是程式設計語言。

HTTP 不是 HTML。

HTTP 不是一個孤立的協定。

HTTP 通常跑在 TCP/IP 協定棧之上,依靠 IP 協定實作尋址和路由、TCP 協定實作可靠資料傳輸、DNS 協定實作域名查找、SSL/TLS 協定實作安全通信。此外,還有一些協定依賴于 HTTP,例如 WebSocket、HTTPDNS 等

3、與HTTP相關的各種概念

1、CDN 浏覽器和伺服器是 HTTP 協定的兩個端點,那麼,在這兩者之間還有别的什麼東西嗎?當然有了,浏覽器通常不會直接連到伺服器,中間會經過“重重關卡”,其中的一個重要角色就叫做 CDN。它應用了 HTTP 協定裡的緩存和代理技術,代替源站響應用戶端的請求,簡單來說,它可以緩存源站的資料,讓浏覽器的請求不用“千裡迢迢”地到達源站伺服器,直接在“半路”就可以擷取響應。如果 CDN 的排程算法很優秀,更可以找到離使用者最近的節點,大幅度縮短響應時間。簡單說就是,你想吃飯,外賣小哥直接把飯送到你家,省得你去賣菜買米還要自己燒。

2、TCP/IP TCP/IP 協定是目前網絡世界“事實上”的标準通信協定,

這個協定棧有四層,最上層是“應用層”,最下層是“連結層”,TCP 和 IP 則在中間:TCP 屬于“傳輸層”,IP 屬于“網際層”。

IP 協定是“Internet Protocol”的縮寫,主要目的是解決尋址和路由問題,以及如何在兩點間傳送資料包。IP 協定使用“IP 位址”的概念來定位網際網路上的每一台計算機。可以對比一下現實中的電話系統,你拿着的手機相當于網際網路上的計算機,而要打電話就必須接入電話網,由通信公司給你配置設定一個号碼,這個号碼就相當于 IP 位址。

TCP 協定是“Transmission Control Protocol”的縮寫,意思是“傳輸控制協定”,它位于 IP 協定之上,基于 IP 協定提供可靠的、位元組流形式的通信,是 HTTP 協定得以實作的基礎,網際網路上的 HTTP 協定就運作在了 TCP/IP 上,HTTP 也就可以更準确地稱為“HTTP over TCP/IP”。

3、DNS 上面說的IP實際結構可能是192.168.0.1這樣一串數字,可實際應用中,誰願意去記住你這一串數字,大家更願意記住www.taobao.com,這樣一個域名,但想要使用 TCP/IP 協定來通信仍然要使用 IP 位址,是以需要把域名做一個轉換,“映射”到它的真實 IP,這就是所謂的“域名解析”。

不要急,文章下面的會詳細介紹域名解析,罒ω罒。

4、URI/URL 就是我們俗稱的網址,其實URL是URI的一個子集,好比URI是淘寶,URL就是www.taobao.com,實際混着用也沒啥關系。

5、HTTPS 我們知道HTTP是明文傳輸的,就是你能看見所有的傳輸資訊,當然這樣就不安全。是以我們可以給他加密,加密協定是SSL/TLS,關于SSL/TLS文章下面的也會詳細介紹。注意看,現在你浏覽的CSDN浏覽器上面最左邊有一個🔐,那就代表加密。

4、七層協定和四層協定

所謂的4層和7層隻不過是兩個不同的概念而已。

我們通常說的四層協定,就是TCP/IP 網絡分層模型

詳談HTTP協定和HTTPS以及HTTP2.0

第一層叫“連結層”,工作在網卡這個層次,使用 MAC 位址來标記網絡上的裝置,你可以把你家路由器背面那個說明看一下,上面就有一個Mac位址,我們用的釘釘WiFi打卡,實際就是識别WiFi的Mac位址是否符合要求。實作異地打卡實際就是改Mac位址。

第二層叫“網際層” ,這一層就是IP協定,IP協定就是上面識别你的位址,文章上面講過了,就不再啰嗦了。

第三層叫“傳輸層” tcp協定,就是一個傳輸過程,你打電話裡面說的話,你上網發的資訊内容都是基于這個傳輸的。

第四層叫“應用層” 最上一層就是HTTP協定,内容得遵守共同的協定才能被讀懂,HTTP就負責幹這事。

舉一個通俗的例子,就是你寄好吃的給我,Mac位址就代表你們小區位址,IP就代表你家門牌号,tcp就是快遞員,HTTP就是這個包裹這個好吃的快遞包裹

七層協定,OSI 網絡分層模型

詳談HTTP協定和HTTPS以及HTTP2.0

第一層:實體層,網絡的實體形式,例如電纜、光纖、網卡、集線器等;

第二層:資料鍊路層,它基本相當于 TCP/IP 的連結層;

第三層:網絡層,相當于 TCP/IP 裡的網際層;

第四層:傳輸層,相當于 TCP/IP 裡的傳輸層;

第五層:會話層,維護網絡中的連接配接狀态,即保持會話和同步;

第六層:表示層,把資料轉換為合适、可了解的文法和語義;

第七層:應用層,面向具體的應用傳輸資料

詳談HTTP協定和HTTPS以及HTTP2.0

還是上面那個例子,其實所謂的7層,就是4層的詳細版,7層就是實體層就代表你家附近最近的一個快遞站點,後面回話層,表示層和應用層就是教你怎麼拿快遞,拆快遞,使用快遞。

其實四層足以了解這個過程

詳談HTTP協定和HTTPS以及HTTP2.0

5、域名

前面我們講到域名解析,隻是知道這個是DNS把一串字母轉成一串數字,這個過程是怎樣的呢?

其實域名解析過程片面講,還是很簡單就是,我拿www.apple.com舉例子

.com 是根域名伺服器,

apple.com是頂級域名伺服器,

www.apple.com是權威域名伺服器.

詳談HTTP協定和HTTPS以及HTTP2.0

理論上通路www.apple.com是先去.com->apple.com->www.apple.com

最後轉成最終ip

但是如果每個都這麼找,那不得慢死麼,不用怕,這裡面每一層都有”緩存“

首先回去我的本機去找,比如我用的Mac裡是“/etc/hosts”,在 Windows 裡是“C:\WINDOWS\system32\drivers\etc\hosts”

然後還有系統緩存,然後各級代理緩存和DNS伺服器,比如我們買的阿裡雲費武器,裡面就已經配好域名和ip。

6、三次握手和四次揮手

詳談HTTP協定和HTTPS以及HTTP2.0

三次握手和四次揮手:

浏覽器在給服,務器傳輸資料之前,有三次握手,握手成功之後,才可以傳輸資料

1、浏覽器需要先發送SYN碼,用戶端請求和伺服器建立連接配接;

2、伺服器接收到SYN碼,再發送給用戶端SYN+ACK碼,我可以建立連接配接;

3、用戶端接收到ACK碼,驗證這個ACK是否正确,如果正确則用戶端和服務端則建立起資料連接配接;雙方的資料發送通道都将開啟;

打個比方吧,三握手就是兩個人打電話,撥号就是第一次握手,然後你說”hello“,就是第二次握手,對面也說”hello“,就是第三次握手

四次揮手:

1、當用戶端無資料要傳輸了,會發送FIN碼告訴伺服器,我發送完畢了;

2、當服務端接收完畢後,告訴用戶端ACK碼,告訴用戶端你可以把資料通道關閉了;

3、當伺服器發送完畢之後,也會發送FIN碼,告訴浏覽器,資料發送完畢;

4、當用戶端接收完畢 之後,同樣發送ACK碼,告訴伺服器,資料接收完畢,你可以關閉;

而四次揮手更是有”禮貌“

當你玩英雄聯盟開黑,你說”下了“(第一次),你的兄弟得知這個悲傷的消息,回了一個"嗯"(第二次),然後也說了一個"那我也下了"(第三次),你也說“嗯”(第四次)

7、HTTP封包

HTTP協定核心是什麼?沒錯,就是封包。

HTTP 協定的請求封包和響應封包的結構基本相同,

由三大部分組成:

起始行,描述請求或響應的基本資訊;

頭部字段集合header,使用 key-value 形式更詳細地說明封包;

消息正文body,實際傳輸的資料,它不一定是純文字,可以是圖檔、視訊等二進制資料。

在HTTP/1.1裡面規定唯一必須要出現的字段就是host,其實這個也很好了解,你寄快遞,别的可以不填,起碼位址得有吧

然後其他的就是一些狀态碼(301 404 500…),請求方式(GET POST DELETE PUT)等等,也沒啥好說的。

8、HTTP特點

HTTP有啥特點呢,有沒有什麼缺點呢?總結了下面幾點,至于優點缺點你不評價。

1、靈活可擴充,就比如請求頭除了host,你可以任意擴充。

2、可靠傳輸,基于 TCP/IP

3、萬能協定,像FTP協定隻能上傳檔案,SMTP隻能發郵件,但這些貌似HTTP都可以做,線上上傳功能,線上QQ郵箱不要太常見

4、無狀态,第一次請求和第二次請求毫無關系,比如一個系統每次都要判斷登入狀态(cookie完美解決了這個問題)

5、請求應答模式,用戶端每次請求,服務端都被動回答

6、明文傳輸,安全不夠好,但是簡單明了,開發調試友善

7、性能,不算好,但是現在目前大家網絡帶寬和硬體都不差

8、跨語言、跨平台,java php go等等沒有誰說不支援HTTP吧

9、HTTPS

………後續補充…………

10、SSL和TLS

………後續補充…………

11、HTTP2核心過程

①由于HTTP2連接配接建立在TCP,TLS之上,TLS 握手成功之後,用戶端必須要發送一個“連接配接前言”,用來确認建立 HTTP/2 連接配接。

連接配接前言
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n
           

②和HTTP1.1請求一樣,HTTP2也有header和body,但是會HPACK壓縮,并且少了那些HTTP起始行裡面的URL,狀态碼等等。

③二進制幀,幀類型分成資料幀和控制幀兩類,并且是可以擴充的, Google 的 gRPC留就是自己定義的新的幀類型

詳談HTTP協定和HTTPS以及HTTP2.0

12、HTTP2特點

1、完全相容HTTP1.1,方法、URI、狀态碼、頭字段等概念都保留不變

2、頭部壓縮,開發了專門的“HPACK”算法,在用戶端和伺服器兩端建立“字典”,用索引号表示重複的字元串

3、二進制格式,原來的“Header+Body”的消息“打散”為數個小片的二進制“幀”(Frame),用“HEADERS”幀存放頭資料、“DATA”幀存放實體資料,資料分幀後“Header+Body”的封包結構就完全消失了,協定看到的隻是一個個的“碎片”。

4、虛拟流

詳談HTTP協定和HTTPS以及HTTP2.0

5、伺服器推送,改變了傳統的“請求 - 應答”工作模式,建立“流”主動向用戶端發送消息。

小結:http、https、http2協定棧差別(大同小異)

詳談HTTP協定和HTTPS以及HTTP2.0

繼續閱讀