HTTP-點開瀏覽器輸入網址背後發生的那點事

 

前言

Internet最先來源於美國國防部ARPANet,1969年投入運行,到如今已有很長一段路了,各位想要了解發展史能夠百度下,這裏就很少說了。android

現現在當咱們想要獲取一些資料,首先是打開某個瀏覽器,在地址欄輸入地址,想要的信息出如今你的面前。web

你們有沒有想過輸入地址就能返回給你想要的信息是怎麼實現的呢?瀏覽器

下面就來簡單說下它的實現流程,不過在這以前先來了解下HTTP基本概念以下緩存

HTTP基本概念

在這引用http://www.zsythink.net/archives/76

這是一篇爲初學者準備的文章,因此做者會盡可能從基礎出發,儘可能細緻的描述每個細節,以求讓初學者不會一頭霧水,有必定基礎的同窗就不用看了,以避免浪費你的時間。服務器

 

假設博主今天春心蕩漾,想要訪問一些不可描述的小網站,因而,博主悄悄的打開了瀏覽器,在瀏覽器的地址欄中輸入了一個小網站的網址,多線程

此處假設這個小網站的網址爲 www.zsythink.net ,當博主輸入了這個網址之後,瀏覽器中就顯示了博主想要看到的內容,整個過程以下圖所示。學習

   201803

那麼,瀏覽器返回給咱們的內容是怎麼產生的呢?

這些內容確定不是憑空產生的,而是有人爲咱們準備了這些內容,當咱們在瀏覽器的地址欄中輸入網址之後,網站

這些提早準備好的內容便可返回到瀏覽器中,以便有須要的人可以查看到這些內容,spa

而查看這些內容的人就是咱們日常所說的"客戶",客戶每每會經過"客戶端程序"去請求、查看這些內容,.net

咱們最常使用的客戶端程序就是瀏覽器了,因此,在以後的http相關的文章中,

若是沒有特別說明,咱們所說的"客戶端"就是指"瀏覽器",咱們使用客戶端去查看咱們想要的內容,

而提供內容的一端被稱爲"服務端",看成爲客戶時,咱們須要在電腦上安裝客戶端軟件(即瀏覽器),

經過客戶端軟件查看咱們想要的內容,而做爲提供內容的人,也須要在服務端的計算機上安裝對應的軟件,

才能爲咱們提供服務,而服務端的計算機就是咱們常說的"服務器",安裝在服務器上的、爲咱們提供內容的軟件被稱之爲"web服務器軟件"。

 

因此,綜上所述,咱們能夠了解到以下名詞

注:以下名詞的解釋均針對http而言,在後面的文章中咱們會解釋什麼是http,此處不用糾結

客戶端:客戶端一般是指瀏覽器,好比谷歌瀏覽器、火狐瀏覽器、IE等,瀏覽器安裝在客戶使用的電腦上,因此,在描述http時,客戶端一般也代指那些安裝了瀏覽器的電腦。

服務端:服務端一般是指那些安裝了"web服務軟件"的計算機,這些服務端的計算機被稱爲服務器。

 

沒錯,聰明如你必定想到了,說白了,客戶端與服務端就是兩臺電腦,分別安裝了不一樣的軟件,服務端提供內容,客戶端查看內容。201801

 

因此,當咱們訪問網頁時,大體的過程以下圖所示。

 

201802

 

客戶端與服務端既然可以通信,那麼證實它們之間必定是經過某種方法進行溝通的,就像你我之間可以進行溝通同樣。

舉例說明

你和我都說漢語,因此,當我說"蘋果"這個詞的時候,你就會想到一種水果,或者想到一個手機品牌,

可是當我對一個美國人說"蘋果"兩個字時,他可能並不能理解我在說什麼,由於他可能聽不懂漢語,

若是我想要對他表達"蘋果"這個詞,我須要說"Apple",他纔會明白我說的是什麼,當我跟你聊天時,咱們都說漢語,

當兩個美國人聊天時,他們都說英語,這樣,纔能有效的溝通,總之,若是想要可以順暢的溝通,

溝通雙方都必須遵照相同的協議,咱們能夠把漢語理解成一種協議,把英語也理解成一種協議,

只要溝通雙方都遵照相同的協議,雙方就可以順暢的溝通,只要溝通雙方都遵照相同的協議,雙方就可以理解對方想要作什麼。

固然,之因此拿漢語、英語舉例,是爲了讓初學者可以更加容易的理解"協議"這個詞,可是請不要錯誤的覺得"協議"就是"語言",

之因此拿語言舉例,是爲了方便理解,說白了,"協議"能夠理解爲某種規則或者某種約定,

只要你們都嚴格按照這種約定行事,世界就會正常的運轉,好比"紅燈停,綠燈行"也能夠理解爲一種協議,

好比在馬路上都要靠右行駛(在中國),也是一種協議,好比在小飯館,你給老闆人民幣,老闆給你對應的餐食,

也是一種協議,"協議"的概念稍微有一些抽象,稍微有一些寬泛,此處大概有一個印象便可,在學習的過程當中,咱們本身就會慢慢的理解它了。

 

客戶端與服務端之間,也須要遵照某些相同的協議,纔可以順暢的通信,細心如你必定注意到了,我說的是"某些"協議,也就是說,雙方要遵照的協議不止有一種,它們須要同時遵照多種協議,纔可以正常的完成整個通信過程。

 

好比http協議,剛纔已經說過,不一樣的"層面"中,須要使用不一樣的協議,http協議就是應用層的一種協議,http協議是什麼意思呢?

http是HyperText Transfer Protocol的縮寫,HyperText Transfer Protocol譯爲"超文本傳輸協議"。

從字面上理解,這種協議是用來傳輸"超文本"的,咱們能夠暫且粗暴的將"超文本"理解成咱們所謂的"網頁"(這樣並不許確,可是方便理解),那麼,咱們能夠將http協議理解爲一種"網頁傳輸協議"。

一次完整的HTTP請求過程

web服務請求處理步驟

image

HTTP服務通訊過程

image

人性化HTTP請求相應圖

圖片來自:理解Http請求與響應

大體以下

域名解析 --> TCP3次握手 --> 發起http請求 --> 服務器響應http請求並傳輸數據 –>  瀏覽器解析並渲染呈現給用戶 –> TCP4次揮手

域名解析

當用戶在瀏覽器輸入https://www.cnblogs.com/時,瀏覽器會對此域名或主機進行解析,獲得對應的IP地址,那麼它時怎麼進行域名解析的呢?

一、首先先去本機hosts文件查找此FQDN沒有沒定義的指向所在的IP地址條目,若是找到,就結束解析

二、若是沒有找到,回去瀏覽器器自己DNS緩存裏去尋找,找打結束解析

三、沒有找到,會去本機配置的首選DNS服務器查詢,通常這是三大運營商提供的,經過UTP53端口發起請求,這個請求是遞歸查詢,DNS服務器收到請求後,會查詢自身緩存,找到條目而且沒有過時,就返回給用戶,結束解析。若是沒有找到,它會去找根服務器,全球13個根服務器(根服務器地址本機DNS服務器內置),詢問根服務器(你知不知道一個域名叫「www.cnblogs.com」的IP地址),根回覆說,(我不知道此域名的IP地址,但我知道com域的IP地址,你去詢問它吧),因而運行商提供的DNS服務器就去詢問com這個域,(你知不知道一個叫「www.cnblogs.com」域名IP地址),com域回答你說,(我不知道此域名的IP地址,但我知道「cnblogs.com域的IP地址,你去問他吧「),這是運行商DNS服務器,對cnblogs.com域發起請求詢問,(你知不知道一個叫」www.cnblogs.com「域的IP地址,它一查,發現此域,就是它負責的,就會對你說,此域是我負責的,它的IP是X.X.X.X這時運行商DNS服務器拿到地址,就會返回客戶主機內核,內核再返回給瀏覽器,到此解析結束,進行下一步。

固然這裏面還要涉及到IP –> MAC(物理地址)的解析

TCP3次握手

瀏覽器拿到域名對應的IP後,會拿一個隨機端口向WEB服務程序80端口發起TCP請求連接

image

備註:

SYN(synchronous創建聯機)

ACK(acknowledgement 確認)

PSH(push傳送)

FIN(finish結束)

RST(reset重置)

URG(urgent緊急)

Sequence number(順序號碼)

Acknowledge number(確認號碼)

舉例

A : 你好我是A,你能聽獲得我說話嗎?

B : 聽到了,我是B,你能聽到我說話嗎?

A : 能夠,聽到了

好創建鏈接,開始聊天!

過程

第一次握手:創建鏈接,客戶端將SYN標記爲1,seq標記爲x,並將SYN包發送到服務器,並進入SYN_SEND狀態,等待服務器確認;

第二次握手:服務器收到SYN,知道客戶端要創建連接,同時向客戶端也發送一個SYN包(SYN=1)和一個ACK包(ACK=1),隨機產生一個數seq=y,ack=x+1(客戶端的seq值x加1),來確認客戶端的SYN,並進入SYN_RECV;

第三次握手:客戶端收到服務器發來的SYN+ACK後,確認ack值,並回復服務器端一個ACK確認,發送完畢後,雙方進入ESTABLISHED狀態。

三次握手成功後,開始傳輸數據。

一個完整的三次握手也就是 請求---應答---再次確認

連接創建成功後,就要開始下一步,傳輸數據

 

HTTP請求相應處理

一、創建TCP鏈接:

接收或拒絕鏈接請求

發送請求報文

image

二、接收請求:

接收客戶端發來的請求報文中的信息對某資源的一次請求的過程

Web訪問響應模型(Web I/O)

1)單進程I/O模型:

啓動一個進程處理用戶請求,並且一次只處理一個,多個請求被串行響應

2)多進程I/O模型:

並行啓動多個進程,每一個進程響應一個鏈接請求

3)複用I/O結構:

啓動一個進程,同時響應N個鏈接請求

實現方法:    多線程模型和事件驅動

      多線程模型: 一個進程生成N個線程,每線程響應一個鏈接請求

      事件驅動:    一個進程處理N個請求

4)複用的多進程I/O模型:

啓動M個進程,每一個進程響應N個鏈接請求,同時接收M*N個請求

三、處理請求:

服務器對請求報文進行解析,並獲取請求的資源及請求方法等相關信息,根據方法,資源,首部和可選的主體部分對請求進行處理

image

HTTP經常使用請求方式,Method
GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS

四、訪問資源:

服務器獲取請求報文中請求的資源web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源

資源放在服務端特定的目錄下

備註:經過MAC地址和端口號肯定具體的應用程序

五、構建響應報文:

一旦Web服務器識別除了資源,就執行請求方法中描述的動做,並返回響應報文。響應報文中 包含有響應狀態碼、響應首部,若是生成了響應主體的話,還包括響應主體

image

六、發送響應報文

向客戶端回覆報文

七、記錄日誌:

最後,當事務結束時,Web服務器會在日誌文件中添加一個條目,來描述已執行的事務

備註:這中間還要涉及到https的創建過程

數據傳輸完畢就要斷開連接了

四次揮手

如圖

image

備註:

數據傳輸完畢後,雙方均可釋放鏈接。最開始的時候,客戶端和服務器都是處於ESTABLISHED狀態,而後客戶端主動關閉,服務器被動關閉。

過程

  1. 客戶端進程發出鏈接釋放報文,而且中止發送數據。釋放數據報文首部,FIN=1,其序列號爲seq=u(等於前面已經傳送過來的數據的最後一個字節的序號加1),此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。 TCP規定,FIN報文段即便不攜帶數據,也要消耗一個序號。
  2. 服務器收到鏈接釋放報文,發出確認報文,ACK=1,ack=u+1,而且帶上本身的序列號seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態。TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處於半關閉狀態,即客戶端已經沒有數據要發送了,可是服務器若發送數據,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。
  3. 客戶端收到服務器的確認請求後,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送鏈接釋放報文(在這以前還須要接受服務器發送的最後的數據)。
  4. 服務器將最後的數據發送完畢後,就向客戶端發送鏈接釋放報文,FIN=1,ack=u+1,因爲在半關閉狀態,服務器極可能又發送了一些數據,假定此時的序列號爲seq=w,此時,服務器就進入了LAST-ACK(最後確認)狀態,等待客戶端的確認。
  5. 客戶端收到服務器的鏈接釋放報文後,必須發出確認,ACK=1,ack=w+1,而本身的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。注意此時TCP鏈接尚未釋放,必須通過(最長報文段壽命)的時間後當客戶端撤銷相應的TCB後,才進入CLOSED狀態。
  6. 服務器只要收到了客戶端發出的確認,當即進入CLOSED狀態。一樣,撤銷TCB後,就結束了此次的TCP鏈接。能夠看到,服務器結束TCP鏈接的時間要比客戶端早一些。

 

問題1-爲何鏈接的時候是三次握手,關閉的時候倒是四次握手?


答:

由於當Server端收到Client端的SYN鏈接請求報文後,能夠直接發送SYN+ACK報文。其中ACK報文是用來應答的,

SYN報文是用來同步的。可是關閉鏈接時,當Server端收到FIN報文時,極可能並不會當即關閉SOCKET,

因此只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端全部的報文都發送完了,

我才能發送FIN報文,所以不能一塊兒發送。故須要四步握手。

問題2-爲何要三次握手

答:

爲了防止已失效的鏈接請求報文段忽然又傳送到了服務端,於是產生錯誤。

 

網上轉載的例子不錯:

三次握手:

A:「喂,你聽獲得嗎?」A->SYN_SEND

B:「我聽獲得呀,你聽獲得我嗎?」應答與請求同時發出 B->SYN_RCVD | A->ESTABLISHED

A:「我能聽到你,今天balabala……」B->ESTABLISHED

四次揮手:

A:「喂,我不說了。」A->FIN_WAIT1

B:「我知道了。等下,上一句還沒說完。Balabala…..」B->CLOSE_WAIT | A->FIN_WAIT2

B:」好了,說完了,我也不說了。」B->LAST_ACK

A:」我知道了。」A->TIME_WAIT | B->CLOSED

A等待2MSL,保證B收到了消息,不然重說一次」我知道了」,A->CLOSED

 

參考連接

一、http://www.zsythink.net/archives/76

二、http://www.javashuo.com/article/p-ucrnmzvv-gg.html

三、https://zhuanlan.zhihu.com/p/21940234

四、https://www.jianshu.com/p/c1d6a294d3c0?from=jiantop.com

相關文章
相關標籤/搜索