標籤:style blog http 使用 strong os
(接上文)
七、一個小結
先對前面的內容,做一個小結。
我們已經知道,網路通訊就是交換資料包。電腦A向電腦B發送一個資料包,後者收到了,回複一個資料包,從而實現兩台電腦之間的通訊。資料包的結構,基本上是下面這樣:
發送這個包,需要知道兩個地址:
對方的 MAC 位址
對方的 IP 位址
有了這兩個地址,資料包才能準確送到接收者手中。但是,前面說過,MAC 位址有局限性,如果兩台電腦不在同一個子網路,就無法知道對方的 MAC 位址,必須通過網關(gateway)轉寄。
中,1號電腦要向 4 號電腦發送一個資料包。它先判斷 4 號電腦是否在同一個子網路,結果發現不是(後文介紹判斷方法),於是就把這個資料包發到網關A。網關A通過路由協議,發現 4 號電腦位於子網路B,又把資料包發給網關B,網關B再轉寄到 4 號電腦。
1號電腦把資料包發到網關A,必須知道網關A的 MAC 位址。所以,資料包的目標地址,實際上分成兩種情況:
情境 |
資料包地址 |
同一個子網路 |
對方的 MAC 位址,對方的 IP 位址 |
非同一個子網路 |
網關的 MAC 位址,對方的 IP 位址 |
發送資料包之前,電腦必須判斷對方是否在同一個子網路,然後選擇相應的 MAC 位址。接下來,我們就來看,實際使用中,這個過程是怎麼完成的。
八、使用者的上網設定
8. 1 靜態 IP 位址
你買了一台新電腦,插上網線,開機,這時電腦能夠上網嗎?
通常你必須做一些設定。有時,管理員(或者 ISP)會告訴你下面四個參數,你把它們填入作業系統,電腦就能連上網了:
原生 IP 位址
子網路遮罩
網關的 IP 位址
DNS 的 IP 位址
是 Windows 系統的設定視窗。
這四個參數缺一不可,後文會解釋為什麼需要知道它們才能上網。由於它們是給定的,電腦每次開機,都會分到同樣的 IP 位址,所以這種情況被稱作"靜態 IP 位址上網"。
但是,這樣的設定很專業,普通使用者望而生畏,而且如果一台電腦的 IP 位址保持不變,其他電腦就不能使用這個地址,不夠靈活。出於這兩個原因,大多數使用者使用"動態 IP 位址上網"。
8. 2 動態 IP 位址
所謂"動態 IP 位址",指電腦開機後,會自動分配到一個 IP 位址,不用人為設定。它使用的協議叫做 DHCP 協議。
這個協議規定,每一個子網路中,有一台電腦負責管理本網路的所有 IP 位址,它叫做"DHCP 伺服器"。新的電腦加入網路,必須向"DHCP 伺服器"發送一個"DHCP 請求"資料包,申請 IP 位址和相關的網路參數。
前面說過,如果兩台電腦在同一個子網路,必須知道對方的 MAC 位址和 IP 位址,才能發送資料包。但是,新加入的電腦不知道這兩個地址,怎麼發送資料包呢?
DHCP 協議做了一些巧妙的規定。
8. 3 DHCP 協議
首先,它是一種應用程式層協議,建立在 UDP 協議之上,所以整個資料包是這樣的:
(1)最前面的"乙太網路標題",設定發出方(本機)的 MAC 位址和接收方(DHCP 伺服器)的 MAC 位址。前者就是本機網卡的 MAC 位址,後者這時不知道,就填入一個廣播位址:FF-FF-FF-FF-FF-FF。
(2)後面的"IP 標題",設定發出方的 IP 位址和接收方的 IP 位址。這時,對於這兩者,本機都不知道。於是,發出方的 IP 位址就設為0.0.0.0,接收方的 IP 位址設為 255.255.255.255。
(3)最後的"UDP 標題",設定發出方的連接埠和接收方的連接埠。這一部分是 DHCP 協議規定好的,發出方是 68 連接埠,接收方是 67 連接埠。
這個資料包構造完成後,就可以發出了。乙太網路是廣播發送,同一個子網路的每台電腦都收到了這個包。因為接收方的 MAC 位址是 FF-FF-FF-FF-FF-FF,看不出是發給誰的,所以每台收到這個包的電腦,還必須分析這個包的 IP 位址,才能確定是不是發過自己的。當看到發出方 IP 位址是0.0.0.0,接收方是 255.255.255.255,於是 DHCP 伺服器知道"這個包是發過我的",而其他電腦就可以丟棄這個包。
接下來,DHCP 伺服器讀出這個包的資料內容,分配好 IP 位址,發送回去一個"DHCP 響應"資料包。這個響應包的結構也是類似的,乙太網路標題的 MAC 位址是雙方的網卡地址,IP 標題的 IP 位址是 DHCP 伺服器的 IP 位址(發出方)和 255.255.255.255(接收方),UDP 標題的連接埠是 67(發出方)和 68(接收方),分配給請求端的 IP 位址和本網路的具體參數則包含在 Data 部分。
新加入的電腦收到這個響應包,於是就知道了自己的 IP 位址、子網路遮罩、網關地址、DNS 伺服器等等參數。
8. 4 上網設定:小結
這個部分,需要記住的就是一點:不管是"靜態 IP 位址"還是"動態 IP 位址",電腦上網的首要步驟,是確定四個參數。這四個值很重要,值得重複一遍:
原生 IP 位址
子網路遮罩
網關的 IP 位址
DNS 的 IP 位址
有了這幾個數值,電腦就可以上網"衝浪"了。接下來,我們來看一個執行個體,當使用者訪問網頁的時候,互連網協議是怎麼運作的。
九、一個執行個體:訪問網頁
9. 1 本機參數
我們假定,經過上一節的步驟,使用者佈建好了自己的網路參數:
原生 IP 位址:192.168.1.100
子網路遮罩:255.255.255.0
網關的 IP 位址:192.168.1.1
DNS 的 IP 位址:8.8.8.8
然後他開啟瀏覽器,想要訪問 Google,在地址欄輸入了網址:www.google.com。
這意味著,瀏覽器要向 Google 發送一個網頁請求的資料包。
9. 2 DNS 協議
我們知道,發送資料包,必須要知道對方的 IP 位址。但是,現在,我們只知道網址 www.google.com,不知道它的 IP 位址。
DNS 協議可以協助我們,將這個網址轉換成 IP 位址。已知 DNS 伺服器為8.8.8.8,於是我們向這個地址發送一個 DNS 資料包(53連接埠)。
然後,DNS 伺服器做出響應,告訴我們 Google 的 IP 位址是 172.194.72.105。於是,我們知道了對方的 IP 位址。
9. 3 子網路遮罩
接下來,我們要判斷,這個 IP 位址是不是在同一個子網路,這就要用到子網路遮罩。
已知子網路遮罩是 255.255.255.0,本機用它對自己的 IP 位址 192.168.1.100,做一個二進位的 AND 運算(兩個數位相同,結果為1,否則為0),計算結果為 192.168.1.0;然後對 Google 的 IP 位址 172.194.72.105 也做一個 AND 運算,計算結果為 172.194.72.0。這兩個結果不相等,所以結論是,Google 與本機不在同一個子網路。
因此,我們要向 Google 發送資料包,必須通過網關 192.168.1.1 轉寄,也就是說,接收方的 MAC 位址將是網關的 MAC 位址。
9. 4 應用程式層協議
瀏覽網頁用的是 HTTP 協議,它的整個資料包構造是這樣的:
HTTP 部分的內容,類似於下面這樣:
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 位元組,它會被嵌在 TCP 資料包之中。
9. 5 TCP 協議
TCP 資料包需要設定連接埠,接收方(Google)的 HTTP 連接埠預設是 80,發送方(本機)的連接埠是一個隨機產生的 1024-65535之間的整數,假定為 51775。
TCP 資料包的標題長度為 20 位元組,加上嵌入 HTTP 的資料包,總長度變為 4980 位元組。
9. 6 IP 協議
然後,TCP 資料包再嵌入 IP 資料包。IP 資料包需要設定雙方的 IP 位址,這是已知的,發送方是 192.168.1.100(本機),接收方是 172.194.72.105(Google)。
IP 資料包的標題長度為 20 位元組,加上嵌入的 TCP 資料包,總長度變為 5000 位元組。
9. 7 乙太網路協議
最後,IP 資料包嵌入乙太網路資料包。乙太網路資料包需要設定雙方的 MAC 位址,發送方為原生網卡 MAC 位址,接收方為網關 192.168.1.1 的 MAC 位址(通過 ARP 協議得到)。
乙太網路資料包的資料部分,最大長度為 1500 位元組,而現在的 IP 資料包長度為 5000 位元組。因此,IP 資料包必須分割成四個包。因為每個包都有自己的 IP 標題(20位元組),所以四個包的 IP 資料包的長度分別為 1500、1500、1500、560。
9. 8 伺服器端響應
經過多個網關的轉寄,Google 的伺服器 172.194.72.105,收到了這四個乙太網路資料包。
根據 IP 標題的序號,Google 將四個包拼起來,取出完整的 TCP 資料包,然後讀出裡面的"HTTP 要求",接著做出"HTTP 響應",再用 TCP 協議發回來。
本機收到 HTTP 響應以後,就可以將網頁顯示出來,完成一次網路通訊。
這個例子就到此為止,雖然經過了簡化,但它大致上反映了互連網協議的整個通訊過程。