一個資料包的網際網路漫遊記

geekfan發表於2014-03-22

  儘管大多數終端使用者都不關心Internet是如何工作的,但是我相信你們當中的仍然會有一些人對Internet運轉的基本原理非常感興趣。

  在這篇文章中,我們會通過闡釋一個資料包從源到目的地的征程,來試著撥開網際網路的第一層神祕面紗。由此出發,我們會盡量讓本文的內容保持簡單基礎。

  在更進一步之前,讓我們先快速簡要地理解一下DHCP和DNS的概念。

 DHCP

  你有沒有想過你的計算機是如何獲取IP地址的?嗯……首先你必須知道計算機獲取IP地址是有兩種途徑的,一種是靜態方式,另一種是動態方式。

  靜態方式就是由管理員在機器上手動設定IP地址。如果你的計算機連線在區域網或者類似的網路上的話,需要注意的是你所設定的IP地址不能和網路上任何其他機器的IP地址相同,因為那樣會引起IP地址衝突,兩臺機器就都不能連線到Internet了。

  動態方式就是計算機(在系統啟動的時候)請求一臺伺服器來為它分配一個IP地址。這一過程使用的協議稱為動態主機配置協議(DHCP)。這裡提到的伺服器就是DHCP伺服器,這臺伺服器負責為網路上所有的計算機分配IP地址。此時由DHCP來保證沒有IP地址衝突。如果一臺機器關閉繼而重啟,那麼一條重新整理DHCP的請求就傳送到DHCP伺服器上,這一次可能會分配給它一臺與原來相同或者不同的IP地址。通常DHCP伺服器會得到一個IP地址池,DHCP伺服器只能分配該地址池內的地址。這麼做是為了保證將其他IP地址作為靜態地址的時候不會引起任何衝突。

 DNS

  我們大多數人都使用過google.com進行搜尋,不過你有沒有想過為什麼在瀏覽器裡面輸入google.com就能連線到Google的伺服器呢?嗯……要理解這件事情,我們需要理解域名伺服器(DNS)的概念。

  就如同現實生活中人們通過名字互相區分一樣,在計算機網路的世界裡,不同的計算機之間通過指派給它們的IP地址來互相區分。IP地址有兩種型別:公有和私有。通常伺服器使用公有地址,這是因為他們要被全世界數以百萬計的計算機訪問。至於你那連線在路由器上的個人電腦,它通常獲取到的是私有IP。由於公有地址的數量是有限的,所以現在搭設區域網(在一個有著公有IP的路由下搭建)然後使用私有地址開始變得流行並且非常成功。

  記憶IP地址這樣的任務對於大多數人來說有些困難,於是每個伺服器都還有一個名字(比如google.com)。這樣終端使用者只需要記住這個名字,在瀏覽器中輸入它,然後敲回車就可以了。現在讓我來看看當使用者在瀏覽器中輸入名字並敲回車之後究竟發生了什麼。首先,需要把域名轉換成對應的IP。要完成這項任務,需要給預設閘道器(大多數情況下就是路由器)傳送一條與DNS請求。路由都會配置一個DNS伺服器地址,這個地址便是DNS請求的目的地。

  DNS伺服器用來將域名轉換成IP地址。當DNS伺服器收到一條請求後,它會檢查它有沒有該請求需要的轉換資訊。如果沒有這條轉換資訊,那麼DNS伺服器會把這條請求轉發給其他的DNS伺服器。通過這種方式,就完成了從域名到IP地址的轉換。轉換結果隨後會發回到發出請求的計算機。

 DNS之後又發生了些些什麼?

  要理解下面的解釋,你應該對TCP/IP協議族有一定的瞭解。當然啦,我們會盡量保持解釋的簡單性。

  • 一旦通過DNS得到了目標IP地址,應用層就會準備好一條HTTP GET請求。隨後這條請求會前進到傳輸層。
  • 這一層有兩個主要的協議——TCP和UDP。正是在這一層,該請求被封裝為了傳輸層資料包。如果用的是TCP協議,還要保證包的大小不能超過源和目的地之間MTU(最大傳輸單元)的最小值。這樣做的目的是避免資料包在傳輸過程中分片(fragmentation)。另一方面,如果用的UDP的話,就不用顧慮這麼多了,當然了這種情況下,包就有可能分片了。
  • 一旦傳輸層的包封好了,接著它就會被推到IP層。這一層會增加源和目的地的IP地址以及一些其他有用的資訊,諸如TTL(time to live生存期)、分段資訊等等。所有的這些資訊在資料包抵達目的地的路途中都是有用的。
  • 當資料包進入到資料鏈路層之後,與MAC地址相關的資訊就會加諸其上,隨後資料包就會被推送到物理層。這樣一串“0”和“1”就會從你的網路卡里傳送到物理媒介中去。

  如果資料包的目的地沒有直接連線在源計算機上,那麼根據源計算機上儲存的路由資訊,資料包就會傳送到最近的網路節點上去。網路中有各種不同的節點,比如路由、網橋、閘道器等等。每一種都有重要的作用,例如路由用來傳送IP包,網橋用來連線不同協議的異構網路。

  如果我們考慮一個簡單的網路的話,路由就是將資料包從源送到目的地的最主要的角色。資料包離開源計算機後,與其相連的路由(資料要先傳送到這裡)的MAC地址就這個包的目的MAC地址。

  資料包到達該路由之後,路由就會做下面幾件事情:

  • 減記TTL值,重新計算資料包的校驗和。
  • 搜尋其路由表,以檢查其中有沒有資料包的目的IP所對應的主機。如果有的,路由就將該包發到相應的主機。
  • 如果沒有這樣的一條路由,就從路由表中搜尋源於該目的IP的網路的地址。如果有的話就將該包傳送到這個特定的網路。
  • 如果上面的兩次搜尋都失敗的話,該資料包就被髮送到路由表中指定的預設路由。

  上面的所有情況中,不論資料包是在路由之間傳送還是從路由傳送到目的地,目的MAC地址都會變成最近的路由或者目的地的MAC地址。通過這種方式,目的IP地址保持不變,而目的MAC地址不斷從一個路由變為另一個。就是這樣,資料包從一臺路由到下一臺路由,直到它抵達終點。

  啊哈,千難萬險之後我們的HTTP GET請求終於到達目的地啦:

  • 資料包首先抵達物理層,該層向CPU傳送一個IRQ來告訴CPU有資料到了,需要處理。
  • 當資料被送到資料鏈路層後,就會檢查它的MAC地址來確認該資料包確實發到這臺計算機的。
  • 如果上述檢查通過的話,資料包就會傳到IP層。在這裡會檢查資料包的IP地址以及其校驗和,隨後將其傳送到相應的傳輸層。
  • 這些都完成了之後,該資訊(在我們的例子裡是HTTP GET請求)就會根據埠的值被送到監聽該埠的應用中去。
  • 我們的請求就是這樣送抵Google的網路伺服器的。

  之後,相應的響應會以與上述相同的方式傳送回來。

  現在你都瞭解了,這就是資料包在Internet上從源到目的地的旅程。

  原文連結: Himanshu Arora 翻譯: 極客範 - 八卦愛好者

相關文章