一.說在前頭

好久沒有更新博客了,汗顏,最近忙于各種實驗與報告,但是還是要抽時間總結(jié)一下學(xué)的東西。歡迎轉(zhuǎn)載,但是要注明出處哦(=^ ^=)。

最近學(xué)了計算機網(wǎng)絡(luò),正好總結(jié)一下。本篇博客的大部分是跟計算機網(wǎng)絡(luò)協(xié)議相關(guān)的,大概是一個沿著協(xié)議棧往下的過程。我們可以看到,一個最簡單的請求,也包含了許多復(fù)雜的過程。而這些過程對用戶來說,是完全不可見的,也就是說,制作這些協(xié)議的前輩們,為了方便用戶的使用,把許多復(fù)雜的東西已經(jīng)封裝好了,因此我們這些小白,只用動動鼠標(biāo),就可以輕松surfing the Internet了!

這次的總結(jié)基于這樣的場景:一名學(xué)生,就稱呼他為“小明”吧(:-P,小明再次登場,哈哈~),小明帶著他的筆記本電腦和學(xué)校寢室的網(wǎng)線接口(其實是一個以太網(wǎng)交換機)連接,加載一個web頁面(比如說www.baidu.com的主頁,額,某度給廣告費么)。正如前面所講,為了滿足這個簡單的請求,背后隱藏了許多的細(xì)節(jié)。

萬碼學(xué)堂,電腦培訓(xùn),計算機培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

 

二.準(zhǔn)備:DHCP、UDP、IP、以太網(wǎng)

 

我們假定小明啟動他的筆記本,然后將其用一根網(wǎng)線(以太網(wǎng)電纜)鏈接到學(xué)校的網(wǎng)口(以太網(wǎng)交換機),交換機與學(xué)校的路由器相連,如上圖所示。學(xué)校的這臺路由器與一個ISP連接,本例中ISP為unicom.net。在本例中,unicom.net為學(xué)校提供了DNS服務(wù);所以,DNS服務(wù)器駐留在unicom網(wǎng)絡(luò)中而不是學(xué)校的網(wǎng)絡(luò)中。我們還假設(shè)DHCP服務(wù)器運行在路由器中,因為我們在生活中的常見情景就是這樣。

當(dāng)小明首先將筆記本與網(wǎng)絡(luò)連接時,沒有IP地址,他就不能做任何事情。所以,第一要務(wù)就是,運行DHCP協(xié)議,以便從DHCP服務(wù)器獲得一個IP地址以及其他相關(guān)信息。

 

1.  小明筆記本上的操作系統(tǒng)生成一個DHCP請求報文,并將這個報文放入具有目的端口67(DHCP服務(wù)器)和源端口68(DHCP客戶)的UDP報文段,該UDP報文段則被放置在一個具有廣播IP目的地地址(255.255.255.255)和源IP地址(0.0.0.0)的IP數(shù)據(jù)報,因為小明的筆記本還沒有一個具體的IP地址。

 

2.  包含DHCP請求報文的IP數(shù)據(jù)報則被放置在以太網(wǎng)幀。這個以太網(wǎng)幀具有目的MAC地址FF:FF:FF:FF:FF:FF,使該幀將廣播到與交換機連接的所有設(shè)備(如果順利的話,也包含了DHCP服務(wù)器);這個幀的源MAC地址是小明筆記本的MAC地址00:16:D3:23:68:8A。

 

3.  包含DHCP請求的廣播以太網(wǎng)幀是第一個從小明筆記本發(fā)送到以太網(wǎng)交換機的幀。這個交換機在所有的出端口廣播收到的幀,也包括了連接到路由器的端口。

 

4  .路由器在它的具有MAC地址00:226B:45:1F:1B的接口收到了這個廣播的以太網(wǎng)幀,幀中包含了DHCP請求,并且路由器可以從幀中抽取出IP數(shù)據(jù)報。該數(shù)據(jù)報的廣播IP目的地址指示了這個IP數(shù)據(jù)報應(yīng)當(dāng)由在該節(jié)點的高層協(xié)議處理,因此數(shù)據(jù)報的載荷(一個UDP報文段)被分解了,向上到達(dá)了UDP,UHCP請求報文從UDP報文段中抽取出來。此時DHCP服務(wù)器有了DHCP請求報文。

 

5.  我們假設(shè)運行在路由器中的DHCP服務(wù)器能夠以CIDR塊68.85.2.0/24分配IP地址。所以在這個例子中,在學(xué)校內(nèi)使用的所有IP地址都在unicom的地址塊中。我們假設(shè)DHCP服務(wù)器分配地址68.85.2.101給小明的筆記本。DHCP服務(wù)器生成包含這個IP地址以及DNS服務(wù)器的IP地址(68.87.71.226)、默認(rèn)網(wǎng)關(guān)路由器的IP地址(68.85.2.1)和子網(wǎng)塊(68.85.2.0/24)(等價于“子網(wǎng)掩碼”)的一個DHCP ACK報文。報文被放入一個UDP報文段中,UDP報文段被放入一個IP數(shù)據(jù)報中,IP數(shù)據(jù)報被放入一個以太網(wǎng)幀中。這個以太網(wǎng)幀的源MAC地址是路由器連到歸屬網(wǎng)絡(luò)時接口的MAC地址(00:22:6B:45:1F:1B),目的MAC地址是小明筆記本的MAC地址(00:16:D3:23:68:8A)。

 

6.  包含DHCP ACK報文的以太網(wǎng)幀由路由器發(fā)送給交換機。因為交換機是自學(xué)習(xí)的,并且先前從小明筆記本收到(包含DHCP請求的)以太網(wǎng)幀,所以該交換機知道尋址到00:16:D3:23:68:8A的幀僅從小明筆記本的輸出端口轉(zhuǎn)發(fā)。

 

7.  小明筆記本接收到包含DHCP ACK的以太網(wǎng)幀,并且從幀中提取IP數(shù)據(jù)報,又從數(shù)據(jù)報提取UDP報文段,從報文段中提取DHCP ACK報文。小明的DHCP客戶端則記錄下它的IP地址和它的DNS服務(wù)器的IP地址。它還在其IP轉(zhuǎn)發(fā)表中安裝默認(rèn)網(wǎng)關(guān)的地址。小明筆記本將向該默認(rèn)網(wǎng)關(guān)發(fā)送目的地址為其子網(wǎng)68.85.2.0/24以外的所有數(shù)據(jù)報。此時,筆記本已經(jīng)初始化所有的網(wǎng)絡(luò)組件,并且準(zhǔn)備開始處理web頁面的獲取。

 

三.仍在準(zhǔn)備:DNS和ARP

 

當(dāng)小明將www.baidu.com的URL鍵入其web瀏覽器時,他就開啟了一長串事件,這將導(dǎo)致某度主頁最終顯示在他的web瀏覽器上。小明的web瀏覽器通過生成一個TCP套接字開始了該過程,套接字用于向www.baidu.com發(fā)送HTTP請求。為了生成該套接字,小明的筆記本將需要知道www.baidu.com的IP地址。使用DNS服務(wù)提供這種域名到IP的相互轉(zhuǎn)換。

 

8.  小明的筆記本上的操作系統(tǒng)因此生成一個DNS查詢報文,將字符串www.baidu.com放入DNS報文的問題段中。這個DNS報文則放置在一個具有53號(DNS服務(wù)器)目的端口的UDP報文段中。該UDP報文段則被放入具有IP目的地址68.87.71.226(在第5步中DHCP ACK返回的DNS服務(wù)器地址)和源IP地址68.85.2.101的IP數(shù)據(jù)報中。

 

9.  小明筆記本將包含DNS請求報文的數(shù)據(jù)報放入一個以太網(wǎng)幀。幀將發(fā)送(在鏈路層尋址)到小明學(xué)校網(wǎng)絡(luò)的網(wǎng)關(guān)路由器。然而,即使小明的筆記本經(jīng)過上面的第5步中的DHCP ACP報文知道了學(xué)校網(wǎng)關(guān)路由器的IP地址,但是仍然不知道這個網(wǎng)關(guān)的MAC地址。為了獲得網(wǎng)關(guān)的MAC地址,小明筆記本將需要使用ARP協(xié)議

 

10.  筆記本生成一個具有目的IP地址68.85.2.1(默認(rèn)網(wǎng)關(guān))的ARP查詢報文,將這個ARP報文放置在一個廣播目的地址(FF:FF:FF:FF:FF:FF)的以太網(wǎng)幀中,并向交換機發(fā)送這個幀,交換機將這個幀交付給所有和它相連接的設(shè)備,包括了網(wǎng)關(guān)路由器。

 

11.  網(wǎng)關(guān)路由器在通往學(xué)校網(wǎng)絡(luò)的接口上接收到了包含該ARP查詢報文的幀,發(fā)現(xiàn)在ARP報文中目標(biāo)IP地址68.85.2.1匹配其接口的IP地址。網(wǎng)關(guān)路由器因此準(zhǔn)備一個ARP回答,指示它的MAC地址為00:22:6B:45:1F:1B,對應(yīng)IP地址為68.85.2.1。它將ARP回答放在一個以太網(wǎng)幀中。其目的地址為00:16:D3:23:68:8A(小明的筆記本),并向交換機發(fā)送該幀,再由交換機將幀交付給筆記本電腦。

 

12  .筆記本電腦接收包含ARP回答報文的幀,并從ARP回答報文中抽取網(wǎng)關(guān)路由器的MAC地址(00:22:6B:45:1F:1B)。

 

13.  小明的筆記本電腦現(xiàn)在終于能夠使包含DNS查詢的以太網(wǎng)幀尋址到網(wǎng)關(guān)路由器的MAC地址。注意到在該幀中的IP數(shù)據(jù)報具有IP目的地址68.87.71.226(DNS服務(wù)器),而該幀具有MAC目的地址00:22:6B:45:1F:1B(網(wǎng)關(guān)路由器)。筆記本電腦向交換機發(fā)送該幀,交換機將幀交付給網(wǎng)關(guān)路由器。

 

四.還在準(zhǔn)備:域內(nèi)路由選擇到DNS服務(wù)器

 

14.  網(wǎng)關(guān)路由器接收該幀并抽取包含DNS查詢的IP數(shù)據(jù)報。路由器查找該數(shù)據(jù)報的目的地址(68.87.71.226),并根據(jù)路由器自己的轉(zhuǎn)發(fā)表決定該數(shù)據(jù)報應(yīng)當(dāng)發(fā)送到圖示unicom網(wǎng)絡(luò)中最左邊的路由器。IP數(shù)據(jù)報放置在鏈路層幀中,該鏈路適合將學(xué)校路由器連接到最左邊的unicom路由器,并且該幀經(jīng)這條鏈路發(fā)送。

 

15.  在unicom網(wǎng)絡(luò)中最左邊的路由器接收到該幀,抽取IP數(shù)據(jù)報,檢查數(shù)據(jù)報的目的地址(68.87.71.226),并根據(jù)轉(zhuǎn)發(fā)表確定出接口,經(jīng)過該接口朝著DNS服務(wù)器轉(zhuǎn)發(fā)數(shù)據(jù)報,而轉(zhuǎn)發(fā)表已根據(jù)unicom的域內(nèi)協(xié)議(如RIP、OSPF、IS-IS等)以及因特網(wǎng)的域間協(xié)議BGP所填寫。

 

16.  最終包含DNS查詢的IP數(shù)據(jù)報到達(dá)了DNS服務(wù)器。DNS服務(wù)器抽取出DNS查詢報文,在它的DNS數(shù)據(jù)庫中查找名字www.baidu.com。找到包含對應(yīng)www.baidu.com的IP地址(64.233.169.105)的DNS源記錄。(假設(shè)它當(dāng)前緩存在這個DNS服務(wù)器中。)這種緩存數(shù)據(jù)源于baidu.com的權(quán)威DNS服務(wù)器。該DNS服務(wù)器形成了一個包含這種主機名的IP地址的映射的DNS回答報文,將該回答報文放入UDP報文段中,報文段放入尋址到小明筆記本電腦(68.85.2.101)的IP數(shù)據(jù)報,數(shù)據(jù)報通過unicom網(wǎng)絡(luò)反向轉(zhuǎn)發(fā)到學(xué)校的路由器,并從這里經(jīng)過以太網(wǎng)交換機到小明的筆記本電腦。

 

17.  筆記本電腦從DNS報文抽取出服務(wù)器www.baidu.com的IP地址。最終,在上面的大量工作之后,這臺可憐的筆記本電腦準(zhǔn)備接觸www.baidu.com的服務(wù)器!

 

五.web交互:TCP與HTTP

 

18.  既然筆記本電腦已經(jīng)有了www.baidu.com的服務(wù)器IP地址,它能夠生成TCP套接字,這個套接字將用于向www.baidu.com發(fā)送HTTP GET報文。當(dāng)小明生成TCP套接字時,在筆記本電腦中的TCP必須首先與www.baidu.com中的TCP執(zhí)行三次握手協(xié)議。筆記本因此首先生成一個具有目的端口80的TCP SYN報文段,該TCP報文段放置在具有目的IP地址為64.233.169.105(www.baidu.com)的IP數(shù)據(jù)報,數(shù)據(jù)報則放置在MAC地址為00:22:6B:45:1F:1B(默認(rèn)網(wǎng)關(guān)路由器)的幀中,并向交換機發(fā)送該幀。

 

19.  在學(xué)校網(wǎng)絡(luò)、unicom網(wǎng)絡(luò)和某度網(wǎng)絡(luò)中的路由器朝著www.baidu.com轉(zhuǎn)發(fā)包含TCP SYN的數(shù)據(jù)報,使用每臺路由器的轉(zhuǎn)發(fā)表,如上面的步驟14-16那樣。前面也說過支配分組經(jīng)unicom和某度網(wǎng)絡(luò)之間的鏈路轉(zhuǎn)發(fā)的路由器轉(zhuǎn)發(fā)表項,是由BGP協(xié)議決定的。

 

20.  最終,包含TCP SYN的數(shù)據(jù)報到達(dá)www.baidu.com。從數(shù)據(jù)報抽取出TCP SYN報文并分解到與端口80相聯(lián)系的套接字。對于某度HTTP服務(wù)器和小明的筆記本電腦之間的TCP連接生成一個連接套接字。產(chǎn)生一個TCP SYNACK報文段,將其放入向筆記本電腦尋址的一個IP數(shù)據(jù)報中,最后放入鏈路層幀,該鏈路適合將www.baidu.com連接到其第一跳路由器。

 

21.  包含TCP SYNACK報文段的數(shù)據(jù)通過某度、unicom和學(xué)校網(wǎng)絡(luò),最終到達(dá)筆記本電腦的以太網(wǎng)卡。數(shù)據(jù)報在操作系統(tǒng)中分解到步驟18生成的TCP套接字,從而進(jìn)入連接狀態(tài)。

 

22.  借助筆記本電腦上的套接字,現(xiàn)在準(zhǔn)備向www.baidu.com發(fā)送字節(jié)了,小明的瀏覽器生成包含要獲取的URL的HTTP GET報文。報文則寫入套接字,其中GET報文成為一個TCP報文段的有效載荷。TCP報文段放入數(shù)據(jù)報,再放入以太網(wǎng)幀。交付給www.baidu.com,如同步驟18-20那樣。

 

23.  在www.baidu.com的HTTP服務(wù)器從TCP套接字讀取HTTP GET報文,生成一個HTTP響應(yīng)報文,將請求的web頁面內(nèi)容放入HTTP響應(yīng)體中,并將報文段發(fā)送到套接字中。

 

24.  包含HTTP響應(yīng)報文的數(shù)據(jù)報通過某度、unicom、學(xué)校網(wǎng)絡(luò)轉(zhuǎn)發(fā),最后到達(dá)小明的筆記本電腦。小明的瀏覽器從套接字中讀取HTTP響應(yīng),從響應(yīng)中抽取web頁面的html等,經(jīng)過瀏覽器引擎顯示出web頁面!大功告成!\(^o^)/YES!\(^o^)/YES!

 

六.寫在后頭

上面的一個場景已經(jīng)涉及到了計算機網(wǎng)絡(luò)中的很多協(xié)議,如果你還想進(jìn)了解關(guān)于其中的web技術(shù)的話,轉(zhuǎn)到我的另一篇博客:從地址欄輸入url到顯示頁面都發(fā)生了什么?。在這個場景里,還忽略了一些可能的附加的協(xié)議(舉幾個栗子,運行在學(xué)校網(wǎng)關(guān)路由器中的網(wǎng)絡(luò)地址轉(zhuǎn)換NAT,到學(xué)校網(wǎng)絡(luò)的無線網(wǎng)絡(luò)接入,接入學(xué)校網(wǎng)絡(luò)或者對報文段和數(shù)據(jù)報加密的安全協(xié)議,網(wǎng)絡(luò)管理協(xié)議,等等),還有一些人們在公共互聯(lián)網(wǎng)中的考慮(CDN,負(fù)載均衡,web緩存,DNS等級體系,等等),但是上述的步驟已經(jīng)可以運行了。由此二十多個步驟可以看到,計算機網(wǎng)絡(luò)真的非常復(fù)雜,但是作為用戶完全不需要知道這些細(xì)節(jié),也就是說對我們來說,上述的步驟都是“透明的”,向研制這些協(xié)議的先輩致敬。

 

http://www.cnblogs.com/yuxiuyan/p/6903242.html