Internet最先來源於美國國防部ARPANet,1969年投入運行,到如今已有很長一段路了,各位想要了解發展史能夠百度下,這裏就很少說了。android
現現在當咱們想要獲取一些資料,首先是打開某個瀏覽器,在地址欄輸入地址,想要的信息出如今你的面前。web
你們有沒有想過輸入地址就能返回給你想要的信息是怎麼實現的呢?瀏覽器
下面就來簡單說下它的實現流程,不過在這以前先來了解下HTTP基本概念以下緩存
這是一篇爲初學者準備的文章,因此做者會盡可能從基礎出發,儘可能細緻的描述每個細節,以求讓初學者不會一頭霧水,有必定基礎的同窗就不用看了,以避免浪費你的時間。服務器
假設博主今天春心蕩漾,想要訪問一些不可描述的小網站,因而,博主悄悄的打開了瀏覽器,在瀏覽器的地址欄中輸入了一個小網站的網址,多線程
此處假設這個小網站的網址爲 www.zsythink.net ,當博主輸入了這個網址之後,瀏覽器中就顯示了博主想要看到的內容,整個過程以下圖所示。學習
這些內容確定不是憑空產生的,而是有人爲咱們準備了這些內容,當咱們在瀏覽器的地址欄中輸入網址之後,網站
這些提早準備好的內容便可返回到瀏覽器中,以便有須要的人可以查看到這些內容,spa
而查看這些內容的人就是咱們日常所說的"客戶",客戶每每會經過"客戶端程序"去請求、查看這些內容,.net
咱們最常使用的客戶端程序就是瀏覽器了,因此,在以後的http相關的文章中,
若是沒有特別說明,咱們所說的"客戶端"就是指"瀏覽器",咱們使用客戶端去查看咱們想要的內容,
而提供內容的一端被稱爲"服務端",看成爲客戶時,咱們須要在電腦上安裝客戶端軟件(即瀏覽器),
經過客戶端軟件查看咱們想要的內容,而做爲提供內容的人,也須要在服務端的計算機上安裝對應的軟件,
才能爲咱們提供服務,而服務端的計算機就是咱們常說的"服務器",安裝在服務器上的、爲咱們提供內容的軟件被稱之爲"web服務器軟件"。
注:以下名詞的解釋均針對http而言,在後面的文章中咱們會解釋什麼是http,此處不用糾結
客戶端:客戶端一般是指瀏覽器,好比谷歌瀏覽器、火狐瀏覽器、IE等,瀏覽器安裝在客戶使用的電腦上,因此,在描述http時,客戶端一般也代指那些安裝了瀏覽器的電腦。
服務端:服務端一般是指那些安裝了"web服務軟件"的計算機,這些服務端的計算機被稱爲服務器。
沒錯,聰明如你必定想到了,說白了,客戶端與服務端就是兩臺電腦,分別安裝了不一樣的軟件,服務端提供內容,客戶端查看內容。
因此,當咱們訪問網頁時,大體的過程以下圖所示。
客戶端與服務端既然可以通信,那麼證實它們之間必定是經過某種方法進行溝通的,就像你我之間可以進行溝通同樣。
你和我都說漢語,因此,當我說"蘋果"這個詞的時候,你就會想到一種水果,或者想到一個手機品牌,
可是當我對一個美國人說"蘋果"兩個字時,他可能並不能理解我在說什麼,由於他可能聽不懂漢語,
若是我想要對他表達"蘋果"這個詞,我須要說"Apple",他纔會明白我說的是什麼,當我跟你聊天時,咱們都說漢語,
當兩個美國人聊天時,他們都說英語,這樣,纔能有效的溝通,總之,若是想要可以順暢的溝通,
溝通雙方都必須遵照相同的協議,咱們能夠把漢語理解成一種協議,把英語也理解成一種協議,
只要溝通雙方都遵照相同的協議,雙方就可以順暢的溝通,只要溝通雙方都遵照相同的協議,雙方就可以理解對方想要作什麼。
固然,之因此拿漢語、英語舉例,是爲了讓初學者可以更加容易的理解"協議"這個詞,可是請不要錯誤的覺得"協議"就是"語言",
之因此拿語言舉例,是爲了方便理解,說白了,"協議"能夠理解爲某種規則或者某種約定,
只要你們都嚴格按照這種約定行事,世界就會正常的運轉,好比"紅燈停,綠燈行"也能夠理解爲一種協議,
好比在馬路上都要靠右行駛(在中國),也是一種協議,好比在小飯館,你給老闆人民幣,老闆給你對應的餐食,
也是一種協議,"協議"的概念稍微有一些抽象,稍微有一些寬泛,此處大概有一個印象便可,在學習的過程當中,咱們本身就會慢慢的理解它了。
客戶端與服務端之間,也須要遵照某些相同的協議,纔可以順暢的通信,細心如你必定注意到了,我說的是"某些"協議,也就是說,雙方要遵照的協議不止有一種,它們須要同時遵照多種協議,纔可以正常的完成整個通信過程。
好比http協議,剛纔已經說過,不一樣的"層面"中,須要使用不一樣的協議,http協議就是應用層的一種協議,http協議是什麼意思呢?
http是HyperText Transfer Protocol的縮寫,HyperText Transfer Protocol譯爲"超文本傳輸協議"。
從字面上理解,這種協議是用來傳輸"超文本"的,咱們能夠暫且粗暴的將"超文本"理解成咱們所謂的"網頁"(這樣並不許確,可是方便理解),那麼,咱們能夠將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(物理地址)的解析
瀏覽器拿到域名對應的IP後,會拿一個隨機端口向WEB服務程序80端口發起TCP請求連接
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狀態。
三次握手成功後,開始傳輸數據。
一個完整的三次握手也就是 請求---應答---再次確認
連接創建成功後,就要開始下一步,傳輸數據
接收或拒絕鏈接請求
發送請求報文
接收客戶端發來的請求報文中的信息對某資源的一次請求的過程
Web訪問響應模型(Web I/O)
1)單進程I/O模型:
啓動一個進程處理用戶請求,並且一次只處理一個,多個請求被串行響應
2)多進程I/O模型:
並行啓動多個進程,每一個進程響應一個鏈接請求
3)複用I/O結構:
啓動一個進程,同時響應N個鏈接請求
實現方法: 多線程模型和事件驅動
多線程模型: 一個進程生成N個線程,每線程響應一個鏈接請求
事件驅動: 一個進程處理N個請求
4)複用的多進程I/O模型:
啓動M個進程,每一個進程響應N個鏈接請求,同時接收M*N個請求
服務器對請求報文進行解析,並獲取請求的資源及請求方法等相關信息,根據方法,資源,首部和可選的主體部分對請求進行處理
HTTP經常使用請求方式,Method
GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS
服務器獲取請求報文中請求的資源web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源
資源放在服務端特定的目錄下
備註:經過MAC地址和端口號肯定具體的應用程序
一旦Web服務器識別除了資源,就執行請求方法中描述的動做,並返回響應報文。響應報文中 包含有響應狀態碼、響應首部,若是生成了響應主體的話,還包括響應主體
向客戶端回覆報文
最後,當事務結束時,Web服務器會在日誌文件中添加一個條目,來描述已執行的事務
備註:這中間還要涉及到https的創建過程
數據傳輸完畢就要斷開連接了
如圖
備註:
數據傳輸完畢後,雙方均可釋放鏈接。最開始的時候,客戶端和服務器都是處於ESTABLISHED狀態,而後客戶端主動關閉,服務器被動關閉。
答:
由於當Server端收到Client端的SYN鏈接請求報文後,能夠直接發送SYN+ACK報文。其中ACK報文是用來應答的,
SYN報文是用來同步的。可是關閉鏈接時,當Server端收到FIN報文時,極可能並不會當即關閉SOCKET,
因此只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端全部的報文都發送完了,
我才能發送FIN報文,所以不能一塊兒發送。故須要四步握手。
答:
爲了防止已失效的鏈接請求報文段忽然又傳送到了服務端,於是產生錯誤。
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