IP協議設計實現—重裝模塊(一)

學識都 人氣:2.02W

內容摘要
 IP協議(網際協議),是TCP/IP 協議族中最爲核心的協議。所有的數據在此協議機制下都以IP數據報的格式傳輸。當分組過大不適合在所選硬件接口(即不同網絡)上發送時,就要對其分片。在目的主機上再把所有分片組裝成一個完整的數據報,提交給上層協議處理。本次設計開發工具爲Turboc2.o+win2000,由我們3人獨立完成,採用結構化設計思想完成對所有分片的重裝,實現IP協議的重裝模快。

IP協議設計實現—重裝模塊(一)

 

(一)IP協議重裝原理及功能分析
1:設計背景
我們知道,每一個數據鏈路層都有自己的幀格式,在格式裏面規定了數據的最大長度,即MTU。當數據報封裝成幀時,長度都應該小於此長度,因此,爲了適應不同網絡,就要對IP數據報進行分片,分片帶來的問題就是要對分片進行重裝。
2:重裝依據—>IP數據報首部
0                     15 16                  31                                      
4位版本 4位首部長度 8位TOS 16位總長度(字節) 
16位標識 3位標誌 13位片偏移 
8位TTL 8位協議 16位首部檢驗和 
32位源IP地址 
32位目的IP地址 
32位選項 
數據 
(圖1)IP首部
首部共20字節。
 
 
 把一份IP數據報分片後,只有到達目的地才進行重新組裝。重新組裝由目的端的IP層來完成,其目的是分片與重新組裝過程對傳輸層是透明的。如圖(1)IP首部爲分片後的重裝提供了必要的信息:首先,其標識字段包含一個唯一的值,該值在分片後被複制到每個片中;其次,標誌字段由3個1bit組成,比特0是保留的,必須爲0,比特1是“不分片”,比特2是表示“更多的片”標誌,標誌字段其它13bit指出該片偏移原始數據報開始處的位置,以8字節單元計算,因此,除最後一個分片外,其他每個分片都望是一個8字節倍數的數據,從而使後面的分片從8字節開始。當數據被分片後,片總長要改爲該片的長度。當IP數據報被分片後,每個片都有自己的首部,這樣在目的端就有足夠的信息來組裝這些數據報分片。
處理思想:
 IP協議是個無連接的協議,無連接是指IP並不維護任何關於後續數據報的狀態信息,因此它不能保證分片都按序到達,另外,屬於一個數據報的分片也可能與另一個數據報分片混雜在一起,。爲了解決上述問題,我們可    
以用重裝表圖(2)和一些想關鏈表完成。重裝表做的就是找出當前分片是那個組的,將屬於同一個數據報的分片進行排序,當所有的分片都到達時將它們重新組裝成一個數據報,當然在接收數據時都有一定時間限制,當建立的超時限已過,同時有的分片丟失了,則將接受到的分片都丟掉。
處理過程:
 當接收到一個IP數據報時,如果其的片偏移爲0而還有“更多分片“也爲0,則將數據報發送到適當對列,反之,就去查找重裝表項目,如果沒有找到,就建立一個新的項目,找到了就在鏈表適當地方插入此分片。當所有的分片都已經到達,就重裝這些分片,將其發送到高層協議,反之,就檢查是否超時,如果超時,就丟棄所有分片同時發送ICMP差錯報文。
功能分析:
通過上述處理就完成了對分片的重裝,就實現不同網絡中數據幀的傳輸。

 

ST SA DI To F 
 ………. 
     
——>鏈表
            圖(2)重裝表
——>鏈表

ST:狀態;SA:源址,DI:數據報ID;TO:超時;F:分片
(二)數據結構定義及處理流程
1:變量定義:
數據報首部:
數據報首部 說明 
ip_id 標識字段 
ip_off 標誌字段 
IP_DF 標誌字段的”不分片”標誌 
IP_MF “更多分片“標誌 
ip_src 源地址 
ip_dst 目的地址 
ip_p 協議值 
ip_len 數據報長度 


記數統計量:
ipstat成員 說明 
ips_cantfrag 要求分片但被DF禁止而沒有發送的數據報報數 
ips_odropped 內存不足而被丟棄的分組數 
ips_ofragments 被髮送的分組數 
ips_fragmented 未輸出的分片的分組數 
全局變量:
ipq:類型Struct,說明—>重裝表
2:函數設計:
函數 說明 
ipintr() 接收分片並交給ip_reass()處理,最後由它把封裝好的.數據報傳給上層 
ip_reass() 接受來自ipintr()的分片,並對其進行重裝,最後把重裝好的數據報交給ipintr()函數 
3用到的數據結構以及必要的說明:
ipq(重裝表)結構:
struct  ipq{
struct  ipq *next,*prev;    /*重組報頭*/
char ipq_tll;   /*重裝生存時間*/
char ipq_p;   /*此片用到的協議*/

short ipq_id;  /*重裝序列號*/
struct ipastrag *ipq_next,*ipq_prve;  /*分片的IP報頭*/
struct in_addr, ipq_src,