瀏覽器的請求數據包如何到達web服務器?node
不少讀者對於其中的完整流程不是特別的瞭解,下面一口君經過這22張圖,詳細的講解咱們點擊瀏覽器的網址以後,數據包是如何通過重重險阻到達web server的。web
1. LAN網絡中的用戶要訪問位於遠程網絡中的服務器存儲的網頁。用戶首先激活網頁上的連接。
若是該域名對應的IP地址本地已經緩存,就直接訪問該地址的80端口或者8080端口;若是沒有緩存,那麼瀏覽器會發出DNS請求給DNS服務器,得到該域名對應的IP地址。
得到地址後,瀏覽器會經過socket首先向服務器發送三次握手,創建起TCP鏈接。編程
2. 瀏覽器發出HTTP Get請求。應用層添加第7層報頭,用於標識應用程序和數據類型。
數據區須要按照HTTP協議填充對應數據,格式參考RFC2616。
瀏覽器
3. 傳輸層標識上層服務是萬維網(WWW)客戶端。而後,傳輸層將此服務與TCP協議相關聯並分配端口號。它使用隨機選擇的與此所建回話相關聯的源端口(12345),目的端口(80)與www服務相關聯。
進行網絡通訊的進程必須綁定一個端口號,該端口號用於區分網絡通訊的進程。一個端口號只能被1個進程綁定。緩存
一般web服務器的端口號爲80,8080。
服務器
4. TCP還發送確認號,告知www服務器期待接收的下一TCP數據短的序列號,序列號將指示此數據段在一系列相關數據段中所處的位置。此外還會根據創建會話的須要適當設置標誌。
該序列號很是有用,TCP要保證數據正確到達對方,而且對方要可以讓數據有序重組,重組的依據就是這個序列號。
微信
5. 網絡層構建IP數據包,以便標識源主機和目的主機。就目的地址而言,客戶端主機使用主機表中緩存的www服務器主機名關聯的IP地址。而原地址則使用本機的IPv4地址。網絡層還標識出此數據包中封裝的上層協議爲TCP數據段。
網絡
6.數據鏈路層參照地址解析協議(ARP)緩存來肯定與路由器B接口關聯的MAC地址,該接口被制定爲默認網關。而後,它使用此地址構建以太網II幀,經過本地介質傳輸IPv4數據包。該幀中使用筆記本電腦的MAC地址做爲源MAC地址,使用路由器B的Fa0/0接口的MAC地址做爲目的MAC地址。架構
7. 該幀的類型字段中還使用值0800指示IPv4上層協議。該幀之前導碼和幀首(SOF)指示符開始,以幀尾幀校驗序列中用於產錯校驗的循環冗餘校驗(CRC)結束。而後,它使用CSMA/CD來控制將幀放置到介質上的過程。
app
8. 物理層開始將幀逐位編碼到介質中。路由器A和服務器之間的網段是10Base-T網段;所以,對此比特編碼時使用的是曼徹斯特差分編碼。路由器B會緩衝收到的比特。
10BASE-T是雙絞線以太網。
9. 路由器檢查前導碼和SOF中的比特位,查找表示幀開始位置的連續兩個1的比特位。而後,路由器B開始緩存這些比特,做爲重建幀的一部分。收到整個幀以後,路由器B生成幀的CRC。而後將此與幀結束位置的FCS進行對比,肯定接收的幀完好無損。當確認該幀未損壞時,再比對幀中的目的MAC地址和接口(Fa0/0)的MAC地址。若是兩者相符,則刪除幀頭並將數據包向上傳送到網絡層。
10. 網絡層將數據包的目的IPv4地址與路由表中的路由進行比對。找到與下一跳出接口S0/0/0相關聯的符合項。而後將路由器B中的數據包傳送到S0/0/0接口的電路。
路由器值會查看數據包的IP層信息,並根據目的IP地址來查找路由表,路由器是搭建網路最重要的一個設備,用來鏈接不一樣的網絡。
網絡搭建好以後,每一個路由器中都要提早創建好到各個網段的路由。一般路由條目由動態路由協議RIP、OSPF來動態建立。
11.路由器B建立PPP幀,經過WAN傳輸數據包。PPP報頭中添加了01111110二進制標誌,表示幀的開始位置。而後添加地址字段1111111,表示廣播(意思是「發送到全部站點」)。因爲PPP是點對點協議,用做兩個節點之間的直接鏈路,因此此字段沒有實際意義。
路由器的全部接口地址都不能處於同一網段,通常一個出接口鏈接一個獨立的網段。
路由器和路由器之間兩個網口傳輸數據通常用PPP協議。
12. 此外還包括值爲0021(十六進制)的協議字段,表示封裝的是IPv4數據包。幀尾以幀校驗序列中用於差錯校驗的循環冗餘校驗結束。值爲01111110的二進制標誌表示PPP幀的結束位置。
13. 因爲兩臺路由器之間已經創建了電路和PPP會話,所以物理層開始將幀逐位編碼到介質中。接收路由器(路由器A)會緩衝收到的比特。比特的表示類型和編碼類型取決於使用的WAN技術的類型。
14. 路由器A檢查標誌中的比特,肯定幀的開始位置。而後,路由器A開始緩存這些比特,做爲重建幀的一部分。按照幀尾中的標誌所示收到整個幀以後,路由器A生成幀的CRC。而後將此與幀結束位置的FCS進行比對,肯定接收的幀完好無損。當確認該幀未損壞時,則刪除幀頭並將數據包向上傳送到路由器A的網絡層。
15. 網絡層將數據包的目的IPv4地址與路由表中的路由進行比對。找到直接鏈接到接口Fa0/0的匹配項。而後,將路由器A中的數據包傳送到Fa0/0接口的電路。
16. 數據鏈路層參照路由器A的ARP緩存來肯定Web服務器接口關聯的MAC地址。而後,它使用此MAC地址構建以太網Ⅱ幀,經過本地介質將IPv4數據包傳輸到服務器。該幀中使用路由器A的fa0/0接口的MAC地址做爲源MAC地址,使用服務器的MAC地址做爲目的MAC地址。該幀的類型字段中還使用值0800指示IPv4上層協議。該幀之前導碼和幀首(SOF)指示符開始,以幀尾幀校驗序列中用於差錯校驗的循環貳餘校驗結束。而後,它使用CSMA/CD來控制將幀放置到介質上的過程。
CSMA/CD即載波偵聽多路訪問/衝突檢測,是廣播型信道中採用一種隨機訪問技術的競爭型訪問方法,具備多目標地址的特色。
17. 物理層開始將幀逐位編碼到介質中。路由器A和服務器之間的網段是100Base-T網段;所以,對比特編碼時使用的是4B/5B編碼。服務器會緩衝收到的比特。
18. Web服務器檢前導碼和SOF中的比特位,查找表示幀開始位置的連續兩個1的比特位。而後,服務器開始緩存這些比特,做爲重建幀的一部分。收到整個幀以後,服務器生成幀的CRC。而後將此與幀結束位置的FCS進行比對,肯定接收的幀完好無損。
19. 當確認該幀未損壞時,再比對幀中的目的MAC地址與服務器網卡的MAC地址。若是兩者相符,則刪除幀頭並將數據包向上傳送到網絡層。
20. 網絡層檢查數據包的目的IPv4地址,肯定目的主機。因爲此地址與其自身的IPv4地址相符,所以服務器處理該數據包。網絡層標識出上層協議是TCP,並將包含的數據段傳送到傳輸層的TCP服務。
21. 服務器的傳輸層檢查TCP數據段,肯定數據段中包含的數據所屬的會話。此操做經過檢查源端口和目的端口來完成。惟一的源端口和目的端口標識與Web服務器服務的現有會話。使用序列號按照正確的順序放置此數據段,向上發送到應用層。
前面說過一個端口只能被一個進程綁定,因此該數據只會傳送給web服務器進程,而不會被其餘進程截獲。
22. 在應用層,HTTP Get請求傳送到Web服務器服務(httpd)。而後,該服務能夠肯定對請求作出的響應。
實際的網絡環境中,服務器直接鏈接的路由器A和本地路由器B之間可能鏈接了很是多的網絡設備,好比衛星、網橋、光纖等,這些設備的組網會更加複雜,涉及到的網絡協議也更多。全部這些基礎網絡設施都由運營商建設,造價特別的昂貴,若是沒有中興、華爲大力發展網絡設備,咱們基本不可能用如此低的價格來上網衝浪,也不會誕生美團、支付寶、微信、抖音這些互聯網公司。相信隨着5G的普及,將來會有更多的中國本土的新興互聯網公司。
本例雖然組網基礎相對簡單,可是萬變不離其宗,基本原理一致。網絡博大精深,在實際開發產品中應用很是普遍,後面一口君還會陸續發佈關於網絡的文章,敬請關注下方微信號。
推薦閱讀
【2】手把手教Linux驅動2-模塊參數param和符號導出export用法
【3】手把手教Linux驅動3-之字符設備架構詳解,有這篇就夠了
【4】手把手教Linux驅動4-進程、文件描述符、file、inode關係詳解
【5】玩轉內核鏈表list_head,如何管理不一樣類型節點的實現(萬字文)能夠收藏
【6】I2C乾貨-基於Cortex-A9(從新整理)
【8】一文講懂什麼是vlan、三層交換機、網關、DNS、子網掩碼、MAC地址
【9】詳解實時查看網卡流量的幾款工具
【10】如何高效閱讀代碼?Linux大神拍了拍你並教給你這三個步驟
5T技術資源大放送!包括但不限於:C/C++,Linux,Python,Java,PHP,人工智能,單片機,樹莓派,等等。在公衆號內回覆「1024」,便可免費獲取!!

本文分享自微信公衆號 - 程序喵大人(dmjjzl1)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。