網絡層簡介
1. 概念
為解決經由多條鏈路的交付問題,從而設計了網絡層。其主要負責主機到主機的交付,并且在分組經過路由器時負責為其選擇路由。
實際中,互聯網中的設備間的連線錯綜復雜,如何從A到B會經過很多鏈路,在這個模型中路由器擔當交換機的作用,當一個分組從a端口到達該路由器后,會通過另一個端口b轉發到另一個交換機或終點設備上。這個處理過程稱為交換(switching)。
2. 交換
那要如何實現交換?
方法一,電路交換。即在報文傳遞前從源點到終點建立一條物理電路,這種技術在物理層使用,而不在網絡層使用。
方法二,分組交換(packet switching)。實際中網絡層使用的技術,報文的源點逐個發送被分割成一個個分組(datagram數據報)的報文,然后終點逐個接收,全部到齊后,再由終點的網絡層交給上層。在分組交換網中,選擇路由的方式有兩種:數據報方式和虛電路方式。
3. 分組交換
3.1 無連接
開始時,網絡層被設計為無連接服務(connectionless service),同一個報文的分組間沒有關系,從A到B的路徑可能不同,即路由可能不同,顧到達B時順序可能會變,還可能會有部分分組丟失。
當一個分組來到路由器時,路由器會讀取該分組的目的地址,然后查詢自己的路由表,找到輸出端口,完成分組交換操作。若該報文需要被丟棄時,讀取該分組的源地址,同樣根據路由表,向源地址發送差錯消息。
所以在無連接分組交換網中,轉發判決的依據是該分組的目的地址。
3.2 面向連接
而在面向連接的服務中,同一報文中的所有分組間是有關聯的。在一個報文的所有數據報在發送前,需要建立一條虛連接。此時分組除要包含源和目的地址外,還需要有一個流標號(flow label),就是一個虛電路標識符(virtual circuit identifier),用來制定這些分組應當使用的虛路徑。
建立面向連接的服務的三個步驟:建鏈、數據傳輸、拆鏈。
建鏈階段,源點和終點間需要交換兩個分組:請求分組和確認分組。請求分組從源點到終點,攜帶源地址和目的地址。當一個請求分組來到一個路由器時,路由器可以填寫入端口、入標號和出端口,其中入標號是路由器自主分配的。
最終請求分組來到終點,終點給分配一個標號后,發送確認分組。當確認分組來到一個路由器后,路由器可以根據目的地址和源地址確認原先已經填寫部分的一條路由表項,并將它補齊出標號。最后一個路由器將確認分組發給源點并附上入端口,這個入端口就是一開始在建鏈階段生成的。
此時源點知道了該用哪個標號發,終點知道了從哪個標號來的,中間鏈路中的路由器知道了當某一個標號來時,該如何進行轉發操作。此時建鏈階段就結束了。
數據傳輸階段,某一分組來到一個路由器后,路由器根據標號選擇出端口,并將標號由入標號改為出標號,再進行轉發。
拆鏈階段,由源點向終點發送拆鏈分組,終點向源點發送證實分組,依然是一個Request后Response的設計。
目前來說,無連接服務依然占主要地位。
4. 網絡層各部分提供的服務
在源點,網絡層提供四種服務:分組化處理、查找下一跳的邏輯地址(IP)、查找下一跳的物理地址(MAC)、對數據報進行必要的分片處理。
首先將從上層得到的報文進行分組化處理,即增加報頭,填入一些數據,包括源地址,而目的地址由上層給出。
然后根據生成的數據報中的目的邏輯地址,通過路由表來選擇下一跳的邏輯地址,然后使用ARP(地址解析)協議在表中查找下一跳的邏輯地址和物理地址之間的映射關系。
最后由于不同的數據鏈路層對于幀的長度有不同的要求,需要查找MTU(最大傳送單元)表來確定需要分割數據報。如果有分片操作,則需要將每一個分片前都增加首部,還需要在首部中填入數據以指明該數據片在整個數據報中的位置。
在路由器上,網絡層提供四種服務:檢查數據報的有效性、查找下一跳的邏輯地址、查找下一跳的物理地址、分片處理。有效性指的是首部有沒有損壞,是否被交給正確的路由器。由于轉發設計兩個端口,所以兩個端口對應的數據鏈路層可能不同,所以需要查詢MTU表確認是否需要分片。
在終點,網絡層提供服務:檢查有效性、拆包、重裝。檢查有效性后要將報文頭部去掉從而取出有效數據,當所有的數據報文都到齊后,進行重裝再交給上層。若重組定時器超時,則所有數據包會被銷毀,并發送一個差錯報文,以提醒源點需要重發。
5. 不完全的實現
有些服務在網絡層只是部分實現,或者沒有實現。有些服務是由一些輔助協議來提供,或者通過其他之后加入的協議實現。
差錯控制(error control)包括對損壞、丟失以及重復的數據報進行檢測的機制,以及檢測后的糾錯機制。網絡層沒有提供真正意義上的此機制。由于網絡層有分片,如果有差錯控制會比較低效。在網絡層報文的報頭中有校驗和字段,不過只是針對報頭設計的,由于報頭在每個路由器上都會有數據變化,所以校驗和也需要重新計算。輔助協議是ICMP。
流量控制(flow control)用于調整源點發送的數據量以免接收方超載。當前網絡層沒有考慮此功能。
擁塞控制(congestion control)是避免有過多的數據報出現在因特網中的某一個區域內,此時某些路由器可能會丟棄一些數據報。丟失后需要重傳,結果變成滾雪球,越來越擁塞,最終系統崩潰。
在無連接網絡中,路由器會選擇那些造成擁塞的方向,在反方向的報文中設置一個bit作為擁塞警告,以通知源點放慢速度。ICMP同樣有擁塞控制的功能,當有擁塞發生時,路由器會發一個特殊的扼流分組(choke packet)給源點。還有一種方法是給分組設定優先級。
在面向連接網絡中,擁塞控制較簡單。可以通過建立一條額外的虛電路分壓。另一種方法是在建鏈階段提前協商,有需要建立虛電路的路由器根據自己現有的通信量和自己能承受的最大通信量比較,從而決定是否可以建立虛電路,以及虛電路的通信量的最大值。
服務質量(quality of service,QoS),主要針對對質量有高要求的多媒體通信。大多在上層實現。
路由選擇(routing)。由路由選擇協議完成,幫助主機和路由器建立自己的路由表,并維護和更新這些表。可劃分為兩類:單播和多播的。
安全性。為了在無連接的網絡層提供安全性,需要用另外一些虛擬層來把無連接服務轉變為面向連接的服務,這個虛擬層稱為IPSec。
IPv4地址
IPv4地址指的是version=4的IP協議所定義的邏輯地址,共32bit,它唯一地且全球地定義了一臺主機或路由器與因特網之間的一個連接。唯一性表現在每個地址只能定義一個到因特網的連接,若設備有兩個連接,就需要有兩個地址。全球性表現在任何要連接到互聯網的主機都必須采用的地址系統。地址空間為2^32。
1. IP地址的記法
二進制記法(基2):10000000 00001011 00000011 00011111,IPv4地址的本來面目。
十進制記法(基256):128.11.3.31,常用方式。
十六進制記法(基16):0x800B031F,常用于網絡編程。
若需要計算某段的地址數,可按照不同的計數法來進行加減。
2. 分類編址
2.1 分類
IP地址空間分為5類:ABCDE。
A類共2^31個地址,占50%。
B類共2^30個地址,占25%。
C類共2^29個地址,占12.5%。
D類共2^29個地址,占6.25%。
E類共2^29個地址,占6.25%。
比例就是:8:4:2:1:1。
按照二進制記法時,第一位是0表示A類;否則判斷第二位是否是0,是表示B類;否則判斷第三位是否是0,是表示C類;否則判斷第四位是否是0,是表示D類,否表示E類。
按照十進制記法時,對于第一個字節,A類是0127;B是128191;C是192223;D是224239;E是240~255。
當然某些特殊地址落入了A和E,是例外情況。
個人認為二進制記法更直觀更好記。
對于ABC三類,IP地址可劃分為網絡標識(net-id)和主機標識(host-id)。
A類:第1個字節是網絡標識,后3個是主機標識。
B類:前2個字節是網絡標識,后2個是主機標識。
C類:前3個字節是網絡標識,后1個是主機標識。
2.2 地址類和地址塊
分類編址的一個問題是每類地址都被劃分為固定數目的地址塊,每個地址塊的大小是固定的,不靈活。
A類網絡標識是第1個字節,且第一位必為0,所以只有7bit可以定義網絡標識,27=128理想情況可以指派給128個機構組織使用。每個地址塊包含224個地址,也就是可以分成這么多的主機標識。
同理,B類有16-2=14bit表示網絡標識,214=16384。每類地址包含216=65536個主機標識。
C類有24-3=21bit表示網絡標識,每類地址塊有2^8=256個主機標識。
AB被浪費,C不夠用。
D類只有一個地址塊,用來進行多播。用以定義一組主機,若某個組被指派了一個D類地址,則該組的每一個主機都會在正常地址(單播地址)的基礎上增加一個多播地址。
E類只有一個地址塊,是保留地址。
2.3 兩級編址
如前所述,分類編址中指派給一個組織的是一個地址段,有ABC類三種。對于同一個網絡內的所有主機而言,都應該是屬于同一個地址段的,它們之間用主機標識表明身份。若網絡地址為n位,則主機地址為32-n位,n的值根據所屬ABC類來取值8,16,24。這就是兩級編址,電話號碼分區號+本地號也是同樣道理。
一個地址塊有三要素:地址數、首地址和末地址。首先需要判斷是屬于哪一類,從而得知n和32-n,也就可以算出地址數=2^(32-n)。首地址就是后面32-n位全為0,末地址就是全為1。
首地址被稱為網絡地址,不會指派給任何主機,而是用來代表這個網絡。比如200.11.8.45這個地址是C類,則n=24,所以它的網絡地址是200.11.8.0/24,斜杠后面是n值。
2.4 一個應用
由于網絡地址是一個網絡地址塊的標識,所以它可以被用來為分組選擇路由。當某個分組來到路由器后,路由器根據目的地址計算得到目的地址的網絡地址,然后查找路由表,找到對應該網絡地址的端口,然后將該分組進行轉發。
常用的算法是使用網絡掩碼(network mask)。這是一個32bit的數,前n位是1,后32-n是0。ABC各對應一個掩碼。路由器根據目的地址的類別來選擇一個掩碼與目的地址進行按位與運算,從而得到網絡地址。
2.5 三級編址:子網劃分
對于AB兩類,地址塊太大,所以擁有這兩類的組織可以將地址塊劃分成多個較小的子地址塊,并與其他組織進行共享。這種思想稱為子網劃分,每個被劃分的子網都有對應的子網地址。這樣地址就分成了網絡地址、子網地址、主機地址三級,類似的電話號碼可分為國家碼、地區碼、用戶碼。
之前提到的網絡掩碼是針對網絡地址的,當有子網劃分時,對于子網也需要有一個網絡掩碼。子網由子網標識和主機標識兩部分組成,子網標識增加了網絡標識的長度,也同時減少了主機標識的長度。當一個網絡劃分成s個子網且每個子網的主機數相同時,每個子網標識計算公式如下,s必須是2的乘方。log2s計算的是上圖“變化”的bit位數。
路由器此時會根據子網標識來選擇對應的端口,從而到達子網。同樣是使用掩碼進行與運算。
2.6 超網
然而對于C網來說,問題是地址塊內的地址數太少,需要將多個C類地址塊合并成一個大的地址段。
所以超網掩碼和子網掩碼正好相反,若要將c個地址塊合并,則需要n-log2c來得到超網掩碼。
但這樣的話會帶來兩個新問題:由于c必須是2的乘方,超網構造時會有冗余。同時對于路由選擇來說變得復雜了。
3. 無分類編址
子網和超網的構造并沒有從實際上解決地址耗盡的問題,利用效率也不高,還使得地址分配和路由選擇變得更加困難。最終的解決辦法是使用更大容量的地址空間,即新的版本IPv6。臨時的解決方案是改變地址的分配方法,稱為無分類編址,也就是說類別取消了。地址塊變成了可變長度的。
3.1 兩級編址
與分類編址中的思想相同,地址被分為網絡地址和主機地址,也稱前綴和后綴。前綴的長度n取決于地址塊的大小,取值范圍是0~32。n稱為前綴長度,32-n稱為后綴長度。
在分類編址中,若給定一個地址,可得知它屬于哪類從而得知它的網絡地址。但是在無分類編址中,僅憑一個地址是無法確定前綴的,需要增加一個前綴長度n,放在地址后面,用斜線隔開它們,稱為斜線記法,正式名稱是無分類域間路由選擇(classless interdomain routing)或CIDR記法。由此也可以得到對應的掩碼是多少。
某個地址塊內的地址數同樣是2^(32-n)。而首地址則是這個地址塊內的任意地址與掩碼的按位與的結果。
舉例110.23.120.14/20,求這個地址塊的三要素:首地址、末地址、地址數。地址數=2^(32-20)=4096。因為20>16&&20<24,所以前兩個字節保持不變,第四個字節歸0,主要是求第三個字節。120的2進制表示是0111 1000,前綴長度是20,所以在第三個字節中,只有前四個bit是屬于前綴的,后面的都要歸0,所以就可以得知首地址是110.23.112.0/20,而末地址就是后面全置1,是110.23.127.255。
3.2 地址塊的分配
分配地址塊三原則:
1.申請的地址數N必須是2的乘方。主要是為了使前綴長度n是一個整數。
2.對于一個地址塊來說,根據地址數就可以求出前綴長度的值。其中1和2是互相牽制的。
3.必須是地址空間中連續的未分配地址才能被分配給申請的地址塊。同時選擇的起始地址必須能夠被地址塊的地址數整除。如果不能整除,根據1和2的約束,可以推測出若使用該起始地址,地址塊內的地址數一定小于申請的地址數。
分類編址是無分類編址的一個特例,如ABC類的前綴長度分別是8,16,24,可以直接轉換成無分類編址。
3.3 子網劃分
與分類編址中的子網劃分類似。
子網設計的三原則:
1.每個子網絡的地址數應當是2的乘方。
2.每個子網絡的前綴長度應當是如下所示,其中N是總地址數,Nsub是每個子網的地址數,n是原先的前綴長度:
3.每個子網絡的起始地址應當能夠被它的地址數整除。遵循這一原則,需要首先為大的子網絡指派地址。
舉例起始地址是14.24.74.0/24的地址塊,需要分配三個地址塊,地址數分別是120,60,10。
首先該地址塊共有2^(32-24)=256個地址,首地址是14.24.74.0/24,末地址是14.24.74.255。
然后按照各子網的地址數從大到小分配。第一個子網需要120個地址,不是2的乘方,增加到128,是2的7次方,可知該子網的前綴長度是24+1=25,其實也可以用32-7=25算出。首地址是14.24.74.0/25,末地址是14.24.74.127/25。
然后是第二個子網需要60個,補齊到64,是2的6次方,前綴是32-6=26。首地址是14.24.74.128/26,末地址是14.24.74.191/26。
最后是第三個子網需要10個,補齊到16,是2的4次方,前綴是32-4=28。首地址是14.24.74.192/28,末地址是14.24.74.207/28。
4. 特殊地址
分類編址中某些地址被用作特殊用途,無分類編址繼承了部分策略。
全0地址,0.0.0.0/32。被保留用于某主機不知道自己的IPv4地址,但需要發送一個IPv4分組時。通常是用在主機正在啟動的時候。此時主機為了得到IPv4地址,向DHCP服務器發送一個IPv4分組,并用全0地址作為源地址,二用受限廣播地址作為目的地址。
全1地址:受限廣播地址,255.255.255.255/32。被保留用作當前網絡的受限廣播地址。一個主機想要將報文發送給網絡中的所有主機,可使用此地址作為IPv4分組中的目的地址,但是路由器會將此類地址的分組忽略,這樣廣播只局限在本地網絡中。
環回地址,127.0.0.0/8,用作測試機器的軟件。使用時,分組不會離開機器,只是簡單地由協議軟件返回。此地址只能用作目的地址。如ping程序可以使用此地址測試IPv4軟件是否接受和處理分組。客戶進程可以用此進程給本機上的服務進程發送一個報文。
專用地址,這些地址不會在全球被識別。要么用于隔絕其他網絡的情況下,要么就用于具有網絡地址轉換技術的連接(NAT)。包括10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,169.254.0.0/16。
多播地址,224.0.0.0/4。
此外每個地址塊中有些地址有著特殊用途的,但是此機制只是推薦不作強制使用。如地址塊的首地址定義為網絡地址。如地址塊的末地址可用作直接廣播地址,路由器會用這個地址發送給某個特定網絡上的所有主機,此地址只能作目的地址。
5. NAT
又有新問題:分配的地址段定死了,若某用戶需要增加地址,則之前分配給他的地址段的前后均已使用,無法擴容。但是在一個小型網絡中,絕大多數時間只有一部分計算機需要同時接入因特網,也就是說,分配的地址數可以小于網絡中的計算機數。
在網絡內部,可以使用專用地址來進行內部通信,然后全球通信使用分配的地址。
網絡地址轉換(network address translation,NAT)可用于提供在專用地址和全球地址間的轉換,同時也支持虛擬專用網絡。一般網絡通過一個具有NAT軟件的路由器與全球網絡連接。當外出的分組通過此路由器時,源地址被換成全球NAT地址,當進入的分組通過此路由器時,目的地址被換成相應的內部專用地址。
NAT路由器使用轉換表來解決地址轉換對應問題。
簡單的方法,一個專用地址映射一個全球地址,當發送時將專用地址替換成全球地址,并記錄在表中;當接受時根據表內記錄,將全球地址替換成專用地址。但是有問題:通信必須總是由專用網絡發起,不能運行服務器程序來為網絡之外的客戶端提供服務;一臺主機不能同時訪問兩個外部服務器程序;兩臺主機也不能同時訪問一個相同的外部服務器程序。
為了允許多對多的映射關系,需要在轉換表中增加更多內容,此時表內有五部分:專用地址,專用端口,外部地址,外部端口,傳輸層協議。增加專用端口用以更好的區分,那么同時使用的專用端口就不可以相同,必須是唯一的。
IP分組的交付和轉發
交付指的是在網絡層的控制下,底層各網絡對分組的處理方式,包括直接交付和間接交付。轉發指的是把分組交付到下一站的方式,包括基于分組目的地址的轉發和基于附加在分組上的標記的轉發。
1. 交付
直接交付:分組的重點是一臺與交付者連接在同一網絡上的主機。通常發生在源點和終點屬于同一物理網絡,或者最后一個路由器與目的主機之間。
發送通過提取終點的網絡地址(用掩碼),然后與自己所連接的網絡的地址比較,若匹配則是直接交付。此時,發送方可直接通過目的IP地址找出對應的MAC地址,然后網絡層將IP和MAC地址都交給數據鏈路層,完成實際交付。IP和MAC地址間的映射通常由ARP實現。
間接交付:源點和終點不在同一網絡上。間接交付原理上是多個直接交付。發送方使用目的IP地址和路由表來查找下一跳路由的IP地址,同樣是使用ARP找到對應的MAC地址,然后進行交付。這樣一步一步,到達終點。
2. 轉發
2.1 基于目的地址的轉發
這是一種傳統方式+當前主流,適用于無連接的協議,此時轉發的基礎是IP數據報的目的地址。路由器主要通過路由表來判斷如何轉發。路由表有多種構造方法。
基于路由的路由表:分組由A到B,需要將經過的所有結點均寫入路由表。
下一跳方法:路由表中只保存下一跳的地址,而不是保留完整路由的信息。
特定網絡方法:另一種簡化查找過程的方法,此時路由表不是對連接在同一個物理網絡上的每一臺主機都設置一個表項,而是只用一個表項來定義目的網絡本身的地址。
特定主機方法:正好與特定網絡方法相反,目的主機的地址在路由表內都要給出。這樣可以給特定的目的主機指定路由,主要用在像檢查路由或提供安全措施這樣的特殊情況下。
默認方法:A連接的網絡上有兩個路由器R1和R2,其中經過R1可到到B,經過R2可到達網絡其余部分。此時主機A的路由表就不需要把整個網絡都羅列出來,而是除去到達B之外,其余路由均用一個成為默認的表項來表示,通常定義網絡地址為0.0.0.0。
2.1.1 使用分類編址時的轉發
2.1.1.1 無子網劃分的轉發
使用分類編址時,全球互聯網中絕大多數路由器都沒有涉及子網劃分。子網劃分是在一個組織內部進行的。此時一個典型的轉發模塊對于每種單播類型(ABC)各對應一張表,若有多播,則需要一張對應處理D類的表。
每張路由表的三要素:
1.目的網絡的網絡地址,此時使用的是特定網絡轉發。
2.下一跳地址,間接交付時告訴分組應當交付到的路由器,直接交付時為空。
3.接口號,定義分組應當從哪個輸出卡發送出去。
所以最簡單的場景如下。從分組中提取目的IP地址,判斷類別(ABC,若DE則走另外流程),從而得到網絡地址,然后到找到對應類別的路由表,找到網絡地址相對應的下一跳IP地址和接口號,再通過ARP協議找到下一跳IP地址映射的MAC地址。如果沒有找到對應的下一跳IP地址,則使用默認的。
2.1.1.2 有子網劃分的轉發
處理子網劃分的路由器不是在該組織站點的邊界上,就是在站點邊界的里面。如果使用了可變長度的子網劃分,則需要多張路由表,否則只需要一張。
最簡單的場景如下。從分組中提取目的IP地址,并同子網掩碼(子網劃分是不可變長度的,所以子網掩碼是固定的)進行按位與運算,得到子網地址,在路由表中查找,得到下一跳地址和接口號,然后通過ARP找到下一跳的MAC地址。找不到下一跳地址的則使用默認的表項。
2.1.2 使用無分類編址時的轉發
無分類編址時,地址空間是完整的,沒有劃分類別。所以為了找到目的地址的網絡地址,需要在路由表中包含掩碼(/n),所以無分類編址的路由表至少有四列。
應用時,從上到下依次取每個表項的掩碼,去和目的地址做按位與運算,若和網絡地址相符合,就可得到下一跳地址和接口。找不到符合的則使用默認的表項。
如果路由表的規模過大,可能會造成搜索時間過長。
一種方法是將臨近的幾個地址塊聚合成一個大的地址塊,由R1來區分具體是哪個地址塊,而與R1鏈接的R2則只在路由表中記錄到這個大的地址塊的網絡地址就可以了。這種方法稱為地址聚合。
另一個需要注意的原則是最長掩碼匹配,此原則指出路由表要按照從最長掩碼到最短掩碼來排序,如/27,/26,/25。相當于是先精確匹配,再模糊匹配。當然這樣搜索還是在列表中按序搜索,如果想要減少查找時間,一種解決辦法是改變查找的數據結構,不使用列表而是諸如樹或二叉樹之類。
還有一種方法是多級路由選擇,在路由表中建立分等級概念。類似于分類編址中的有子網劃分的算法,不過此時等級的劃分是無限制的。
還有就是可以依據地理上的分布來進行表項的聚合。
2.2 基于標記的轉發
比基于目的地址的轉發簡單,路由表中只需記錄接口和下一個標記。當一個分組到達一個路由器時,根據攜帶的標記,在路由表中按此標記進行索引,直接可得到接口和下一個標記。
IPv4分組格式
IP是一種不可靠的無連接數據報協議。如果可靠性很重要,需要結合可靠的協議如TCP配合使用。
1. 數據報
網絡層的分組稱為數據報datagram。IPv4數據報格式如圖。首部的長度是20~60byte,包含有關路由選擇和交付的信息。習慣上,在TCP/IP中都是以4byte為一段來表示首部。
版本(VER):共4bit。目前版本是4,將來可能會可以使用6。IP軟件根據這個字段來判斷該數據報是否和自己的版本相同。
首部長度(HLEN):共4bit。單位是4byte,因為首部長度是2060byte,所以該字段的取值是512。
服務類型:共8bit。指明了該如何處理數據報。之前定義了數據報的優先級和服務類型。
新的解釋是,定義了一組區分服務,前6bit是碼點子字段,后2bit保留。
當最右邊的3位是0時,最左邊3位定義為優先級(與原來兼容),此優先級定義了在出現一些問題(如擁塞)時數據報的優先級。
當最右邊的3位非全0時,6bit定義了56 (64-8)種服務。類別1,碼點是XXXXX0,是由因特網管理機構(IETF)指派的優先級,共24種。類別2,碼點是XXXX11,由本地管理機構指派的優先級,16種。類別3,碼點是XXXX01,臨時或試驗的指派,16種。
總長度: 共16bit。單位是byte,定義數據報報頭+數據的總長度。可推斷,IP數據報的長度范圍是2^16-1=65535byte,其中還包括20~60byte的首部。如果物理網絡不能把數據報封裝成幀,則需要分片操作。
某些時候,封裝在數據報中除了首部、數據外,還有一些填充,如以太網協議對幀的范圍有46~1500byte的要求,所以用此字段可以識別出哪些是數據,哪些是填充。
標識:16bit。
標志:3bit。
分片偏移:13bit。以上三類用于分片,詳見下一節。
生存時間:8bit。數據報不可以一直在網絡中傳輸,否則會造成浪費。之前的設計是一個時間戳,經過路由器進行遞減,然而所有路由器不可能進行時鐘同步,總的耗費時間也不好估計。
當前此字段設置成數據報所經過的最大跳數(路由器),數值大約是任意兩臺主機間的最大路由器數的2倍,沒經過一個路由器要減一。當為0時,路由器要拋棄該數據報。
另一個用途是源點限制分組的轉發范圍,如設置成1則該分組只能在局域網中轉發。到達第一個路由器時就會變為0被拋棄。
協議:8bit。定義了此IP層服務的高層協議,指明了此分組必須交付給哪個最終目的協議。1代表ICMP,2代表IGMP,6代表TCP,17代表UDP,89代表OSPF。
首部校驗和:16bit。
源地址:32bit。此字段始終不變。
目的地址:32bit。此字段始終不變。
選項+填充:0~40byte。首部此時共有20byte,若某首部的長度大于20byte,則說明后續有該字段。
2. 分片
路由器會從收到的幀中拆解出IP報文,然后再封裝成另一個幀發送。接受幀的格式與長度與經過的物理網絡使用的協議有關,發送幀的格式與長度與將要經過的物理網絡使用的協議有關。
不管是什么物理網絡,一定會對經過幀的最大長度做出限制,出去幀的首部和尾部,剩下的對于IP報文的限制來說,稱為MTU。如以太網局域網的這個值是1500byte。
由于IP數據報的最大長度為65535byte,若物理網絡的MTU比此值小,則需要對數據報進行分片(fragmentation)。
源點通常不會分片,因為在傳輸層已經把數據劃分成IP和源點使用的數據鏈路層可接納的大小。分片后首部大部分相同,有些字段會變化。若已分片的數據報遇到更小MTU的網絡,還會再進行分片。
分片可以在源點或途中的路由器中進行,但重裝只能在墓地主機上進行。一方面現階段IP是無連接的,各分組路由不同,中途無法重裝。另一方面若要做的話會降低效率。
分片時,首部的必要部分必須復制到所有分片,選項字段可以選擇不復制。標志、分片偏移、總長度需要改變。校驗和需要重新計算。也就是說,只有數據報中的數據是分片的。
三個分片相關字段:
標識(identification):16bit。此標識和源IP地址必須唯一確定數據報。IP協議使用計數器來生成標識。數據報分片時,該字段要復制到所有分片中。故所有分片均有相同的標識,也是原始的數據報的標識號。在終點時用于重裝數據報。
標識(flag):3bit。
第1bit保留。
第2bit稱為“不分片”位,為1則機器不可對該數據報分片。若無法通過任何物理網絡發送該數據報,則需要丟棄,并向源點發送ICMP差錯報文。為0說明可分片。
第3bit是“還有分片”位,為1表示這個數據報不是最后的分片,為1表示是最后的分片或者是唯一分片,用于重裝時的判斷。
分片偏移:13bit。表示分片在整個數據報中的相對位置,并且是按照原始數據的偏移量,單位是8byte。以8byte為單位也迫使數據報沒進行一次分片,第一個分片的字節數量一定能夠被8除盡。
當二次分片時,分片偏移也是永遠相對于原始數據的。
在終點進行重裝的算法如下:
0.依據標識來講分片歸類。
1.依據第一個分片的分片偏移字段值為0來選出第一個分片。
2.把第一個分片的數據長度除以8,就是第二個分片的分片偏移值。
3.把第一個和第二個分片的數據長度除以8,就是第三個分片的分片偏移值。
4.以此類推,直到看到一個分片的“還有分片”位為0,即為最后一個分片。
3. 選項
IP數據報的首部固定部分是20byte,可變部分是0~40byte。選項部分可用于網絡的測試和排錯。
如圖所示,選項的格式是:1byte的類型字段,1byte的長度字段,可變長度的值字段。這三個字段經常被稱為TLV(type-length-value)。
類型:8bit,包括三個子字段。
1.復制:1bit。控制選項在分片是否出現,為0則必須且只須復制到第一個分片,為1復制到所有分片。
2.類別:2bit。定義選項的一般用途。00表示用于數據報的控制。10表示用于排錯和管理。其余未定義。
3.編號:5bit。定義了選項的類型。目前僅使用了6類。
長度:8bit。定義選項的總長度。可以不出現。
值:包含某些特定選項所需的數據。可以不出現。
6種選項類型中,2種是單字節選項,不需要長度和值字段。其余均需要長度和值字段,是多字節選項。
無操作選項:1byte。用作選項間的填充,以便于對齊。
選項結束選項:1byte。用于選項字段結束的填充,只能作最后一個選項且只能用一次。接收器根據此選項來開始操作凈荷數據。也就是說如果對齊選項需要超過1個字節,那么必須先填充一些無操作選項,再在最后加一個選項結束選項。
記錄路由選項:記錄處理數據報的因特網路由器。可以列出最多9個路由器的IP地址,算法是這樣的:數據報選項部分是40byte,刨除類型和長度字段2byte,剩余38byte,而一個IP地址需要4byte,那么最大可填入9個IP地址。
此時在值字段中,需要引入一個指針字段用于表示第一個空項的偏移量,即指向第一個可用的空項。當數據報離開源點時,這些IP地址字段都是空的,指針字段的值為4,指向第一個空字段。在經過路由器時,路由器會比較長度字段和指針字段,若指針字段大于長度值,則選項已滿,不做改變。否則,路由器要在當前空字段中填入自己的出口IP地址,然后再把指針字段+4。
嚴格路由選項:被源點用來預先制定數據報在因特網中傳送時的路由。若指定了該選項,則數據報就必須經過在選項中定義的所有路由器。若某路由器IP地址不在表中,則一定不通過該路由器。若通過了,則這個路由器要丟棄該數據報并發送差錯報文。若數據報到達終點時有些IP地址未經過,依然丟棄并發送差錯報文。
此時在值字段中,依然有一個指針字段,區別在于此種情況下所有的IP地址在源點時就已經填好。路由器比較指針值和長度值時,若指針值大,則數據報已通過了所有預設的路由器,不可再轉發,必須丟棄并發送差錯報文。若指針值小,則路由器比較該幀(數據鏈路層)的目的IP地址是否與自己的入口IP地址一致,相等則進行操作并用該幀的目的IP地址來替換指針所指向的IP地址,還要將指針值+4,并且指針指向的IP地址作為下一次轉發的目的IP地址。不相等就丟棄并發送差錯報文。
不嚴格路由選項:條件放寬為,表中列出的路由器必須經過,但數據報還可以訪問其他的路由器。
時間戳選項:用來記錄路由器處理數據報的時間。時間是從午夜開始以毫秒計時的全球通用時間。有助于用戶和管理者對因特網上的各路由器的行為進行跟蹤。能夠估計數據報從一個路由器到另一個路由器所需時間,估計是因為時鐘可能不同步。
除了要有指針字段外,還需要4bit溢出字段,4bit標志字段。溢出字段用來記錄因缺少可用字段而無法增加時間戳的路由器數量。標志字段為0,則只記錄時間戳。若為1,則需要增加出口IP地址和時間戳。若為3,則IP地址是預先給出的,路由器需要用自己的入口IP地址來檢查給定的IP地址,匹配的話要用出口IP地址來覆蓋該地址。
4. 檢驗和
二進制反碼加法:用n位來表示從0~2^n-1之間的無符號整數,如果一個數多于n位,則多余的最左邊的位被駕到最右邊的位上(繞回)。
在發送端,把分組劃分為k段,每段的長度都是n位。用二進制反碼加法把這些段相加。把最終結果去反碼就得出校驗和。
在IP分組中,針對分組首部進行計算,n=16,首先把校驗和字段置0,計算出結果后再更改。
在接收端,把分組劃分為k段,每段的長度都是n位。用二進制反碼加法把這些段相加,然后再取反碼,若結果為0,則接受此分組,否則拒絕。
安全性
有三個安全問題是特別應用于IP協議的:
分組竊取:被動攻擊,入侵者截取并復制一個IP分組。難以檢測,但若對分組進行加密則可令攻擊者無功而返。
分組篡改:攻擊者先截取,再改變其中內容,最后發送給接收方。可以被數據完整性機制檢測。
IP偽裝:攻擊者偽裝成另一個人,創建一個攜帶另一臺計算機的源地址的IP分組。可通過起源鑒別來防范。
使用IPSec協議來保護:
定義算法和密鑰。
分組加密:對應分組竊取攻擊。
數據完整性:對應分組篡改攻擊。
起源鑒別:對應IP偽裝攻擊。
簡化IP軟件包
忽略選項的處理,可以簡單地認為IP軟件包包含了八個組件:首部添加模塊、處理模塊、轉發模塊、分片模塊、重裝模塊、路由表、MTU表、重裝表。還有一些輸入輸出隊列。
此軟件包接受來自高層或數據鏈路層的分組。若從高層來,則必須將它交付給數據鏈路層進行傳輸(除非使用還會地址127.x.y.z)。若來自數據鏈路層,則或者講起交付給數據鏈路層進行轉發(在路由器中),或者交付給高層協議(目的地址與本站一致)。
首部添加模塊:接受來自高層的數據,把數據封裝成為IP數據報,計算校驗和,插入對應字段,然后發送到輸入隊列。
處理模塊:核心,接受來自高層或數據鏈路層的數據報。若目的地址與本地地址相匹配,則發送到重裝模塊,處理完畢;若本機是路由器,則TTL減一;若TTL小于等于0,則丟棄此分組并發送ICMP差錯報文,處理完畢;還未完畢的話,將數據報發送到轉發模塊,處理完畢。
隊列:輸入隊列指的是來自數據鏈路層和高層的數據報。輸出隊列則存放的是要發送到數據鏈路層和高層的數據。處理模塊從輸入隊列中取出數據報,分片和重裝模塊則向輸出隊列中添加數據報。
路由表:轉發模塊利用路由表來確定下一跳的地址。
轉發模塊:接受來自處理模塊的IP分組。找出下一站的IP地址以及發送該分組時應當使用的接口。然后將分組以及這些信息傳遞給分片模塊。
MTU表:分片模塊使用MTU表找出特定接口的MTU值。
分片模塊:分片模塊查詢MTU表,若數據報長度大于MTU,則進行分片,對每一個分片添加首部,并將它們發送個ARP軟件包以進行地址解析和交付。
重裝表:有5個字段,狀態、源IP地址、數據報標識符、超時以及分片。狀態字段取值為FREE或IN-USE。數據報標識是IP分組中的標識字段,定義了一個數據報以及屬于該數據報的所有分片。超時表示所有分片必須在預定的時間內到達。分片字段是指向分片鏈表的指針。
重裝模塊:找出分片是屬于哪個數據報的,并將它們進行排序,所有分片都到達時重新組裝成一個數據報,超時的話全部丟棄。
參考
《TCP/IP協議族(第4版)》 (Behrouz A.Forouzan) 第四、五、六、七章