1. 程式人生 > >TCP IP協議棧的各個層次

TCP IP協議棧的各個層次

我們知道,TCP IP網路協議棧分為應用層(Application)、傳輸層(Transport)、網路層(Network)和鏈路層(Link)四層。如下圖所示

  圖 TCP IP協議棧

  兩臺計算機通過TCP IP協議通訊的過程如下所示

  圖 TCP IP通訊過程

  傳輸層及其以下的機制由核心提供,應用層由使用者程序提供(後面將介紹如何使用socket API編寫應用程式),應用程式對通訊資料的含義進行解釋,而傳輸層及其以下處理通訊的細節,將資料從一臺計算機通過一定的路徑傳送到另一臺計算機。應用層資料通過協議棧發到網路上時,每層協議都要加上一個資料首部(header),稱為封裝(Encapsulation),如下圖所示

  圖 TCP IP資料包的封裝

  不同的協議層對資料包有不同的稱謂,在傳輸層叫做段(segment),在網路層叫做資料報(datagram),在鏈路層叫做幀(frame)。資料封裝成幀後發到傳輸介質上,到達目的主機後每層協議再剝掉相應的首部,最後將應用層資料交給應用程式處理。

  上圖對應兩臺計算機在同一網段中的情況,如果兩臺計算機在不同的網段中,那麼資料從一臺計算機到另一臺計算機傳輸過程中要經過一個或多個路由器,如下圖所示

  圖 跨路由器通訊過程

  其實在鏈路層之下還有物理層,指的是電訊號的傳遞方式,比如現在乙太網通用的網線(雙絞線)、早期乙太網採用的的同軸電纜(現在主要用於有線電視)、光纖等都屬於物理層的概念。物理層的能力決定了最大傳輸速率、傳輸距離、抗干擾性等。集線器(Hub)是工作在物理層的網路裝置,用於雙絞線的連線和訊號中繼(將已衰減的訊號再次放大使之傳得更遠)。

  鏈路層有乙太網、令牌環網等標準,鏈路層負責網絡卡裝置的驅動、幀同步(就是說從網線上檢測到什麼訊號算作新幀的開始)、衝突檢測(如果檢測到衝突就自動重發)、資料差錯校驗等工作。交換機是工作在鏈路層的網路裝置,可以在不同的鏈路層網路之間轉發資料幀(比如十兆乙太網和百兆乙太網之間、乙太網和令牌環網之間),由於不同鏈路層的幀格式不同,交換機要將進來的資料包拆掉鏈路層首部重新封裝之後再轉發。

  網路層的IP協議是構成Internet的基礎。Internet上的主機通過IP地址來標識,Internet上有大量路由器負責根據IP地址選擇合適的路徑轉發資料包,資料包從Internet上的源主機到目的主機往往要經過十多個路由器。路由器是工作在第三層的網路裝置,同時兼有交換機的功能,可以在不同的鏈路層介面之間轉發資料包,因此路由器需要將進來的資料包拆掉網路層和鏈路層兩層首部並重新封裝。IP協議不保證傳輸的可靠性,資料包在傳輸過程中可能丟失,可靠性可以在上層協議或應用程式中提供支援。

  網路層負責點到點(point-to-point)的傳輸(這裡的"點"指主機或路由器),而傳輸層負責端到端(end-to-end)的傳輸(這裡的"端"指源主機和目的主機)。傳輸層可選擇TCP或UDP協議。TCP是一種面向連線的、可靠的協議,有點像打電話,雙方拿起電話互通身份之後就建立了連線,然後說話就行了,這邊說的話那邊保證聽得到,並且是按說話的順序聽到的,說完話掛機斷開連線。也就是說TCP傳輸的雙方需要首先建立連線,之後由TCP協議保證資料收發的可靠性,丟失的資料包自動重發,上層應用程式收到的總是可靠的資料流,通訊之後關閉連線。UDP協議不面向連線,也不保證可靠性,有點像寄信,寫好信放到郵筒裡,既不能保證信件在郵遞過程中不會丟失,也不能保證信件是按順序寄到目的地的。使用UDP協議的應用程式需要自己完成丟包重發、訊息排序等工作。

  目的主機收到資料包後,如何經過各層協議棧最後到達應用程式呢?整個過程如下圖所示

  圖 Multiplexing過程

  乙太網驅動程式首先根據乙太網首部中的"上層協議"欄位確定該資料幀的有效載荷(payload,指除去協議首部之外實際傳輸的資料)是IP、ARP還是RARP協議的資料報,然後交給相應的協議處理。假如是IP資料報,IP協議再根據IP首部中的"上層協議"欄位確定該資料報的有效載荷是TCP、UDP、ICMP還是IGMP,然後交給相應的協議處理。假如是TCP段或UDP段,TCP或UDP協議再根據TCP首部或UDP首部的"埠號"欄位確定應該將應用層資料交給哪個使用者程序。IP地址是標識網路中不同主機的地址,而埠號就是同一臺主機上標識不同程序的地址,IP地址和埠號合起來標識網路中唯一的程序。

  注意,雖然IP、ARP和RARP資料報都需要乙太網驅動程式來封裝成幀,但是從功能上劃分,ARP和RARP屬於鏈路層,IP屬於網路層。雖然ICMP、IGMP、TCP、UDP的資料都需要IP協議來封裝成資料報,但是從功能上劃分,ICMP、IGMP與IP同屬於網路層,TCP和UDP屬於傳輸層。