上一篇文章分析了互聯(lián)網(wǎng)的總體構(gòu)思,從下至上,每一層協(xié)議的設(shè)計思想。
這是從設(shè)計者的角度看問題,今天我想切換到用戶的角度,看看用戶是如何從上至下,與這些協(xié)議互動的。
(接上文)
七、一個小結(jié)
先對前面的內(nèi)容,做一個小結(jié)。
我們已經(jīng)知道,網(wǎng)絡(luò)通信就是交換數(shù)據(jù)包。電腦A向電腦B發(fā)送一個數(shù)據(jù)包,后者收到了,回復(fù)一個數(shù)據(jù)包,從而實現(xiàn)兩臺電腦之間的通信。數(shù)據(jù)包的結(jié)構(gòu),基本上是下面這樣:
發(fā)送這個包,需要知道兩個地址:
* 對方的MAC地址
* 對方的IP地址
有了這兩個地址,數(shù)據(jù)包才能準(zhǔn)確送到接收者手中。但是,前面說過,MAC地址有局限性,如果兩臺電腦不在同一個子網(wǎng)絡(luò),就無法知道對方的MAC地址,必須通過網(wǎng)關(guān)(gateway)轉(zhuǎn)發(fā)。
上圖中,1號電腦要向4號電腦發(fā)送一個數(shù)據(jù)包。它先判斷4號電腦是否在同一個子網(wǎng)絡(luò),結(jié)果發(fā)現(xiàn)不是(后文介紹判斷方法),于是就把這個數(shù)據(jù)包發(fā)到網(wǎng)關(guān)A。網(wǎng)關(guān)A通過路由協(xié)議,發(fā)現(xiàn)4號電腦位于子網(wǎng)絡(luò)B,又把數(shù)據(jù)包發(fā)給網(wǎng)關(guān)B,網(wǎng)關(guān)B再轉(zhuǎn)發(fā)到4號電腦。
1號電腦把數(shù)據(jù)包發(fā)到網(wǎng)關(guān)A,必須知道網(wǎng)關(guān)A的MAC地址。所以,數(shù)據(jù)包的目標(biāo)地址,實際上分成兩種情況:
| 場景 | 數(shù)據(jù)包地址 |
| 同一個子網(wǎng)絡(luò) | 對方的MAC地址,對方的IP地址 |
| 非同一個子網(wǎng)絡(luò) | 網(wǎng)關(guān)的MAC地址,對方的IP地址 |
發(fā)送數(shù)據(jù)包之前,電腦必須判斷對方是否在同一個子網(wǎng)絡(luò),然后選擇相應(yīng)的MAC地址。接下來,我們就來看,實際使用中,這個過程是怎么完成的。
八、用戶的上網(wǎng)設(shè)置
8.1 靜態(tài)IP地址
你買了一臺新電腦,插上網(wǎng)線,開機,這時電腦能夠上網(wǎng)嗎?
通常你必須做一些設(shè)置。有時,管理員(或者ISP)會告訴你下面四個參數(shù),你把它們填入操作系統(tǒng),計算機就能連上網(wǎng)了:
* 本機的IP地址
* 子網(wǎng)掩碼
* 網(wǎng)關(guān)的IP地址
* DNS的IP地址
下圖是Windows系統(tǒng)的設(shè)置窗口。
這四個參數(shù)缺一不可,后文會解釋為什么需要知道它們才能上網(wǎng)。由于它們是給定的,計算機每次開機,都會分到同樣的IP地址,所以這種情況被稱作”靜態(tài)IP地址上網(wǎng)”。
但是,這樣的設(shè)置很專業(yè),普通用戶望而生畏,而且如果一臺電腦的IP地址保持不變,其他電腦就不能使用這個地址,不夠靈活。出于這兩個原因,大多數(shù)用戶使用”動態(tài)IP地址上網(wǎng)”。
8.2 動態(tài)IP地址
所謂”動態(tài)IP地址”,指計算機開機后,會自動分配到一個IP地址,不用人為設(shè)定。它使用的協(xié)議叫做DHCP協(xié)議。
這個協(xié)議規(guī)定,每一個子網(wǎng)絡(luò)中,有一臺計算機負(fù)責(zé)管理本網(wǎng)絡(luò)的所有IP地址,它叫做”DHCP服務(wù)器”。新的計算機加入網(wǎng)絡(luò),必須向”DHCP服務(wù)器”發(fā)送一個”DHCP請求”數(shù)據(jù)包,申請IP地址和相關(guān)的網(wǎng)絡(luò)參數(shù)。
前面說過,如果兩臺計算機在同一個子網(wǎng)絡(luò),必須知道對方的MAC地址和IP地址,才能發(fā)送數(shù)據(jù)包。但是,新加入的計算機不知道這兩個地址,怎么發(fā)送數(shù)據(jù)包呢?
DHCP協(xié)議做了一些巧妙的規(guī)定。
8.3 DHCP協(xié)議
首先,它是一種應(yīng)用層協(xié)議,建立在UDP協(xié)議之上,所以整個數(shù)據(jù)包是這樣的:
(1)最前面的”以太網(wǎng)標(biāo)頭”,設(shè)置發(fā)出方(本機)的MAC地址和接收方(DHCP服務(wù)器)的MAC地址。前者就是本機網(wǎng)卡的MAC地址,后者這時不知道,就填入一個廣播地址:FF-FF-FF-FF-FF-FF。
(2)后面的”IP標(biāo)頭”,設(shè)置發(fā)出方的IP地址和接收方的IP地址。這時,對于這兩者,本機都不知道。于是,發(fā)出方的IP地址就設(shè)為0.0.0.0,接收方的IP地址設(shè)為255.255.255.255。
(3)最后的”UDP標(biāo)頭”,設(shè)置發(fā)出方的端口和接收方的端口。這一部分是DHCP協(xié)議規(guī)定好的,發(fā)出方是68端口,接收方是67端口。
這個數(shù)據(jù)包構(gòu)造完成后,就可以發(fā)出了。以太網(wǎng)是廣播發(fā)送,同一個子網(wǎng)絡(luò)的每臺計算機都收到了這個包。因為接收方的MAC地址是FF-FF-FF-FF-FF-FF,看不出是發(fā)給誰的,所以每臺收到這個包的計算機,還必須分析這個包的IP地址,才能確定是不是發(fā)給自己的。當(dāng)看到發(fā)出方IP地址是0.0.0.0,接收方是255.255.255.255,于是DHCP服務(wù)器知道”這個包是發(fā)給我的”,而其他計算機就可以丟棄這個包。
接下來,DHCP服務(wù)器讀出這個包的數(shù)據(jù)內(nèi)容,分配好IP地址,發(fā)送回去一個”DHCP響應(yīng)”數(shù)據(jù)包。這個響應(yīng)包的結(jié)構(gòu)也是類似的,以太網(wǎng)標(biāo)頭的MAC地址是雙方的網(wǎng)卡地址,IP標(biāo)頭的IP地址是DHCP服務(wù)器的IP地址(發(fā)出方)和255.255.255.255(接收方),UDP標(biāo)頭的端口是67(發(fā)出方)和68(接收方),分配給請求端的IP地址和本網(wǎng)絡(luò)的具體參數(shù)則包含在Data部分。
新加入的計算機收到這個響應(yīng)包,于是就知道了自己的IP地址、子網(wǎng)掩碼、網(wǎng)關(guān)地址、DNS服務(wù)器等等參數(shù)。
8.4 上網(wǎng)設(shè)置:小結(jié)
這個部分,需要記住的就是一點:不管是”靜態(tài)IP地址”還是”動態(tài)IP地址”,電腦上網(wǎng)的首要步驟,是確定四個參數(shù)。這四個值很重要,值得重復(fù)一遍:
* 本機的IP地址
* 子網(wǎng)掩碼
* 網(wǎng)關(guān)的IP地址
* DNS的IP地址
有了這幾個數(shù)值,電腦就可以上網(wǎng)”沖浪”了。接下來,我們來看一個實例,當(dāng)用戶訪問網(wǎng)頁的時候,互聯(lián)網(wǎng)協(xié)議是怎么運作的。
九、一個實例:訪問網(wǎng)頁
9.1 本機參數(shù)
我們假定,經(jīng)過上一節(jié)的步驟,用戶設(shè)置好了自己的網(wǎng)絡(luò)參數(shù):
* 本機的IP地址:192.168.1.100
* 子網(wǎng)掩碼:255.255.255.0
* 網(wǎng)關(guān)的IP地址:192.168.1.1
* DNS的IP地址:8.8.8.8
然后他打開瀏覽器,想要訪問Google,在地址欄輸入了網(wǎng)址:www.google.com。
這意味著,瀏覽器要向Google發(fā)送一個網(wǎng)頁請求的數(shù)據(jù)包。
9.2 DNS協(xié)議
我們知道,發(fā)送數(shù)據(jù)包,必須要知道對方的IP地址。但是,現(xiàn)在,我們只知道網(wǎng)址www.google.com,不知道它的IP地址。
DNS協(xié)議可以幫助我們,將這個網(wǎng)址轉(zhuǎn)換成IP地址。已知DNS服務(wù)器為8.8.8.8,于是我們向這個地址發(fā)送一個DNS數(shù)據(jù)包(53端口)。
然后,DNS服務(wù)器做出響應(yīng),告訴我們Google的IP地址是172.194.72.105。于是,我們知道了對方的IP地址。
9.3 子網(wǎng)掩碼
接下來,我們要判斷,這個IP地址是不是在同一個子網(wǎng)絡(luò),這就要用到子網(wǎng)掩碼。
已知子網(wǎng)掩碼是255.255.255.0,本機用它對自己的IP地址192.168.1.100,做一個二進(jìn)制的AND運算(兩個數(shù)位都為1,結(jié)果為1,否則為0),計算結(jié)果為192.168.1.0;然后對Google的IP地址172.194.72.105也做一個AND運算,計算結(jié)果為172.194.72.0。這兩個結(jié)果不相等,所以結(jié)論是,Google與本機不在同一個子網(wǎng)絡(luò)。
因此,我們要向Google發(fā)送數(shù)據(jù)包,必須通過網(wǎng)關(guān)192.168.1.1轉(zhuǎn)發(fā),也就是說,接收方的MAC地址將是網(wǎng)關(guān)的MAC地址。
9.4 應(yīng)用層協(xié)議
瀏覽網(wǎng)頁用的是HTTP協(xié)議,它的整個數(shù)據(jù)包構(gòu)造是這樣的:
HTTP部分的內(nèi)容,類似于下面這樣:
GET / HTTP/1.1
Host: www.google.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1) ……
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: … …
我們假定這個部分的長度為4960字節(jié),它會被嵌在TCP數(shù)據(jù)包之中。
9.5 TCP協(xié)議
TCP數(shù)據(jù)包需要設(shè)置端口,接收方(Google)的HTTP端口默認(rèn)是80,發(fā)送方(本機)的端口是一個隨機生成的1024-65535之間的整數(shù),假定為51775。
TCP數(shù)據(jù)包的標(biāo)頭長度為20字節(jié),加上嵌入HTTP的數(shù)據(jù)包,總長度變?yōu)?980字節(jié)。
9.6 IP協(xié)議
然后,TCP數(shù)據(jù)包再嵌入IP數(shù)據(jù)包。IP數(shù)據(jù)包需要設(shè)置雙方的IP地址,這是已知的,發(fā)送方是192.168.1.100(本機),接收方是172.194.72.105(Google)。
IP數(shù)據(jù)包的標(biāo)頭長度為20字節(jié),加上嵌入的TCP數(shù)據(jù)包,總長度變?yōu)?000字節(jié)。
9.7 以太網(wǎng)協(xié)議
最后,IP數(shù)據(jù)包嵌入以太網(wǎng)數(shù)據(jù)包。以太網(wǎng)數(shù)據(jù)包需要設(shè)置雙方的MAC地址,發(fā)送方為本機的網(wǎng)卡MAC地址,接收方為網(wǎng)關(guān)192.168.1.1的MAC地址(通過ARP協(xié)議得到)。
以太網(wǎng)數(shù)據(jù)包的數(shù)據(jù)部分,最大長度為1500字節(jié),而現(xiàn)在的IP數(shù)據(jù)包長度為5000字節(jié)。因此,IP數(shù)據(jù)包必須分割成四個包。因為每個包都有自己的IP標(biāo)頭(20字節(jié)),所以四個包的IP數(shù)據(jù)包的長度分別為1500、1500、1500、560。
9.8 服務(wù)器端響應(yīng)
經(jīng)過多個網(wǎng)關(guān)的轉(zhuǎn)發(fā),Google的服務(wù)器172.194.72.105,收到了這四個以太網(wǎng)數(shù)據(jù)包。
根據(jù)IP標(biāo)頭的序號,Google將四個包拼起來,取出完整的TCP數(shù)據(jù)包,然后讀出里面的”HTTP請求”,接著做出”HTTP響應(yīng)”,再用TCP協(xié)議發(fā)回來。
本機收到HTTP響應(yīng)以后,就可以將網(wǎng)頁顯示出來,完成一次網(wǎng)絡(luò)通信。
這個例子就到此為止,雖然經(jīng)過了簡化,但它大致上反映了互聯(lián)網(wǎng)協(xié)議的整個通信過程。
原文來自:阮一峰的網(wǎng)絡(luò)日志
哈爾濱品用軟件有限公司致力于為哈爾濱的中小企業(yè)制作大氣、美觀的優(yōu)秀網(wǎng)站,并且能夠搭建符合百度排名規(guī)范的網(wǎng)站基底,使您的網(wǎng)站無需額外費用,即可穩(wěn)步提升排名至首頁。歡迎體驗最佳的哈爾濱網(wǎng)站建設(shè)。
