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地址
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核心代码网络部分就是实际运行的系统,网络上分析的资料也有,参考着把主要脉络抓出来。
这样也就可以了,这种代码比较多,提示性代码还真是没法写。
然后你可以找<<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
#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地址
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核心代码网络部分就是实际运行的系统,网络上分析的资料也有,参考着把主要脉络抓出来。
这样也就可以了,这种代码比较多,提示性代码还真是没法写。
然后你可以找<<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协议族》,没办法学校发的……只有随便看看了!:)