ip协议的功能实现

时间:2020-12-27 16:57:50
小弟做课程设计,要求
   iP协议的功能实现可以包括以下几个功能模块: 
1、IP分组的封装模块:按照IP分组的格式,封装处理数据并填加相应头信息;
2、IP分组的接收模块:根据目的IP地址来处理分组数据  
3、IP分片处理模块:处理如何分片的问题;  
4、IP重组模块:重组分片后的数据 
5、IP路由模块:建立路由表和路径选择的问题;  
6、IP差错处理模块:处理相关错误。
请各位帮忙找找哪里的资料不错哈!做不好就走不了咯!:)

19 个解决方案

#1


关于IP协议的详细情况,请参考 RFC791 

IP协议是在网络层的协议.它主要完成数据包的发送作用. 下面这个表是IP4的数据包格式  

 0      4       8       16                      32 
-------------------------------------------------- 
|版本   |首部长度|服务类型|    数据包总长       | 
-------------------------------------------------- 
|    标识                 |DF |MF| 碎片偏移      | 
-------------------------------------------------- 
|   生存时间    |  协议   |  首部较验和         | 
------------------------------------------------ 
|               源IP地址                        | 
------------------------------------------------ 
|               目的IP地址                      | 
------------------------------------------------- 
|               选项                            | 
================================================= 
|               数据                            | 
-------------------------------------------------                        

下面我们看一看IP的结构定义  

struct ip 
  { 
#if __BYTE_ORDER == __LITTLE_ENDIAN 
        unsigned int ip_hl:4;           /* header length */ 
        unsigned int ip_v:4;            /* version */ 
#endif 
#if __BYTE_ORDER == __BIG_ENDIAN 
        unsigned int ip_v:4;            /* version */ 
        unsigned int ip_hl:4;           /* header length */ 
#endif 
        u_int8_t ip_tos;                /* type of service */ 
        u_short ip_len;                 /* total length */ 
        u_short ip_id;                  /* identification */ 
        u_short ip_off;                 /* fragment offset field */ 
#define IP_RF 0x8000                    /* reserved fragment flag */ 
#define IP_DF 0x4000                    /* dont fragment flag */ 
#define IP_MF 0x2000                    /* more fragments flag */ 
#define IP_OFFMASK 0x1fff               /* mask for fragmenting bits */ 
        u_int8_t ip_ttl;                /* time to live */ 
        u_int8_t ip_p;                  /* protocol */ 
        u_short ip_sum;                 /* checksum */ 
        struct in_addr ip_src, ip_dst;  /* source and dest address */ 
  }; 

ip_vIP协议的版本号,这里是4,现在IPV6已经出来了  

ip_hlIP包首部长度,这个值以4字节为单位.IP协议首部的固定长度为20个字节,如果IP包没有选项,那么这个值为5.  

ip_tos服务类型,说明提供的优先权.  

ip_len说明IP数据的长度.以字节为单位.  

ip_id标识这个IP数据包.  

ip_off碎片偏移,这和上面ID一起用来重组碎片的.  

ip_ttl生存时间.没经过一个路由的时候减一,直到为0时被抛弃.  

ip_p协议,表示创建这个IP数据包的高层协议.如TCP,UDP协议.  

ip_sum首部校验和,提供对首部数据的校验.  

ip_src,ip_dst发送者和接收者的IP地址  

#2


找linux源码来看看就好

#3


楼上的几位兄台,你们的资料是从哪里找到的呢?如果用C语言来实现,应该不是很困难吧?

#4


呵呵,可能有点困难,资料网上都有,找找就可以

#5


iThinker(苍狼) ,能够提供一点提示性的代码吗?我现在对这个概念还有点混淆。。。

#6


首先,我假设你至少看过<<TCP/IP协议详解 卷一》之类的书,已经对tcp/ip协议很了解,如果没有,别的都是扯,找来看看。
然后你可以找<<TCP/IP协议详解 卷二》来慢慢看,
linux核心代码网络部分就是实际运行的系统,网络上分析的资料也有,参考着把主要脉络抓出来。

这样也就可以了,这种代码比较多,提示性代码还真是没法写。

#7


反正我是没写过,也就在这里胡乱说。

#8


看看 RFC文档 和TCP/IP协议 三部书

#9


原来如此。
谢谢了。学习中……

#10


做这个还真是头痛。初学者,没有经验,还望各位多多指教。^_^

#11


首先参考ip协议,了解ip包的结构

#12


这些功能都在ip包的字段中实现了

#13


那,比如我想在这一层实现对上层数据的封装。假定上层传过来的数据是10000100000100001。那能够写一个实现封装的程序片断吗?我想了解一下大概思路。

#14


老大们,我现在想知道到底IP和SLIP有什么联系?

#15


你可以找一些函数库啊,如libpcap

#16


哎,我看你还是先看看《tcp/IP协议详解》或者是《计算机网络》第四版这种书,如果你连ip和slip就在这里问怎么实现ip协议怎么实现的问题,是不会有人会认真的回答你的,遇到事情,要学会自己先去分析,不要一下子就把问题扔到论坛里来。

#17


同意楼上,我也是菜鸟, 我也在看这几个书

#18


恩,恩,我也终于搞懂了是怎么回事情了。但是,毕竟要求太急,我们假期还得回家不是。所以,呵呵,偶翻了翻linux的源代码,算是暂时把问题应付过去了。。。^_^

#19


呵呵,正在看《tcp/ip协议族》,没办法学校发的……只有随便看看了!:)

#1


关于IP协议的详细情况,请参考 RFC791 

IP协议是在网络层的协议.它主要完成数据包的发送作用. 下面这个表是IP4的数据包格式  

 0      4       8       16                      32 
-------------------------------------------------- 
|版本   |首部长度|服务类型|    数据包总长       | 
-------------------------------------------------- 
|    标识                 |DF |MF| 碎片偏移      | 
-------------------------------------------------- 
|   生存时间    |  协议   |  首部较验和         | 
------------------------------------------------ 
|               源IP地址                        | 
------------------------------------------------ 
|               目的IP地址                      | 
------------------------------------------------- 
|               选项                            | 
================================================= 
|               数据                            | 
-------------------------------------------------                        

下面我们看一看IP的结构定义  

struct ip 
  { 
#if __BYTE_ORDER == __LITTLE_ENDIAN 
        unsigned int ip_hl:4;           /* header length */ 
        unsigned int ip_v:4;            /* version */ 
#endif 
#if __BYTE_ORDER == __BIG_ENDIAN 
        unsigned int ip_v:4;            /* version */ 
        unsigned int ip_hl:4;           /* header length */ 
#endif 
        u_int8_t ip_tos;                /* type of service */ 
        u_short ip_len;                 /* total length */ 
        u_short ip_id;                  /* identification */ 
        u_short ip_off;                 /* fragment offset field */ 
#define IP_RF 0x8000                    /* reserved fragment flag */ 
#define IP_DF 0x4000                    /* dont fragment flag */ 
#define IP_MF 0x2000                    /* more fragments flag */ 
#define IP_OFFMASK 0x1fff               /* mask for fragmenting bits */ 
        u_int8_t ip_ttl;                /* time to live */ 
        u_int8_t ip_p;                  /* protocol */ 
        u_short ip_sum;                 /* checksum */ 
        struct in_addr ip_src, ip_dst;  /* source and dest address */ 
  }; 

ip_vIP协议的版本号,这里是4,现在IPV6已经出来了  

ip_hlIP包首部长度,这个值以4字节为单位.IP协议首部的固定长度为20个字节,如果IP包没有选项,那么这个值为5.  

ip_tos服务类型,说明提供的优先权.  

ip_len说明IP数据的长度.以字节为单位.  

ip_id标识这个IP数据包.  

ip_off碎片偏移,这和上面ID一起用来重组碎片的.  

ip_ttl生存时间.没经过一个路由的时候减一,直到为0时被抛弃.  

ip_p协议,表示创建这个IP数据包的高层协议.如TCP,UDP协议.  

ip_sum首部校验和,提供对首部数据的校验.  

ip_src,ip_dst发送者和接收者的IP地址  

#2


找linux源码来看看就好

#3


楼上的几位兄台,你们的资料是从哪里找到的呢?如果用C语言来实现,应该不是很困难吧?

#4


呵呵,可能有点困难,资料网上都有,找找就可以

#5


iThinker(苍狼) ,能够提供一点提示性的代码吗?我现在对这个概念还有点混淆。。。

#6


首先,我假设你至少看过<<TCP/IP协议详解 卷一》之类的书,已经对tcp/ip协议很了解,如果没有,别的都是扯,找来看看。
然后你可以找<<TCP/IP协议详解 卷二》来慢慢看,
linux核心代码网络部分就是实际运行的系统,网络上分析的资料也有,参考着把主要脉络抓出来。

这样也就可以了,这种代码比较多,提示性代码还真是没法写。

#7


反正我是没写过,也就在这里胡乱说。

#8


看看 RFC文档 和TCP/IP协议 三部书

#9


原来如此。
谢谢了。学习中……

#10


做这个还真是头痛。初学者,没有经验,还望各位多多指教。^_^

#11


首先参考ip协议,了解ip包的结构

#12


这些功能都在ip包的字段中实现了

#13


那,比如我想在这一层实现对上层数据的封装。假定上层传过来的数据是10000100000100001。那能够写一个实现封装的程序片断吗?我想了解一下大概思路。

#14


老大们,我现在想知道到底IP和SLIP有什么联系?

#15


你可以找一些函数库啊,如libpcap

#16


哎,我看你还是先看看《tcp/IP协议详解》或者是《计算机网络》第四版这种书,如果你连ip和slip就在这里问怎么实现ip协议怎么实现的问题,是不会有人会认真的回答你的,遇到事情,要学会自己先去分析,不要一下子就把问题扔到论坛里来。

#17


同意楼上,我也是菜鸟, 我也在看这几个书

#18


恩,恩,我也终于搞懂了是怎么回事情了。但是,毕竟要求太急,我们假期还得回家不是。所以,呵呵,偶翻了翻linux的源代码,算是暂时把问题应付过去了。。。^_^

#19


呵呵,正在看《tcp/ip协议族》,没办法学校发的……只有随便看看了!:)

#20