linux高性能服務器編程學習筆記一:TCP/IP協議詳解

1、TCP/IP協議族是一個四層協議系統,自底向上依次爲數據鏈路層、網絡層、傳輸層、應用層。

2、數據鏈路層常用的協議有ARP協議。網絡層常用的協議有ICMP協議和TP協議。傳輸層常用的協議有TCP協議和UDP協議。應用層常用的協議有ping、telnet、OSPF協議、DNS協議,其中ping直接使用網絡層的ICMP協議,OSPF協議直接使用網絡層的IP協議,telnet使用網絡層的TCP協議,而DNS使用網絡層的UDP協議。見下圖:

3、數據鏈路層簡介

(1)數據鏈路層實現了網絡驅動程序以處理數據在物理媒介上(比如以太網)的傳輸。不同的物理網絡有着不同的物理特性,而網絡驅動程序就對其進行了封裝,以便爲上層協議提供統一的接口。

(2)要知道,在網絡層路由尋址一臺機器使用的是IP地址,而在數據鏈路層尋址一臺機器一般來說使用的是物理地址,因此在傳送數據的時候,網絡層必須先將目標機器的IP地址轉化爲目標機器的物理地址,進而使用鏈路層提供的服務。

4、網絡層簡介

(1)網絡層主要是實現數據包的選址和轉發。一般來說,多個主機或者局域網通過路由器連接可以形成廣域網。並且通常兩臺通信的主機並不是直接相連的,兩者之間會存在多箇中間節點(即路由器),此時就需要爲其選擇最好的或合適的路由路徑,用於兩臺主機之間進行通信。網絡層對上層(傳輸層)協議隱藏了網絡拓撲連接的細節,使得在傳輸層和網絡應用程序看來,通信兩方是直接相連的

(2)網絡層的核心協議是IP協議。IP協議根據數據包的目的IP地址來選擇如何投遞它。假如數據包是需要多次進行轉發才能到達目的地,那麼在轉發過程中,IP協議總是會爲其尋找合適的下一跳路由器,並交付給它負責轉發,最終到達目的地,或者由於發送失敗而丟棄。

(3)在網絡層中,還有一個協議是IP協議的重要補充,那就是ICMP協議。分爲兩大類:差錯報文(目標不可達(類型爲3)和重定向(類型爲5))和查詢報文(ping程序使用ICMP查詢報文查看目標是否可達)。具體格式見:

8位類型用於區分報文類型,8位代碼具體細分不同的條件,例如,在類型爲5的重定向報文中,0代碼表示對網絡重定向,1表示對主機重定向。16位校驗和(CRC循環冗餘校驗)用於校驗整個ICMP報文在傳輸過程中是否有損壞。

5、傳輸層簡介

(1)傳輸層協議不似網絡層協議一樣,使用的是逐跳通信方式,它只關心通信的起始端和目的端。主要協議是TCP、UDP和SCTP協議

(2)TCP協議:面向鏈接,面向流以及可靠的協議。主要靠數據確認、超時重傳等機制來保證其可靠的性質。使用TCP協議通信的雙方必須先建立連接,並且在內核爲該連接維持一些必要的數據結構,例如:連接的狀態、讀寫緩衝區以及諸多定時器。在通信完畢也應當關閉連接以釋放這些內核數據。基於流即表示數據沒有邊界限制。發送端可以逐個字節的向數據流中寫入數據,接收端也可以逐個字節的向數據流讀數據。

(3)UDP協議:與TCP協議相反,無連接、不可靠基於數據報的協議。表示假如數據亂序或數據丟失,UDP協議也只是簡單的通知應用程序發送失敗。因此使用UDP協議需要自己提供類似超時重傳和數據確認的機制。與基於流相對,UDP是基於數據報的,也就是,每個UDP數據報都有一個長度,而接收端必須按照其長度爲最小單位讀取數據,否則造成數據截斷。

6、應用層簡介

(1)應用層負責應用程序的邏輯。數據鏈路層、網絡層以及傳輸層由於負責網絡通信的細節,必須既穩定又高效,因此一般在內核中實現。而應用層一般在用戶空間中實現,因爲它負責衆多的應用程序,比如文件傳輸、名稱查詢和網絡管理。比較常見的有ping程序(非協議)、telnet協議、OSPF協議(開放最短路徑優先,一種動態路由更新協議)、DNS協議(域名和IP地址的映射)

(2)應用層協議(或程序)可能跳過傳輸層直接使用網絡層協議,例如ping程序使用網絡層的ICMP協議。OSPF直接使用網絡層的IP協議。

7、封裝和分用簡介

(1)封裝:現在考慮以下,上層協議是如何使用下層協議提供的服務的呢?主要是通過封裝實現的。在應用程序數據發送到物理網絡之前,數據沿着協議棧由上到下依次傳遞,在傳遞的過程中,每一層都會加上自己的頭部信息以實現該層的功能。舉個例子,應用程序經過TCP封裝後稱爲TCP報文段。使用TCP協議必須先建立連接,並且在內核中維持相關數據,那麼這部分數據中的TCP頭部信息和TCP內核緩衝區數據(接收緩衝區或發送緩衝區)一起構成了TCP報文段。


那麼當應用程序使用send(或者write)函數向一個TCP連接中寫入數據時,內核中的TCP模塊會將數據由用戶空間複製到TCP內核發送緩衝區中。然後TCP模塊調用IP模塊提供的服務,傳遞的參數包括TCP頭部信息和TCP發送緩衝區的數據,即TCP報文段。(TCP的內核緩衝區會爲應用層數據保存副本)

   在這裏順帶提一下,UDP數據報被成功發送之後,UDP內核發送緩衝區的數據就會被立刻丟棄,因爲UDP提供的是不可靠的服務,無需爲應用層數據保存副本。這也就表明,若是應用程序檢測到數據報未能被接收端正確接收,如果要重發這個數據報,應用程序需要從用戶空間將該數據報拷貝到UDP內核發送緩衝區中。

   經過IP封裝後的數據稱爲IP數據報。其數據部分可能是TCP報文段、UDP數據報或者是ICMP報文。

   經過數據鏈路層封裝的數據稱爲幀。幀類型和傳輸媒介有關(以太網傳輸的是以太幀,令牌環網傳輸的是令牌環網幀)。

   以太網幀的格式


  6字節的目的物理地址以及6字節的源物理地址,2字節的類型用於在分用的時候交付給正確的模塊(IP模塊、ARP模塊)。4字節的CRC提供循環冗餘校驗。

  幀的最大傳輸單元(MTU),即幀最多能攜帶多少上層協議數據。通常受網絡類型的限制,例如以太網幀的MTU是1500,因此過長的IP數據報就可能會進行分片傳輸。

(2)分用:當幀到達目的主機時,沿着協議棧自底向上依次傳遞。各層協議依次處理幀中本層負責的頭部數據,並且根據自層頭部信息的類型字段將數據交付到相應的上層模塊當中。最終將處理後的幀交給目標應用程序


以以太網幀爲例:使用2字節的類型字段來標識上層協議,若類型字段爲0X800,表示數據部分爲IP數據報,那麼以太網驅動程序將數據交付給IP模塊。若類型字段爲0X806,則幀的數據部分爲ARP請求或應答報文,那麼以太網驅動程序將數據交付給ARP模塊。

   同樣,由於ICMP、TCP、IP協議都使用IP協議,所以IP數據報的頭部信息會有16位協議字段來表示這些協議以便交付給相應的模塊。TCP報文段和UDP數據報通過其頭部的16位端口號字段來區分上層應用程序。比如DNS的端口號爲53,HTTP協議的端口號爲80。(所有知名應用程序端口號都可在/etc/services文件中找到)。

8、ARP協議工作原理

(1)ARP協議的主要作用是IP地址到物理地址的映射。既然有IP地址和物理地址這兩種地址,那麼ARP請求/應答報文就應當有硬件類型字段(2個字節)和協議類型字段(2個字節)標識映射的類型。例如硬件類型爲1表示MAC地址,協議類型爲0X800表示IP地址。也就是IP地址到MAC地址的映射。然後還有硬件地址長度字段(1個字節)和協議地址長度字段(1個字節)兩個長度字段表徵相應的長度。爲了區分是ARP請求還是ARP應答報文或者RARP請求報文還是RARP應答報文,還需要有操作(2個字節)字段來標識。(相應的操作值爲1、2、3、4)。然後需要通信雙方的以太網和IP地址。其中發送的時候只填充除目的端以太網地址外的其它三個字段。目的端以太網地址在目的端發送ARP應答報文的時候填充進去並交換通信兩方的角色(ARP請求報文中的源端物理和IP地址變爲ARP應答報文中的目的端物理和IP地址,ARP請求報文中的目的端物理和IP地址變爲ARP應答報文中的源端物理和IP地址。)


ARP請求/應答報文的長度如上所示爲28字節,加上幀頭部和尾部的18字節,則完整的以太網幀爲46字節。(有些實現要求以太網幀的數據部分最短爲46字節,這種情況一個攜帶ARP請求/應答報文的以太網幀爲64字節)

9、DNS工作原理

(1)DNS是一套分佈式的域名服務系統,用於域名到IP地址的映射。每個DNS服務器上都存放着大量的機器名和IP地址的映射。

(2)一般來說,查詢分爲兩種:遞歸查詢和迭代查詢。遞歸查詢指的是若目標DNS服務器無法解析域名,則它作爲新的客戶向其它DNS服務器繼續查詢,以此遞歸下去,直至獲取結果並將該結果返回給客戶端。迭代查詢指的是若目標DNS服務器無法解析域名,則它會告訴客戶端其它DNS服務器的IP地址以供客戶端參考,由原來客戶端繼續向其它DNS服務器查詢。

10、SOCKET和TCP/IP協議族的關係

(1)由於數據鏈路層、網絡層、傳輸層協議是在內核中實現的,所以需要一套系統調用(SOCKET)使得應用程序能夠訪問這些協議提供的服務。

(2)由SOCKET定義的API主要有兩個作用:一是將應用程序數據從用戶空間拷貝到內核TCP/UDP發送緩衝區中,以此交付內核發送數據。或者從內核TCP/UDP接收緩衝區中複製數據到用戶空間中,以讀取數據。二是應用程序可以通過SOCKET定義的API修改內核中各層協議的某些頭部信息或其他數據結構,從而控制底層通信的行爲。比如通過setsockopt函數來設置IP數據報在網絡中存活的時間。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章