IP协议设计实现—重装模块(一)

时间:2024-06-05 05:24:16 通信工程毕业论文 我要投稿
  • 相关推荐

IP协议设计实现—重装模块(一)

内容摘要
 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,ipq_dst; /*地址清单、目的与源地址*/
}
ipasfrag(过度结构)结构:
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结构中的服务字段,*/
                 /*防止报头损坏,从标志字段复制*/
short ip_len/*下是报头定义,与ipq结构类似*/
unsigned short ip_id;
short ip_off;
unsigned char ip_p;
unsigned short ip_sum;
struct ipasfrag *ipf_next,*ipf_prev;
}
3详细流程:
ipintr先要对接收到的分片进行处理,如果它检查到MF或分片偏移为非0,则分组就是一个必须重装的分片,反之,就可以跳过重装。当一个缓存区无法容纳分组时,接口就将整个分组返回,在ipintr函数中在处理前应将IP首部移到缓冲区上。ipintr把一个要处理的分片传给和一个指针传给ip_reass,其中指针指向ipq中匹配的的重装首部,ip_reass可能把分片重装并返回一个完整的数据报(只有一个分片),也可能将该分片链接到数据报的重装链表上(不只一个分片),等其他分片到达后重装。ip_reass在一个由ipf_next和ipf_prev链接起来的双向循环链表上,并收集某个数据报分片。当在重装时产生错误,ip_reass就丢弃该分片,返回一个空。在设计中,最多实现重装576字节的数据报。ip_reass先创建重装表,然后切断分组,在重装表中找相应位置,插入分组,再重装数据报。
流程图:图(3)

 

以上就是重装的流程图。在超时检查时,如果没有超时,则继续接收,直到完成为止。
 

(三)基本代码实现
由于只有一个模快,故没有主函数main(),以下就是函数ipintr()与ip_reass的实现以及必要的说明,其中的数据结构定义包含在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;/*服务类型,下面的前面已给出*/
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;/*链表的下一个缓冲区*/
struct mbuf  *mh_nextpkt;/*对列中的下个链表*/
int mh_len; /*缓冲区数据总数*/
short mh_type; /*数据类型*/
short mh_flags; /*标志位*

【IP协议设计实现—重装模块(一)】相关文章:

基于DSP的扩频电台基带模块的设计与实现03-18

带硬件地址识别的UART IP 的设计和实现12-07

基于FPGA的HDLC通信模块的实现05-14

单片机控制GSM模块实现短信收发的软件设计03-20

用CPLD实现单片机读写模块03-20

现代远程教学网站的设计与实现-在线考试与信息反馈模块03-08

在TMS320VC5402上实现的嵌入式TCP/IP协议栈03-19

IP over WDM网络中业务驱动机制的研究与实现03-30

VB5.0中数据库查询模块的实现03-03