歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> TCP/IP原理、基礎以及在Linux上的實現(下)

TCP/IP原理、基礎以及在Linux上的實現(下)

日期:2017/2/27 9:36:34   编辑:更多Linux

  3.1 IP數據報頭    一個IP數據報由一個頭部和數據部分構成。頭部包括一個20字節的固定長度部分和一個可選任意長度部分。頭部格式如圖5所示。  

  點擊查看大圖

  版本:4位長。記錄了數據報對應的協議版本號。當前的IP協議有兩個版本:IPV4 和IPV6。    IHL:4位長。代表頭部的總長度,以32位字節為一個單位。    服務類型:8位長。使主機可以告訴子網它想要什麼樣的服務。如下圖所示,服務類型域又分為了5個部分。優先權字段是標志優先級的;三個標志位分別代表延遲、吞吐量、可靠性。  

 

  總長:16位。指頭部和數據的總長。最大長度是65535個字節。    標識:16位。通過它使目的主機判斷新來的分段屬於哪個分組,所有屬於同一分組的分段包含同樣的標識值。    DF:代表不要分段。它命令路由器不要將數據報分段,因為目的端不能重組分段。    MF:代表還有進一步的分段,用它來標志是否所有的分組都已到達。除了最後一個分段的所有分段都設置了這一位。    分段偏移:13位。標明分段在當前數據報的什麼位置。    生命期:8位。用來限制分組生命周期的計數器。它在每個節點中都遞減,而且當在一個路由器中排隊時可以倍數遞減。    協議:8位。說明將分組發送給那個傳輸進程,如TCR、VDP等。    頭校驗和:16位。僅用來校驗頭部。    源地址: 32位。產生IP數據報的源主機IP地址。    目的地址:32位。IP數據報的目的主機的IP地址。    可選項:是變長的。每個可選項用一個字節標明內容。有些可選項還跟有一字節的可選項長度字段,其後是一個或多個數據字節。現在已定義了安全性、嚴格的源路由選擇、松的源路由選擇、記錄路由和時間標記五個可選項。但不是所有的路由器都支持全部5個可選項。    安全性選項說明了信息的安全程度。    嚴格的源路由選擇選項以一系列的IP地址方式,給出了從源到目的地的完整路徑。數據報必須嚴格地從這條路徑傳送。當路由選擇表崩潰,系統管理員發送緊急分組時,或作時間測量時,此字段很有用。    松的源路由選擇選項要求分組遍及所列的路由器,但它可以在其間穿過其它的路由器。    記錄路由選項讓沿途的路由器都將其IP地址加到可選字段之後,這使系統管理者可以跟蹤路由選擇算法的錯誤。    時間標記選項像記錄路由選項一樣,除了記錄32位的IP地址外,每個路由器還要記錄一個32位的時間標記。同樣地,這一選擇可用來為路由選擇算法查錯。    3.2 IP數據報的分段與重組    IP數據報是通過封裝為物理幀來傳輸的。由於因特網是通過各種不同物理網絡技術互連起來的,在因特網的不同部分,物理幀的大小(最大傳輸單元MTU)可能各不相同。為了最大程度的利用物理網絡的能力,IP模塊以所在的物理網絡的MTU做為依據,來確定IP數據報的大小。當IP數據報在兩個不同MTU的網絡之間傳輸時,就可能出現IP數據報的分段與重組操作。    在IP頭中控制分段和重組的IP頭域有三個:標識域、標志域、分段偏移域。標識是源主機賦予IP數據報的標識符。目的主機根據標識域來判斷收到的IP數據報分段屬於哪一個數據報,以進行IP數據報重組。標志域中的DF位標識該IP數據報是否允許分段。當需要對IP數據報進行分段時,如果DF位置1,網關將會拋棄該IP數據報,並向源主機發送出錯信息。標志域中的MF位標識該IP數據報分段是否是最後一個分段。分段偏移域記錄了該IP數據報分段在原IP數據報中的偏移量。偏移量是8字節的整數倍。分段偏移域被用來確定該IP數據報分段在IP數據報重組時的順序。    IP數據報在被傳輸過程中,一旦被分段,各段就作為獨立的IP數據報進行傳輸,在到達目的主機之前有可能會被再次或多次分段。但是IP數據報分段的重組都只在目的主機進行。    3.3 IP對輸入數據報的處理    IP對輸入數據報的處理分為兩種,一種是主機對數據報的處理,一種是網關對數據報的處理。    當IP數據報到達主機時,如果IP數據報的目的地址與主機地址匹配,IP接收該數據報並將它傳給高級協議軟件處理;否則拋棄該IP數據報。    網關則不同,當IP數據報到達網關IP層後,網關首先判斷本機是否是數據報到達的目的主機。如果是,網關將接收到的IP數據報上傳給高級協議軟件處理。如果不是,網關將對接收到的IP數據報進行尋徑,並隨後將其轉發出去。    3.4 IP對輸出數據報的處理    IP對輸出數據報的處理也分為兩種,一種是主機對數據報的處理,一種是網關對數據報的處理。    對於網關來說,IP接收到IP數據報後,經過尋徑,找到該IP數據報的傳輸路徑。該路徑實際上是全路徑中的下一個網關的IP地址。然後,該網關將該IP數據報和尋徑到的下一個網關的地址交給網絡接口軟件。網絡接口軟件收到IP數據報和下一個網關地址後,首先調用ARP完成下一個網關IP地址到物理地址的映射,然後將IP數據報封裝成幀,最後由子網完成數據報的物理傳輸。    ICMP協議  ICMP(Internet Control Message Protocol)-因特網控制報文協議。ICMP主要用於差錯信息和控制信息的構造及某些網絡信息的獲取。ICMP與IP 同屬IP層,但ICMP報文是經IP封裝後,作為IP數據報發送出去的。不把ICMP作為一個獨立的協議層次,是因為ICMP不是上層協議的基礎,在概念上構不成一個獨立的層次。    ICMP消息包括以下類型:目的不可達、超時、參數問題、源端抑制、重定向、回聲請求、回聲應答、時間標記請求、時間標記應答。    目的不可達消息用來報告子網或路由器不能定位目的地,或設置了DF位的分組不能繞過"小分組"網絡。    超時消息用來報告報文由於計時器為零而被丟棄。    參數問題消息表明在頭部字段中發現了非法值。    源端抑制消息用來抑制發送過多分組的主機。當主機收到這個消息,就要減慢發送速度。    重定向消息在路由器發現可能出現了路由錯誤時發送。    回聲請求和回聲應答消息用來測試目的是否可達且正常運行。收到回聲請求消息,目的端應該往回發一個回聲應答消息。時間標記請求和時間標記應答與此類似,只是消息到達時間和應答發出時間應加入應答中,其好處是可以用來測試網絡性能。    IP在Linux上的實現    如圖6所示,Linux以分層的軟件結構實現了TCP/IP協議。BSD套接字由一般性的套接字管理軟件INET套接字層支持。INET套接字管理著基於IP的TCP或UDP協議端。在傳輸UDP數據報時,Linux不必關心數據報是否安全到達目的端。但對TCP數據報來說,Linux需要對數據報進行編號,數據報的源端和目的端需要協調工作,以便保證數據報不會丟失,或以錯誤的順序發送。IP層包含的代碼需要處理數據報的報頭信息,並且必須將傳入的數據報發送到TCP或 UDP兩者中正確的一層處理。在IP層之下是Linux的網絡設備層,其中包括以太網設備或PPP設備等。和Linux系統中的其它設備不同,網絡設備並不總代表實際的物理設備,例如,回環設備就是一個純軟件設備。ARP協議提供地址解析功能,因此它處於IP層和網絡設備層之間。  

 




                圖6 Linux網絡分層結構圖    1 套接字緩沖區    Linux利用套接字緩沖區在協議層和網絡設備之間傳送數據。Sk_buff包含了一些指針和長度信息,從而可讓協議層以標准的函數或方法對應用程序的數據進行處理。如圖7所示,每個sk_buff均包含一個數據塊、四個數據指針以及兩個長度字段。利用四個數據指針,各協議層可操縱和管理套接字緩沖區的數據,這四個指針的用途如下。    Head:指向內存中數據區的起始地址。Sk_buff和相關數據塊在分配之後,該指針的值是固定的。    Data:指向協議數據的當前起始地址。該指針的值隨當前擁有Sk_buff的協議層的變化而變化。    Tail:指向協議數據的當前結尾地址。和data指針一樣,該指針的值也隨當前擁有Sk_buff的協議層的變化而變化。    End:指向內存中數據區的結尾。和head指針一樣,Sk_buff被分配之後,該指針的值也固定不變。    Sk_buff的兩個長度字段,len和truesize,分別描述當前協議數據報的長度和數據緩沖區的實際長度。  

  32 接收IP數據報    當網絡設備從網絡上接收到數據報時,它必須將接收到的數據轉換為sk_buff數據結構,然後將該結構添加到backlog隊列中排隊。當backlog隊列變得很大時,接收到的sk_buff數據將會被丟棄。當新的sk_buff添加到backlog隊列時,網絡底層程序將被標志為就緒狀態,從而可以讓調度程序調度底層程序進行處理。    調度程序最終會運行網絡的底層處理程序。這時,網絡底層處理程序將處理任何等待傳輸的數據報,但在這之前,底層處理程序首先會處理sk_buff結構的backlog隊列。底層處理程序必須確定將接收到的數據報傳遞到哪個協議層。    在Linux進行網絡層的初始化時,每個協議要在ptype_all鏈表或ptype_base哈希表中添加packet_type數據結構以進行注冊。Packet_type數據結構包含協議類型、指向網絡設備的指針、指向協議的接收數據處理例程的指針等。Ptype_base是一個哈希表,其哈希函數以協議標識符為參數,內核通常利用該哈希表判斷應當接受傳入的網絡數據報的協議。通過檢查ptype_all鏈表和ptype_base哈希表,網絡底層處理程序會復制新的sk_buff,最終,sk_buff會傳遞到一個或多個目標協議的處理例程。    3 發送IP 數據報    網絡處理代碼必須建立sk_buff來包含要傳輸的數據,並且在協議層之間傳遞數據時,需要添加不同的協議頭和協議尾。    首先,IP協議需要決定要使用的網絡設備,網絡設備的選擇依賴於數據報的最佳路由。對於只利用調制解調器和PPP協議連接的計算機來說,路由的選擇比較容易,但是對於連接到以太網的計算機來說,路由的選擇是比較復雜的。    對每個要傳輸的IP數據報,IP利用路由表解析目標IP地址的路由。對每個可從路由表中找到路由的目標IP地址,路由表返回一個rtable數據結構描述可使用的路由。這包括要使用的源地址、網絡設備的device數據結構的地址以及預先建立的硬件頭信息。該硬件頭信息和網絡設備相關,包含了源和目標的物理地址以及其它的介質信息。    4 數據報的分段與重組    當傳輸IP數據報時,IP從IP路由表中找到發送該IP數據報的網絡設備,網絡設備對應的device數據結構中包含由一個mtu字段,該字段描述最大的傳輸單元。如果設備的mtu小於等待發送的IP數據報的大小,就需要將該IP數據報劃分為小的片斷。每個片斷由一個sk_buff代表,其中的IP頭標記為數據報片斷,以及該片斷在IP數據報中的偏移。最後的數據報被標志為最後的IP片斷。如果分段過程中IP不能分配sk_buff,則傳輸失敗。    IP片斷的接收較片斷的發送更加復雜一些,因為IP片斷可能以任意的順序接收到,而在重組之前,必須接受到所有的片斷。每次接收到IP數據報時,IP 要檢查是否是一個分段數據報。當第一次接收到分段的消息時,IP建立一個新的ipq數據結構,並將它鏈接到由等待重組的IP片斷形成的ipqueue鏈表中。隨著其他IP片斷的接收,IP找到正確的ipq數據結構,同時建立新的ipfrag數據結構描述該片斷。每個ipq數據結構中包含有其源和目標IP地址、高層協議的標識符以及該IP幀的標識符,從而唯一描述了一個分段的IP接收幀。當所有的片斷接收到之後,它們被組合成單一的sk_buff並傳遞到上一級協議層處理。如果定時器在所有的片斷到達之前到期,ipq數據結構和ipfrag被丟棄,並假定消息已經在傳輸中丟失,這時,高層協議需要請求源主機重新發送丟失的信息。

來源:賽迪網



來源:賽迪網



Copyright © Linux教程網 All Rights Reserved