用戶訪問網站詳細流程


 

一、DNS解析

當我們把這個網址輸入到瀏覽器並回車之后,首先第一步會檢查客戶端本地的hosts和DNS緩存,客戶端的DNS緩存,檢查完之后,因為第一次請求一般本地的DNS緩存是沒有的,一般這個hosts文件我是做測試使用的,這里面也是沒有結果的,那么在這種情況下的話我們會找localDNS。

localDNS就是我們在本地計算機網卡里面配置的DNS服務器,里面會配置兩台,一般優先使用的話是NDS1,在這種情況下找到localDNS,找到localDNS之后首先是查看它本地的一個緩存。

但在第一次查找情況下里面是沒有的,那么它會把請求發到這個全球13台DNS根服務器,DNS根服務器它管理的只是頂級域名,也稱為一級域名,然后在這種情況下,它會把結果傳送給localDNS,發給這個localDNS的就是一級域名,一級域名里面我們把這些服務器稱為NS服務器,而一級域名一般一組的話是6台,在這種情況下localDNS獲取到一級域名也稱為頂級域名NS服務器之后會找到一級域名的這些NS服務請求,請求2級域名,接下來這個一級域名的NS服務器會把二級域名服務器發給localDNS,(因為一級域名管理的是二級域名)這樣情況下localDNS獲取到二級域名之后它會再次發起請求, 比如說我們今天所講的blog.csdn.net,這個.csdn屬於一個二級域名,blog就是一個主機名,在這種情況下localDNS會在二級域名NS服務器那查詢到這一條A記錄,查詢到這條A記錄之后,首先第一它會把這個緩存結果在localDNS緩存一份並把這個結果返回客戶端,這整個解析過程中我們有發現有一個叫緩存的東西,客戶端也有緩存,在localDNS里面也有緩存,這緩存是無處不在的。

這緩存有個緩存周期叫ttr,一般這個ttr我們有3中可以選着,

(1)比較常用的選着我們選着600秒,一般對這條記錄不怎么修改可以用這個選着,(2)如果改得特別頻繁的話我們可以設置為1秒,

(3)不頻繁是更改或是一年更改一次易或者一次也不更改我們可以設置成3600秒,我們為什么要設置呢?設置大小有什么優缺點呢?我們把這個ttr設置得越大客戶端在解析的過程中就速度越快,因為你設置的越大它對這個localDNS或是在客戶端本地緩存時間越長,基本上NDS查詢都是在本地緩存查詢,只有查詢不到才去請求服務器,所以請求本地比請求服務器更快更高效。如果時間太短,客戶端請求不是使用本地緩存那么請求DNS就是用這種遞歸和迭代那么速度就慢了,如果是自己搭建的NDS服務器的話那么它本身服務器壓力也是很大,因為它會接收到N多的這種遞歸查詢和迭代查詢,所以它壓力也會比較大。當這個客戶端獲取到DNS服務器地址之后接下來就到下面TCP連接了。

二、TCP三次握手建立連接

1、TCP服務器進程先創建傳輸控制塊TCB,時刻准備接受客戶進程的連接請求,此時服務器就進入了LISTEN(監聽)狀態;

2、TCP客戶進程也是先創建傳輸控制塊TCB,然后向服務器發出連接請求報文,這是報文首部中的同部位SYN=1,同時選擇一個初始序列號 seq=x ,此時,TCP客戶端進程進入了 SYN-SENT(同步已發送狀態)狀態。TCP規定,SYN報文段(SYN=1的報文段)不能攜帶數據,但需要消耗掉一個序號。

3、TCP服務器收到請求報文后,如果同意連接,則發出確認報文。確認報文中應該 ACK=1,SYN=1,確認號是ack=x+1,同時也要為自己初始化一個序列號 seq=y,此時,TCP服務器進程進入了SYN-RCVD(同步收到)狀態。這個報文也不能攜帶數據,但是同樣要消耗一個序號。

4、TCP客戶進程收到確認后,還要向服務器給出確認。確認報文的ACK=1,ack=y+1,自己的序列號seq=x+1,此時,TCP連接建立,客戶端進入ESTABLISHED(已建立連接)狀態。TCP規定,ACK報文段可以攜帶數據,但是如果不攜帶數據則不消耗序號。

5、當服務器收到客戶端的確認后也進入ESTABLISHED狀態,此后雙方就可以開始通信了。

 

 

三、http請求報文階段

三次握手完畢后,客戶端與服務器才正式開始傳送數據,這時候才會去發送http的請求報文,(http請求報文它主要包含——請求行、請求頭部、空白行、請求主體)

(1)請求行

1)請求方法(常用的請求方法)GET、HEAD、POST、PUT (POST 一般注冊用戶單機提交需要向服務器端發送信息並且寫入到服務器端,比如寫到數據庫之類的,這樣就可以用到POST方法;GET的話就是瀏覽頁面比如說你打開一個博客,瀏覽的情況下它會用到GET方法;HEAD像我們做測試的時候,比如curl -i https://blog.csdn.net 就可以查看它的頭部信息;PUT它可以理解為一個替換,像還有一些DELETE、TRACE可能不是很常用。)

2)資源地址(我們稱為URL)

3)http協議版本,得到廣泛使用的有3個版本,HTTP/0.9、HTTP/1.0、HTTP/1.1,HTTP/0.9已經被淘汰了,現在主流用的是HTTP/1.1,它比HTTP/1.0做了一些優化,1.1相比較1.0的話它有個自由連接keepalived。

(2)請求頭部主要包括服務器和客戶端的版本信息,你是用了Windows還是用了Linux,還是用了其他客戶端信息,還有一些字符集、hosts信息。對應的響應報文里面就是時間、服務器的版本信息

(3)請求報文——才到空白行——然后到請求主體,如果你是請求的話 請求主體是空的,只有上傳請求主體才是有內容的;然后對應的響應報文

四、網站及整個網站集群內部工作請求階段

【網站】在這時候的話網頁又分為3種,

1)1種是靜態的——靜態的話就是沒有交互式的,服務器那邊頁面是什么客戶端這邊顯示就是什么中間不會有任何改變它的文件后綴名常見的以html、shtml、Xml、CSS,靜態沒有一些交互式的功能,特效都沒辦法顯示。

2)2種動態的——提供數據庫訪問、可以提供用戶的登錄注冊、特效很多,常見的后綴名asp、php、jsp

3)3種偽靜態,其實就是動態轉靜態,利用一個Rewrite重寫的技術把它變成一個靜態的網站,當我們訪問一個網站的時候,它會進行一個Rewrite重寫,再去指向真實的地址去數據庫里面找。

4)為什么要做一個偽靜態呢?其實方便搜索引擎方便去收入,因為搜索引擎對動態網站中的URL里面的?&效果不是很好,所以需要用這么一個技術去欺騙搜索引擎提供一個網站的排名和seo優化等等,這就是我們網站的3種常用的類型。

【網站內部集群】 我們知道一個網頁看似是一個網頁,實際上它里面包含了很多,可能也嵌入了一些其他資源類型,在整個頁面加載的過程中,我們進行一次TCP連接就可以把整個資源的數據闡述完畢,當我們這個http請求報文,接收這個報文的負載均衡服務器,負載均衡服務器在企業中常見的有:硬件的有F5,軟件的有七層的nginx,四層的有LVS;通過這個負載均衡會把這個請求發送到后端的靜態WEB服務器(常見的Apache、nginx、Lighttpd)靜態服務器的話會把這個靜態請求直接響應給客戶端,但是如果我們這個網站架構了CDN的話,那么最終像客戶端返回這個靜態請求CDN緩存服務器,一般情況下我們現在的網站都為動態網站,動態網站就需要一個動態的web服務器(一般常用的Tomcat等等)動態服務器的話就負責這些動態請求以及程序的解析,當然這個過程中可能涉及到結構化數據而這些數據會存儲在后端的數據庫服務器中,像互聯網公司常用的mysql,當然為了數據庫查詢體驗更好我們還會在前端部署數據庫的緩存服務器,常用的redis和memcached等等,在這個過程中我們一直有聽到數據庫它存儲的是結構化數據,而非結構化數據,像大型的公司阿里雲就把它稱為對象,比如像附件、圖片、視頻、音頻等等,我們一般會存儲在存儲服務器上,因為這些也屬於靜態支援,我們會把它放在CDN上,提升用戶的體驗,加快用戶的體驗速度。這就是我們后端整個網站內部集群工作流程。

五、http響應報文階段

內部工作流程完了數據已經准備好了接下來就像客戶端發送這個http響應報文,主要也分為4個部分

1)首先第一部分起始行(協議版本,數字狀態碼:200代表OK;301代表永久跳轉;403代表服務器做了限制沒有權限訪問;404代表用戶訪問的頁面不存在;500代表服務器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理;502代表作為網關或者代理工作的服務器嘗試執行請求時,從上游服務器接收到無效的響應;503代表臨時的服務器維護或者過載,服務器當前無法處理請求;504代表作為網關或者代理工作的服務器嘗試執行請求時,未能及時從上游服務器(URI標識出的服務器,例如HTTP、FTP、LDAP)或者輔助服務器(例如DNS)收到響應。)最后才到響應主體——展現給用戶看的界面)

2)第二部分響應頭部類型(媒體類型、私有連接及時間、字符集等等)

3)第三部分空行

4)第四部分響應主體(響應頭的結束以及響應主體的開始)

六、TCP4次揮手階段

私有連接超時后才進入TCP的4次斷開

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連接還沒有釋放,必須經過2∗∗MSL(最長報文段壽命)的時間后,當客戶端撤銷相應的TCB后,才進入CLOSED狀態。

6、服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB后,就結束了這次的TCP連接。可以看到,服務器結束TCP連接的時間要比客戶端早一些。



原文鏈接:https://blog.csdn.net/yaodunlin/article/details/88422639

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM