網絡編程基礎(1)-協議概要-IP、ICMP、UDP

TCP/IP通信模型

TCP/IP協議分層

TCP/IP通常被認爲是一個多層次的協議系統,每一層分別負責不同的通信功能。下圖是OSI與TCP/IP協議分層模型。
這裏寫圖片描述

數據鏈路層:或者稱爲網絡接口層,通常包括操作系統中設備驅動程序和網絡接口卡。他們一起負責處理傳輸媒介的物理細節。

網絡層:又稱互聯網層,該層IP協議基於IP地址轉發分包數據,把數據包送到目的主機,提供點對點的通信,它提供的是一種無連接的不可靠服務。
這裏寫圖片描述

傳輸層:爲兩臺主機上的應用程序提供端到端的通信。該層中有兩個主要的傳輸協議,TCP和UDP。TCP是面向連接提供可靠性的傳輸協議。它能夠正確處理傳輸過程中丟包、亂序、超時等情況,還能有效利用寬帶,緩解網絡擁塞。UDP則是爲應用層提供非常簡單的無連接,不保證可靠性的端對端通信服務。任何可靠性保證需要上層應用程序提供。
這裏寫圖片描述

應用層:負責處理特定的應用程序的處理細節。

TCP/IP通信示例

封裝:當應用程序用TCP傳送數據時,數據被送入協議棧中,然後逐個通過每一層直到被當作一串比特流送入網絡。其中每一層對收到的數據都要增加一些首部信息(有時還要增加尾部信息),該過程如下圖所示。TCP傳給IP的數據單元稱作TCP報文段。IP傳給網絡接口層的數據單元稱作IP數據報。通過以太網傳輸的比特流稱作幀。
這裏寫圖片描述

分用:當目的主機收到一個以太網數據幀時,數據就開始從協議棧中由底向上升,同時去掉各層協議加上的報文首部。每層協議盒都要去檢查報文首部中的協議標識,以確定接收數據的上層協議。
這裏寫圖片描述

完整通信示例:下圖是以發送郵件爲例的一個完整通信示例:
這裏寫圖片描述


IP協議

IP協議屬於網絡層協議,它隱藏了下一層(數據鏈路層)的通信細節,它對上一層(傳輸層)提供了一種不可靠、無連接的點對點傳輸服務。

不可靠指的是不能保證IP數據報能成功到達目的地,IP僅提供盡力而爲的傳輸服務。如果發送某些錯誤,IP會發送ICMP消息給發送端。

無連接指的是通信之前並不建立與目的地址的連接,遇到要發送的包會立即被壓縮成IP數據報發送出去(不管目的主機關機或是否存在)。IP並不維護任何後續數據報的狀態信息。每個數據報的處理的相互獨立的。也就說,IP數據報可以不按發送順序接收。

IP分割處理與再構成處理

MTU:在數據鏈路層,不同的數據鏈路對於數據幀的長度都有一個限制,每一條鏈路可以傳送的最大數據幀稱爲最大傳輸單元(MTU)。當兩臺主機之間通信要通過多個網絡時,其對應的鏈路層可能有不同的MTU,而這兩臺主機通信路徑中的所有鏈路中最小的MTU稱爲路徑MTU。兩臺主機之間的路徑MTU不一定是常數,取決於當時所選擇的路由。選路不一定是對稱的,所以路徑MTU在兩個方向上不一定是一致的。

IP報文的分片與重組:當一個要傳送的IP數據報的長度比鏈路層的MTU值還要大時,那IP層需要對這個數據報分成若干片,使得每一片都不大於該MTU值。分片的包到達目的主機後會在IP層被組合起來傳給上一層。如圖所示:
這裏寫圖片描述
上圖中,由於以太網的默認MTU是1500,因此4324字節的IP數據報無法在一個幀中發送完成。這時路由器將IP數據報以8字節的倍數爲單位劃分成了3個分片進行發送。經過分片之後的IP數據報在被重組的時候,只能在目標主機進行,路由器雖然可以分片,但是不會重組。(爲何要求在目的主機進行包重組,而不是在中間路由器就重組?)

分片機制也存在不足之處:首先如果由中途路由器去分片會使得其處理負荷加重。其次,分片處理中,一旦某個分片丟失,則會造成整個IP數據報報廢。爲了應對以上問題,產生一種叫做路徑MTU發現的技術。進行路徑MTU發現,可以避免在中途路由器上進行分片處理,也可以在TCP中發送更大的包。

下圖是UDP情況下的路徑MTU發現:
這裏寫圖片描述
首先在發送端發送IP數據報時將首部中分片禁止標誌設置爲1,表示不分片。這樣,途中的路由器遇到大於MTU的包也不會進行分片處理,把包丟棄,併發送一個ICMP不可達消息告知發送端MTU的大小。下一次發送就以該MTU值爲大小在發送端分片後進行發送。

而在TCP的情況下是怎麼樣的呢,如下圖:
這裏寫圖片描述
根據MTU大小計算出最大段長度(MSS),然後根據這些信息發送數據報。因此,如果在TCP中進行路徑 MTU發現,IP層不會再進行分片,會重新設置MSS值。

IPv4首部

IPv4首部格式如下:
這裏寫圖片描述
版本:4位比特,IPv4的版本號即爲4。

首部長度:4位比特,表明IP首部的大小,單位是4字節(32位),對於沒有可選項的IP包,首部長度設置爲5,即,沒有可選項時,IP首部的長度爲5X4 = 20字節。

區分服務:8位比特,表明服務質量。實現TOS控制極其複雜,所以並不常用,因此有人提出將TOS字段本身再劃分爲DSCP和ECN字段。如圖:
這裏寫圖片描述
DSCP(差分服務代碼點)是TOS的一部分,用來進行質量控制。如果3~5位的值爲0,0~2位則被稱爲類別選擇代碼點。3位類別選擇代碼點可以有0~7八個值,提供8種類型的質量控制,值越大優先度越高。
而2位ECN(顯式擁塞通告)結合TCP首部的CWR和ECE標誌用來報告網絡擁堵情況。其原理和處理流程請參考http://blog.csdn.net/l597692583/article/details/53063886

總長度:16位比特,表示IP首部與數據域合起來的總字節數,最大值65535。總長度字段是IP首部中必要的內容,因爲一些數據鏈路(如以太網)需要填充一些數據以達到最小長度。以太網的最小幀長爲46字節,但是IP數據可能會更短。如果沒有總長度字段,那麼IP層就不知道4 6字節中有多少是IP數據報的內容。

標識:16位比特,用於分片重組。同一分片的標識值相同,不同分片的標識值不同。
標誌:3位比特,標識包被分片的相關信息,每一位的含義如下表:
這裏寫圖片描述
片偏移:13位比特,用來標識被分片的每一個分段相對於原始數據的位置。第一個分片對應的值爲0。由於片偏移域佔13位比特,可以表示2^13 = 8192個相對位置。單位爲8字節,所以除最後一片外,分片大小要爲8的整數倍。
以上三個字段的信息能讓接收端正確組裝這些數據報分片。

生存時間:TTL,8位比特,實際應用中,是指可以中轉多少個路由器。每經過一個路由器,TTL就會減1,直到變成0則丟棄該包,併發送ICMP報文通知源主機。可以用TTL字段避免路由器循環轉發包,而且可以控制包的到達範圍。

協議:8位比特,表示IP包傳輸層的上層協議編號。如1-IPCMP、6-TCP、17-UDP等。

首部校驗和:16位比特,該字段只校驗數據報的首部,不校驗數據部分。用來確保IP數據報不被破壞。如果校驗和錯誤,那麼IP就丟棄收到的數據報,但不生成差錯報文,由上層去發現丟失的數據報並重傳。

源地址:32位發送端的IP地址。
目的地址:32位接收端的IP地址。
可選項:長度可變。通常實驗或診斷時使用。
填充:在有可選項的情況下,首部長度可能不是4字節的整數倍,通過向字段填充0,調整爲4字節的整數倍。
數據:將IP上層協議也作爲首部處理。


ICMP協議

架構IP網絡時要特別注意兩點:確認網絡是否正常工作,遇到異常時進行問題診斷。
ICMP正是提供了這類功能的協議。它用於在IP主機、路由器之間傳遞控制消息。控制消息是指網絡通不通、主機是否可達、路由是否可用等網絡本身的消息。這些控制消息雖然並不傳輸用戶數據,但是對於用戶數據的傳遞起着重要的作用。
ICMP差錯報告採用路由器-源主機的模式,路由器在發現數據報傳輸出現錯誤時只向源主機報告差錯原因;ICMP並不能保證所有的IP數據報都能夠傳輸到目的主機;ICMP不能糾正差錯,它只是報告差錯。差錯處理需要由高層協議去完成。

主要的ICMP消息

ICMP消息類型如下表:
這裏寫圖片描述
下面簡要介紹這些消息類型。

ICMP目標不可達消息:路由器無法將IP數據包發送給目標主機時,會給發送端主機返回一個目標不可達的ICMP消息,並在這個消息中顯示不可達的具體原因。如下表所示:
這裏寫圖片描述
例如,錯誤號1表示主機不可達,是指路由器表中沒有該主機的信息,或者主機沒有連接到網絡。而錯誤號4則用於前面介紹過的MTU探索。由此,根據不可達的具體消息,發送端主機可以瞭解不可達的具體原因。

ICMP重定向消息:如果路由器發現發送端使用了次優的路徑發送數據,那麼它會返回一個ICMP重定向的消息給這個主機。這個消息包含了最適合的路由信息和源數據。過程可如圖示:
這裏寫圖片描述

ICMP超時消息:當IP頭裏面的TTL字段,每經過一個路由器,值就減少1,直到減少爲0時該IP包被丟棄併發送一個超時的消息給發送端主機,並通知該包已被丟棄。過程可如下圖:
這裏寫圖片描述

其他ICMP消息:ICMP回送消息(ping命令實現)、ICMP原點抑制(路由器或主機接收數據報的速度比其處理速度快時,可能產生這個差錯,一般不被使用)、ICMP路由器探索(用於發現與自己相連網絡中的路由器)、ICMP地址掩碼信息(主要用於主機或路由器想要了解子網掩碼的情況)。


UDP

UDP的特點

UDP(用戶數據報協議)是一個簡單的面向數據報的傳輸層協議,進程的每個輸出操作都正好產生一個UDP數據報,並組裝成一份待發送的IP數據報。UDP數據報封裝成IP數據報的格式如下:
這裏寫圖片描述

UDP不提供複雜的控制機制,不保證可靠性,利用IP提供面向無連接的通信服務。即使網絡出現擁堵,UDP也無法進行流量控制,即使丟包,UDP也不負責重發,甚至出現包到達順序亂序時也沒有糾正的功能。如果需要這些控制細節,那不得不交給應用層去處理。

由於UDP面向無連接,它可以隨時發送數據,其本身的處理簡單高效,廣泛用於包總量較少(DNS,SNMP)、多媒體、廣博通信等應用。

UDP首部

UDP首部各字段如下圖:
這裏寫圖片描述

源端口號:16位比特,表示發送端端口號。該字段是可選項,有時不會設置源端口號。沒有源端口號的時候該字段爲0。用於不需要返回的通信中(單方面發送信息,不需要確認或應答)。

目標端口號:16位比特,表示接收端的端口號。

包長度:16位比特,表示UDP首部長度與數據部分的長度之和。單位爲字節。

校驗和:UDP和TCP在首部中都有覆蓋它們首部和數據的校驗和。UDP的校驗和是可選的(發送端在檢驗和字段填入0表示不計算檢驗和),TCP的校驗和是必需的。UDP的校驗和計算要注意兩點:
其一,UDP數據報的長度可以爲奇數字節,但是檢驗和算法以16位爲比特單位進行1的補碼和,此時必須在最後增加填充字節0,以保證長度是偶數字節。
其二,UDP數據報(也包括TCP段)包含一個12字節長的僞首部,僞首部包含IP首部的源目IP地址與協議號。僞首部的目的是讓UDP的兩次檢查數據是否已經正確到達目的地(因爲區別一個通信需要源目IP、協議、源目端口五元組)。UDP僞首部格式如下圖:
這裏寫圖片描述
UDP的校驗和是一個端到端的檢驗和。由發送端計算,接收端驗證。當接收端檢測到檢驗和有差錯,那就丟棄該UDP數據報,不產生任何差錯報文。

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