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

來源:互聯網
上載者:User
 

導言:本篇作為理論基礎,將向我們講述TCP/IP的基本原理以及重要的協議細節,並在此基礎上介紹了TCP/IP在LINUX上的實現。

OSI參考模型及TCP/IP參考模型
OSI模型(open system interconnection reference model)是基於國際標準組織(ISO)的建議而發展起來的,它分為3-1所示的七層。當衛星和無線網路出現以後,現有的協議在和這些網路互聯時 出現了問題,所以需要一種新的參考體繫結構,能無縫地串連多個網路。這個體繫結構就是TCP/IP參考模型。


TCP 協議
網際網路在傳輸層有兩種主要的協 議:一種是連線導向的協議,一種是不需連線的協議。傳輸控制通訊協定TCP是(transmission control protocol)專門用於在不可靠的網際網路上提供可靠的、端對端的位元組流通訊的協議。通過在發送方和接收方分別建立一個稱為通訊端的通訊連接埠就可以獲得 TCP服務。所有的TCP 串連均是全雙工系統的和點到點的。

發送和接收方TCP實體以資料報的形式交換資料。一個資料報包含一個固定的20位元組的頭、一個可選部分以及0或多位元組的資料。對資料報的大小有兩個 限制條件:首先,每個資料報(包括TCP頭在內)必須適合IP的載荷能力,不能超過65535位元組;其次,每個網路都存在傳輸單元最大值MTU (maximum transfer unit),要求每個資料報必須適合MTU。如果一個資料報進入了一個MTU小於該資料報長度的網路,那麼處於網路邊界上的路由器會把該資料報分解為多個 小的資料報。

TCP實體所採用的基本協議是滑動視窗協議。當發送方傳送一個資料報時,它將啟動計時器。當該資料報到達目的地後,接收方的TCP實體向回傳送一個 資料報,其中包含有一個確認序號,它等於希望收到的下一個資料報的順序號。如果發送方的定時器在確認資訊到達之前逾時,那麼發送方會重發該資料報。

2.1 TCP資料前序
圖2給出了TCP資料前序的格式。


源連接埠、目的連接埠:16位長。標識出遠端和本地的連接埠號碼。

順序號:32位長。表明了發送的資料報的順序。

確認號:32位長。希望收到的下一個資料報的序號。

TCP頭長:4位長。表明TCP頭中包含多少個32位字。

接下來的6位未用。
ACK:ACK位置1表明確認號是合法的。如果ACK為0,那麼資料報不包含確認資訊,確認欄位被省略。

PSH:表示是帶有PUSH標誌的資料。接收方因此請求資料報一到便可送往應用程式而不必等到緩衝區裝滿時才傳送。

RST:用於複位由於主機崩潰或其它原因而出現的錯誤的串連。還可以用於拒絕非法的資料報或拒絕串連請求。

SYN:用於建立串連。

FIN:用於釋放串連。

視窗大小:16位長。視窗大小欄位表示在確認了位元組之後還可以發送多少個位元組。

校正和:16位長。是為了確保高可靠性而設定的。它校正頭部、資料和偽TCP頭部之和。

可選項:0個或多個32位字。包括最大TCP載荷,視窗比例、選擇重發資料報等選項。

  1. 最大TCP載荷:允許每台主機設定其能夠接受的最大的TCP載荷能力。在建立串連期間,雙方均聲明其最大載荷能力,並選取其中較小的作為標準。如果一台主機未使用該選項,那麼其載荷能力預設設定為536位元組。
  2. 視窗比例:允許發送方和接收方商定一個合適的視窗比例因素。這一因子使滑動視窗最大能夠達到232位元組。
  3. 選擇重發資料報:這個選項允許接收方請求發送指定的一個或多個資料報。

2.2 串連管理
在TCP中建立串連採用三向交握的方法。為了建立串連,其中一方,如服務器,通過執行LISTEN和ACCEPT原語被動地等待一個到達的串連請求。

另一方,如客戶方,執行CONNECT原語,同時要指明它想串連到的IP地址和連接埠號碼,設定它能夠接受的TCP資料報的最大值,以及一些可選的使用者資料。CONNECT原語發送一個SYN=1,ACK=0的資料報到目的端,並等待對方響應。

該資料報到達目的端後,那裡的TCP實體將察看是否有進程在偵聽目的連接埠欄位指定的連接埠。如果沒有,它將發送一個RST=1的應答,拒絕建立該串連。

如果某個進程正在對該連接埠進行偵聽,於是便將到達的TCP資料報交給該進程,它可以接受或拒絕建立串連。如果接受,便發回一個確認資料報。一般情況下,TCP的串連建立過程3所示。

 


 

 

為了釋放串連,每方均可發送一個FIN=1的TCP資料報,表明本方已無資料發送。當FIN資料報被確認後,那個方向的串連即告關閉。當兩個方向上 的串連均關閉後,該串連就被完全釋放了。一般情況下,釋放一個串連需要4個TCP資料報:每個方向均有一個FIN資料報和一個ACK資料報。

2.3 傳輸策略
TCP中採用滑 動視窗來進行傳輸控制,滑動視窗的大小意味著接收方還有多大的緩衝區可以用於接收資料。發送方可以通過滑動視窗的大小來確定應該發送多少位元組的資料。當滑 動視窗為0時,發送方一般不能再發送資料報,但有兩種情況除外,一種情況是可以發送緊急資料,例如,允許使用者終止在遠端機上的運行進程。另一種情況是發送 方可以發送一個1位元組的資料報來通知接收方重新聲明它希望接收的下一位元組及發送方的滑動視窗大小。

2.4 擁塞控制
當載入到某個網路上的載荷能力超過其處理能力時,便會出現擁塞現象。對於網際網路來說有兩個潛在的問題--網路的容量和接收方的容量,應該分別進行處理。發送方始終保持兩個視窗:接收方承認的視窗和擁塞視窗。取兩個視窗的最小值作為可以發送的位元組數。

當建立串連時,發送方將擁塞視窗大小初始化為該串連所用的最大資料報的長度值,並隨後發送一個最大長度的資料報。如果該資料報在定時器逾時之前得到 了確認,那麼發送方會在原擁塞視窗的基礎上再增加一個資料報的位元組值,使其為兩倍最大資料報的大小,然後發送兩個資料報。當這些資料報中的每一個都被確認 後,擁塞視窗大小就再增加一個最大資料報的長度。當擁塞視窗是N個資料報的大小時,如果發送的所有N個資料報都被及時確認,那麼將擁塞視窗大小增加N個數 據報對應的位元組數目。擁塞視窗保持指數規律增大,直到資料轉送逾時或者達到接收方設定的視窗大小。擁塞視窗便設定為恰好不造成逾時或達到接收方的視窗大小 的位元組數。

2.5 定時器管理
TCP使用多 個定時器,如重發定時器、持續定時器、"keep alive"定時器等。最重要的是重發定時器。在發送一個資料報的同時,啟動一個資料重發定時器。如果在定時器逾時前該資料報被確認,則關閉該定時器;相 反,如果在確認到達之前定時器逾時,則需要重發該資料報。

持續定時器用於防止出現死結情況。當一個串連長時間閑置時,"keep alive"定時器會逾時而使一方去檢測另一方是否仍然存在。如果它未得到響應,便終止該串連。

UDP協議
網際網路協議組也支援不需連線的傳輸協議UDP(user data protocol)。 UDP 使用底層的網際網路協議來傳送報文,提供與IP一樣的不可靠的、不需連線的資料報傳輸服務。它不使用確認資訊對報文的到達進行確認,不對收到的資料報進行排 序,也不提供反饋資訊來控制機器之間傳輸的資訊流量。UDP通訊的可靠性方面的工作,包括報文的丟失、重複、亂序等現象,由使用UDP的應用程式來承擔。

一個UDP資料報包括一個8位元組的頭和資料部分。前序的格式如4所示,它包括四個長為16位元組的欄位。源連接埠和目的連接埠的作用與TCP中的相 同,是用來標明源端和目的端的連接埠號碼。UDP長度欄位指明包括8個位元組的頭和資料在內的資料報長度。UDP校正和欄位是可選項,用於紀錄 UDP頭、UDP偽頭、使用者資料三者的校正和。

 


 

 

IP協議
IP協議提供了不可靠的、不需連線的 資料報傳輸機制。TCP/IP是為了適應物理網路的多樣性而設計的,而這種適應性主要是通過IP層來體現的。由於物理網路的多樣性,各種物理網路的資料幀 格式、地址格式之間的差異很大。為了將這些底層的細節屏蔽起來,使得採用不同物理網路的網路之間進行通訊, TCP/IP分別採用了IP資料報和IP地址作為物理資料幀與物理地址的統一描述形式。這樣IP向上層提供統一的IP資料報和統一的IP地址,使得各種物 理幀及物理地址的差異性對上層協議不複存在。

4.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位的時間標記。同樣地,這一選擇可用來為路由選擇演算法查錯。

4.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資料報分段的重組都只在目的主機進行。

4.3 IP對輸入資料報的處理
IP對輸入資料報的處理分為兩種,一種是主機對資料報的處理,一種是網關對資料報的處理。

當IP資料報到達主機時,如果IP資料報的目的地址與主機地址匹配,IP接收該資料報並將它傳給進階協議軟體處理;否則拋棄該IP資料報。

網關則不同,當IP資料報到達網關IP層後,網關首先判斷本機是否是資料報到達的目的主機。如果是,網關將接收到的IP資料報上傳給進階協議軟體處理。如果不是,網關將對接收到的IP資料報進行尋徑,並隨後將其轉寄出去。

4.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網路分層結構圖

 

6.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,分別描述當前協議資料報的長度和資料緩衝區的實際長度。

 


 

 

6.2 接收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會傳遞到一個或多個目標協議的處理常式。

6.3 發送IP 資料報
網路處理代碼必須建立sk_buff來包含要傳輸的資料,並且在協議層之間傳遞資料時,需要添加不同的協議頭和協議尾。

首先,IP協議需要決定要使用的網路裝置,網路裝置的選擇依賴於資料報的最佳路由。對於只利用數據機和PPP協議串連的電腦來說,路由的選擇比較容易,但是對於串連到乙太網路的電腦來說,路由的選擇是比較複雜的。

對每個要傳輸的IP資料報,IP利用路由表解析目標IP地址的路由。對每個可從路由表中找到路由的目標IP地址,路由表返回一個rtable資料結 構描述可使用的路由。這包括要使用的源地址、網路裝置的device資料結構的地址以及預先建立的硬體頭資訊。該硬體頭資訊和網路裝置相關,包含了源和目 標的物理地址以及其它的介質資訊。

6.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被丟棄,並假定訊息已經在傳輸中丟失,這時,高層協議需要請求源主機 重新發送丟失的資訊。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.