RFC791(IP協議)——協議格式

3 協議

3.1 協議頭格式

先看一下協議頭的全景圖,每一個豎線代表一個比特
在這裏插入圖片描述
Version: 4比特
標記當前報文使用的協議格式,本文件描述的是第4版本。

IHL:4比特
表示請求頭32比特字長度(單位是32比特),它的計算是從第一個字節開始。一個正確的包頭最小長度的5。

Type of Service:8比特
標記發出服務希望的傳輸質量的參數。這些參數用來指引網絡進行包傳輸時實際參數的選擇。某些網絡提供優先級支持,對優先數據包給予更高德重視(一般是在高負載的時候,已處理高於特定優先級的數據包)。最終的選擇是在低延時,高可用,高吞吐之間的權衡。
在這裏插入圖片描述
使用延時,吞吐,可用三個指示器的時候,在某種程度上會增加服務消耗。使用一個指示器性能好的網絡,往往不適合另一個指示器。除非特別不常見的場景,一般最多同時使用兩個指示器。
服務類型用來說明數據包在網絡中傳輸時如何被處理。“服務映射”一節會說明不同網絡中服務類型和真實服務類型之間的映射關係。
網絡優先級的設計目標僅是在一個網絡內使用。具體怎麼使用,如何起控制作用由具體的網絡決定。網絡還需要控制訪問和使用這些優先級指示器。

Total Length: 16比特
是數據包的總長度,包含包頭長度,以字節(8比特)爲單位。這個字段限制了數據包的最大長度是65535字節長度。對於大多數主機和網絡,65535字節數據包是不實用的。所有主機都需要能夠接收最大576字節的數據包(不論是完整數據包,還是數據包分片)。

選擇576這個數字是爲了能夠傳輸除頭數據之外的合理大小的數據塊。比如,這個大小能容納512字節數據塊,外加64字節包頭的數據包。最大包頭是60字節,常見的包頭是20字節,考慮高層協議頭的對齊。

Identification: 16比特
重新組裝分片的標識符。

Flags: 3比特
控制標記。0比特-保留位,必須是0;1比特-是否分片,0允許分片,1不允許分片;2比特-是否最後一個分片,0最後一個分片,1還有更多分片。
在這裏插入圖片描述
Fragment Offset: 13比特
標記分片在整個數據包的哪個位置。偏移量單位是8個字節(64比特)。第一個分片的偏移量是0。

Time to Alive: 8比特
標記數據包在網絡中的最大存活時間。如果這個字段值是0,數據包必須即刻被銷燬。字段值在包頭處理過程中會被修改。字段值單位是秒,但是每一跳處理數據包時最少減一。處理時間小於1秒,也要減一。這個字段只能最爲最大存活時間上限。目的是爲了丟棄無法被傳輸的包(防止一直在網絡中循環傳遞),限制數據包的生存期。

Protocol: 8比特
標記數據體中封裝的另一層網絡協議類型。“Assigmed Numbers”章節給出了多種協議的類型值。

Header Checksum: 16比特
包頭數據的檢驗值。由於包頭部分字段傳輸中會發生變化,檢驗值在每一跳包頭處理時也需要重新計算和檢驗。

校驗碼算法:該字段的值是包頭中所有16比特位的補碼和。計算時需要把該字段賦值爲0。

以上是一種簡單的檢驗算法,從經驗看是夠用的。但這是臨時的,需要看以後的使用經驗,也很有可能在以後被CRC算法替代。

Source Address: 32比特
原地址。

Destination Address: 32比特
目標地址。

Options: 可選的
選項字段在數據包中可以出現,也可以不出現。所有的主機和網關的IP模塊必須支持選項字段。選項字段在包傳輸時是可選的,但是是否實現不是可選的。

某些環境下,所有數據包必須包含安全選項。

選項字段的長度是變化的,可以是零個,也可以是多個。選項有兩種格式類型:

Case 1:僅一個8比特的選項類型
Case 2:一個8比特選項類型,一個8比特選項長度,和真正的選項數據。
選項長度包含選項類型和選項長度佔用的字節。

選項類型分爲3個域:
1比特:拷貝標記
2比特:選項類別
5比特:選項數值

拷貝標記指名該選項在分片過程中,要拷貝到所有分片。
0:不拷貝
1:拷貝

選項類別包括:
0:控制
1:保留將來使用
2:調試和測量
3:保留將來使用

選項有如下列表所示:
在這裏插入圖片描述

選項的細節這裏省略不議了,一般較少使用。

3.2 重點討論

協議的實現必須足夠強壯。不同個體實現的協議應當能交互操作。雖然本文檔的目的是爲了明確協議,但是仍然不能排除理解上的差異。一般,發送行爲實現上要儘可能保守,接收行爲實現上要儘可能放寬限制。也就是說,必須儘可能小心的發送格式化良好的數據包,接收任何能解析的數據包(比如,不拒絕意義仍然明確的技術錯誤)。
基礎網絡服務是面向數據包的,網關提供數據分片,目的主機的IP模塊進行數據包重組。當然,數據包在網關之間分片和重組也是允許的,因爲這對IP協議以及高層協議都是透明的。這種透明的分片叫做網絡依賴分片,本文不做深入討論。
網絡地址區分原地址和目的地址,同時提供一個協議字段。不論是否有必要使用多路傳輸,這都需要提供。這一段有點懵

尋址
爲了提供分配地址的靈活性,支持大量的小到中型網絡。網絡地址被邏輯上分爲幾類:少量網絡號每個網絡號包含大量主機,中量網絡號每個網絡號包含中量主機,大量網絡號每個網絡號少量主機,還有剩下的值就給擴展分類使用。
地址格式:

真實網絡地址值見“Assigned Number”章節。

本地網絡分配的本地地址必須允許一個主機扮演多個不同的網絡主機擁有多個網絡地址。也就是說,必須實現一個網絡地址和接口的映射關係,一個接口封裝多個網絡地址的處理。允許主機有多個物理接口,處理多個接口的數據包就像處理一個接口的數據包一樣。不同網絡地址之間的映射關係見“Address Mapping”章節。

分片和重組
網絡標識字段(ID)協同源地址、目的地址、協議類型識別包的分片完成重組。
如果分片不是最後一個分片,更多分片字節被設置爲1。分片偏移量字段指名分片的位置,位置是相對於原始未分片包的起始位置。分片以8字節爲單位(64比特)。不分片的包分片相關字段都爲0值(MF=0,Fragment offset=0)。如果一個包需要被分片,分片必須以8字節爲最小單位。
這種策略最大允許2**13=8192個8字節長度,也就是65535個字節長度。這個數據包的總長度字段是一致的,只是總長度字段包含了包頭長度,分片長度不包含。
發生分片的時候,有些選項會拷貝給所有分片,有些分片只會保留在第一個分片。
所有的IP模塊必須能夠不分片的傳輸68個字節。因爲包頭最大有60字節,最小分片是8字節。

每一個網絡終端必須能夠接收576字節的數據包。
可能會被分片影響的字段包括:
(1)選項字段
(2)更多分片標記
(3)分片偏移量
(4)包頭長度
(5)總長度
(6)包頭檢驗和

如果設置了不分片字段,那麼這個網絡包是不允許分片的,儘管數據包可能會被丟棄。可以用在目標主機沒有足夠資源處理分片重組的情況。

用例子描述分片和重組過程更加便於理解。以下用示例來描述這個過程。

(例子暫不翻譯了)

序號
增加序號字段是因爲需要唯一的識別某個網絡包的分片。協議模塊在重組分片時把具有相同源地址、目標地址、協議類型、序號的分片識別成同一個包的分片。數據包發送者必須選擇具有唯一性的序號,在網絡包的生存期內不能重複。

看起來像是,協議發送模塊維護了一個序號表,在數據包在因特網上的最大生命期內,與它通訊的每個目的地都有一條記錄。

然而,因爲序號字段可以容納65536個數值,所以有些主機可以簡單的實現不區分目的地的序號。

對於某些高級的網絡協議來說,也可以適當的選擇使用序號字段。比如說,TCP協議可能重傳TCP分片,如果重傳時使用相同的序號,那麼接收的成功率就會提高,因爲,兩次發送的TCP分片的每一個IP分片都可以參與TCP分片的重組。

服務類型
服務類型字段用於網絡服務質量選擇。服務類型由四種抽象參數定義:優先級、延時、吞吐、可靠性。四個抽象參數對應的真實服務參數由網絡包途經的網絡定義。

優先級:數據包重要性的獨立度量。
延時:要求數據包被及時傳遞。
吞吐:要求高德數據傳輸率。
可靠性:要求在傳輸上做更多保障。

比如阿帕網有一個優先字節,並且可以選擇“標準”消息(type 0)和“不受控”消息(type 3)。“不受控”消息傾向於較低的可靠性保證和低延時。假設,有一個數據包要經過阿帕網傳輸,設置服務類行爲如下值:
在這裏插入圖片描述

在本例中,將這些參數映射到ARPANET的可用參數將是:設置ARPANET優先級位,因爲Internet優先級在其範圍的上半部分;選擇“標準”消息,因爲指出了吞吐量和可靠性要求,而沒有延遲。更多詳情將在服務映射章節給出。

生命期
數據包的生命期是網絡包允許在因特網上傳輸的最大時間,由發送方設置。如果數據包在因特網上的生存時間大於了生存期,數據包必須被銷燬。
在每一個端點處理數據包時必須減少生存期的值,以反應處理數據包消耗的時間。甚至在沒有本地耗時信息的情況下,生命期值也要減1。生命期用秒來衡量,1代表1秒。因此,生命期的最大值是255秒,即4.25分鐘。因爲每一個模塊處理數據包的時候儘管可能小於1秒,生命期都必須至少減小1,所以,生命期只能作爲數據包可能存在的最大生存時間。生命期的目的是爲了丟棄無法傳遞的數據包,限制數據包最大生存時間。
有些面向可靠連接的高層協議假設舊的重複數據包在一段時間之後就永遠不會到達。生命期是保證這些協議上述假設成真的一種手段。

選項
這對數據包來說是可選的,對於實現網絡協議來說是必備的。也就是說數據包攜帶選項與否由發送方決定,但是每一個網絡模塊必須能夠解析所有選項。選項字段可能會同時包含多個選項值。選項可能不能滿足32字節的邊界,必須用0填充剩餘字節。前半部分是最後一個選項值,後半部分是填充字節。

每個網絡模塊必須能夠處理所有的選項值。如果要傳輸機密、受限或分隔的數據,則需要使用“安全”選項。

校驗和
如果網絡頭有變化,需要重新計算校驗和。比如,生命期值減小、增加選項或者發生分片。網絡頭校驗和的作用是保護網絡頭,防止發生傳輸錯誤。

某些應用允許少量字節錯誤,倒是不允許網絡延時。如果網絡協議強制了數據正確性,那麼就不能支持這些應用了。

錯誤
IP協議錯誤可以通過ICMP返回。

3.3 接口

用戶接口功能描述是儘可能構想的,因爲每個操作系統都有不同的基礎設施。因此,必須提醒讀寫的是不同的協議實現可能有不同的用戶接口。倒是,所有的IP實現中必須包含一個最小功能集,保證所有的IP模塊能支持所有的協議族。接下來說明所有IP實現必須的功能接口。

IP協議接口一邊連接的是本地網絡,一邊連接的是高層協議或者用戶程序。接下來把高層協議或者用戶程序稱爲用戶,因爲他們使用網絡模塊。IP協議是數據包協議,所以需要提供最小內存和傳輸時狀態保持。調用IP模塊的用戶需要提供IP工作必須的所有信息。

上層接口示例:
以下是用戶調用網絡模塊滿足要求的兩個示例(=>表示返回值)。
在這裏插入圖片描述

當用戶發送數據包的時候,調用SEND方法,提供所有SEND需要的參數。當IP模塊接收到調用之後,會檢驗參數,準備併發送消息。如果參數沒有問題,數據包被本地網絡成功接收了,SEND返回成功。如果參數有問題,或者本地網絡沒有成功接收,SEND返回不成功。當不成功時,需要返回問題原因的合理報告,但是報告的詳情由實現模塊自行決定。

當數據包從本地網絡到達IP模塊的時候,可能存在掛起的RECV調用,也可能不存在。第一種情況下,掛起的RECV調用把數據傳遞給用戶才結束。第二種情況下,通知用戶地址有達到的數據包。如果用戶地址不存在,會返回給發送方ICMP錯誤報文,同時丟棄數據包。

通知用戶可以通過模擬中斷或者相似的機制,具體由操作系統環境適當性選擇。

用戶RECV調用可以是接收到掛起的數據包即返回,也可以是一直等到數據接收完成再返回。

調用SEND的時候指定源地址,以防主機有多個地址存在(多個物理連接或者邏輯地址)。IP模塊必須檢查源地址是不是自己邏輯地址之一。

IP模塊的實現可以允許或要求調用時指名對某類數據包感興趣,或者對其獨佔使用。

這一節從功能上說明了用戶/IP模塊間的接口。所用符號和高級語言裏函數間調用的符號相似。這種用法沒有排除中斷類型(Trap Type)的服務調用(SVCs, UUOs, EMTs),或者其他形式的進程間通信。指明不排除異步類型調用?

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