- 相關(guān)推薦
IP協(xié)議設計實(shí)現—重裝模塊(一)
內容摘要
IP協(xié)議(網(wǎng)際協(xié)議),是TCP/IP 協(xié)議族中最為核心的協(xié)議。所有的數據在此協(xié)議機制下都以IP數據報的格式傳輸。當分組過(guò)大不適合在所選硬件接口(即不同網(wǎng)絡(luò ))上發(fā)送時(shí),就要對其分片。在目的主機上再把所有分片組裝成一個(gè)完整的數據報,提交給上層協(xié)議處理。本次設計開(kāi)發(fā)工具為T(mén)urboc2.o+win2000,由我們3人獨立完成,采用結構化設計思想完成對所有分片的重裝,實(shí)現IP協(xié)議的重裝?。
(一)IP協(xié)議重裝原理及功能分析
1:設計背景
我們知道,每一個(gè)數據鏈路層都有自己的幀格式,在格式里面規定了數據的最大長(cháng)度,即MTU。當數據報封裝成幀時(shí),長(cháng)度都應該小于此長(cháng)度,因此,為了適應不同網(wǎng)絡(luò ),就要對IP數據報進(jìn)行分片,分片帶來(lái)的問(wèn)題就是要對分片進(jìn)行重裝。
2:重裝依據—>IP數據報首部
0 15 16 31
4位版本 4位首部長(cháng)度 8位TOS 16位總長(cháng)度(字節)
16位標識 3位標志 13位片偏移
8位TTL 8位協(xié)議 16位首部檢驗和
32位源IP地址
32位目的IP地址
32位選項
數據
(圖1)IP首部
首部共20字節。
把一份IP數據報分片后,只有到達目的地才進(jìn)行重新組裝。重新組裝由目的端的IP層來(lái)完成,其目的是分片與重新組裝過(guò)程對傳輸層是透明的。如圖(1)IP首部為分片后的重裝提供了必要的信息:首先,其標識字段包含一個(gè)唯一的值,該值在分片后被復制到每個(gè)片中;其次,標志字段由3個(gè)1bit組成,比特0是保留的,必須為0,比特1是“不分片”,比特2是表示“更多的片”標志,標志字段其它13bit指出該片偏移原始數據報開(kāi)始處的位置,以8字節單元計算,因此,除最后一個(gè)分片外,其他每個(gè)分片都望是一個(gè)8字節倍數的數據,從而使后面的分片從8字節開(kāi)始。當數據被分片后,片總長(cháng)要改為該片的長(cháng)度。當IP數據報被分片后,每個(gè)片都有自己的首部,這樣在目的端就有足夠的信息來(lái)組裝這些數據報分片。
處理思想:
IP協(xié)議是個(gè)無(wú)連接的協(xié)議,無(wú)連接是指IP并不維護任何關(guān)于后續數據報的狀態(tài)信息,因此它不能保證分片都按序到達,另外,屬于一個(gè)數據報的分片也可能與另一個(gè)數據報分片混雜在一起,。為了解決上述問(wèn)題,我們可
以用重裝表圖(2)和一些想關(guān)鏈表完成。重裝表做的就是找出當前分片是那個(gè)組的,將屬于同一個(gè)數據報的分片進(jìn)行排序,當所有的分片都到達時(shí)將它們重新組裝成一個(gè)數據報,當然在接收數據時(shí)都有一定時(shí)間限制,當建立的超時(shí)限已過(guò),同時(shí)有的分片丟失了,則將接受到的分片都丟掉。
處理過(guò)程:
當接收到一個(gè)IP數據報時(shí),如果其的片偏移為0而還有“更多分片“也為0,則將數據報發(fā)送到適當對列,反之,就去查找重裝表項目,如果沒(méi)有找到,就建立一個(gè)新的項目,找到了就在鏈表適當地方插入此分片。當所有的分片都已經(jīng)到達,就重裝這些分片,將其發(fā)送到高層協(xié)議,反之,就檢查是否超時(shí),如果超時(shí),就丟棄所有分片同時(shí)發(fā)送ICMP差錯報文。
功能分析:
通過(guò)上述處理就完成了對分片的重裝,就實(shí)現不同網(wǎng)絡(luò )中數據幀的傳輸。
ST SA DI To F
……….
——>鏈表
圖(2)重裝表
——>鏈表
ST:狀態(tài);SA:源址,DI:數據報ID;TO:超時(shí);F:分片
(二)數據結構定義及處理流程
1:變量定義:
數據報首部:
數據報首部 說(shuō)明
ip_id 標識字段
ip_off 標志字段
IP_DF 標志字段的”不分片”標志
IP_MF “更多分片“標志
ip_src 源地址
ip_dst 目的地址
ip_p 協(xié)議值
ip_len 數據報長(cháng)度
記數統計量:
ipstat成員 說(shuō)明
ips_cantfrag 要求分片但被DF禁止而沒(méi)有發(fā)送的數據報報數
ips_odropped 內存不足而被丟棄的分組數
ips_ofragments 被發(fā)送的分組數
ips_fragmented 未輸出的分片的分組數
全局變量:
ipq:類(lèi)型Struct,說(shuō)明—>重裝表
2:函數設計:
函數 說(shuō)明
ipintr() 接收分片并交給ip_reass()處理,最后由它把封裝好的數據報傳給上層
ip_reass() 接受來(lái)自ipintr()的分片,并對其進(jìn)行重裝,最后把重裝好的數據報交給ipintr()函數
3用到的數據結構以及必要的說(shuō)明:
ipq(重裝表)結構:
struct ipq{
struct ipq *next,*prev; /*重組報頭*/
char ipq_tll; /*重裝生存時(shí)間*/
char ipq_p; /*此片用到的協(xié)議*/
short ipq_id; /*重裝序列號*/
struct ipastrag *ipq_next,*ipq_prve; /*分片的IP報頭*/
struct in_addr, ipq_src,ipq_dst; /*地址清單、目的與源地址*/
}
ipasfrag(過(guò)度結構)結構:
struct ipasfrag{
/* 預處理*/
#if BYTE_ORDER==LITTLE_ENDIAN
Char ip_hl=4,ip_v=4;
#endif
#if BYTE_ORDER==BIG_ENDIAN
char ip_v=4,ip_hl=4;
#endif
char ipf_mff; /* ipf_mff成員覆蓋ip結構中的服務(wù)字段,*/
/*防止報頭損壞,從標志字段復制*/
short ip_len/*下是報頭定義,與ipq結構類(lèi)似*/
unsigned short ip_id;
short ip_off;
unsigned char ip_p;
unsigned short ip_sum;
struct ipasfrag *ipf_next,*ipf_prev;
}
3詳細流程:
ipintr先要對接收到的分片進(jìn)行處理,如果它檢查到MF或分片偏移為非0,則分組就是一個(gè)必須重裝的分片,反之,就可以跳過(guò)重裝。當一個(gè)緩存區無(wú)法容納分組時(shí),接口就將整個(gè)分組返回,在ipintr函數中在處理前應將IP首部移到緩沖區上。ipintr把一個(gè)要處理的分片傳給和一個(gè)指針傳給ip_reass,其中指針指向ipq中匹配的的重裝首部,ip_reass可能把分片重裝并返回一個(gè)完整的數據報(只有一個(gè)分片),也可能將該分片鏈接到數據報的重裝鏈表上(不只一個(gè)分片),等其他分片到達后重裝。ip_reass在一個(gè)由ipf_next和ipf_prev鏈接起來(lái)的雙向循環(huán)鏈表上,并收集某個(gè)數據報分片。當在重裝時(shí)產(chǎn)生錯誤,ip_reass就丟棄該分片,返回一個(gè)空。在設計中,最多實(shí)現重裝576字節的數據報。ip_reass先創(chuàng )建重裝表,然后切斷分組,在重裝表中找相應位置,插入分組,再重裝數據報。
流程圖:圖(3)
以上就是重裝的流程圖。在超時(shí)檢查時(shí),如果沒(méi)有超時(shí),則繼續接收,直到完成為止。
(三)基本代碼實(shí)現
由于只有一個(gè)?,故沒(méi)有主函數main(),以下就是函數ipintr()與ip_reass的實(shí)現以及必要的說(shuō)明,其中的數據結構定義包含在chong_z.h中。
IP數據報首部定義:
struct ip{
/* 預處理*/
#if BYTE_ORDER==LITTLE_ENDIAN
unsigned char ip_hl=4,ip_v=4;
#endif
#if BYTE_ORDER==BIG_ENDIAN
usigned char ip_v=4,ip_hl=4;
#endif
unsigned char ip_tos;/*服務(wù)類(lèi)型,下面的前面已給出*/
short ip_len;
short id;
short ip_off;
#define IP_DF 0x4000;/*不分片標志*/
#define IP_MF 0x2000;/*更多分片標志*/
#define IP_OFFMASK 0x1fff;/* 分段位*/
unsigned char ip_ttl;
unsigned char ip_p;
unsigned short ip_sum;/*檢驗和*/
struct in_addr,ip_src,ip_dst;
};
mbuf緩沖區定義:
struct m_hdr{
struct mbuf *mh_next;/*鏈表的下一個(gè)緩沖區*/
struct mbuf *mh_nextpkt;/*對列中的下個(gè)鏈表*/
int mh_len; /*緩沖區數據總數*/
short mh_type; /*數據類(lèi)型*/
short mh_flags; /*標志位*
【IP協(xié)議設計實(shí)現—重裝模塊(一)】相關(guān)文章:
基于DSP的擴頻電臺基帶模塊的設計與實(shí)現03-18
帶硬件地址識別的UART IP 的設計和實(shí)現12-07
單片機控制GSM模塊實(shí)現短信收發(fā)的軟件設計03-20
現代遠程教學(xué)網(wǎng)站的設計與實(shí)現-在線(xiàn)考試與信息反饋模塊03-08
在TMS320VC5402上實(shí)現的嵌入式TCP/IP協(xié)議棧03-19
IP over WDM網(wǎng)絡(luò )中業(yè)務(wù)驅動(dòng)機制的研究與實(shí)現03-30