查看文章 |
数据报接收过程中对IP选项的处理
2006年12月12日 星期二 下午 06:45
IP选项中目前还比较有用的就是源站选路选项(IPOPT_SSRR和IPOPT_LSRR),和记录路由选项(IPOPT_RR),ping程序的-R命令选项可以启用IPOPT_RR选项,以提供记录路由的功能。通过-R发送出去的回显请求包带有IPOPT_RR选项,共40字节,除去code, len, ptr三字节,另外发送数据报的源端也把自己的出口IP地址填入选项的IP清单中,这样,还有8个IP地址的空间可用,所以,用ping程序来确定数据报的路由,其功能是非常有限的。 当网络中的一台主机收到带有RR选项的回显请求包后,其网络层的接收函数ip_rcv_finish通过检查IP首部中的长度字段值是否超过20字节来判断该数据报是否含有IP选项,如果有,则调用ip_rcv_options来接收这些IP选项。ip_rcv_options会调用ip_options_compile来解析这些IP选项。 ip_options_compile的根本任务是把skb的IP首部中的选项内容解析后存放在一个结构体strut ip_options中,并把该结构体保存在skb->cb中。cb成员是一个长度为48字节的缓冲区,供协议栈各层自由使用,在网络层,它被解释为结构体struct inet_skb_parm,其定义如下: struct inet_skb_parm { struct ip_options opt; /* Compiled IP options */ unsigned char flags; #define IPSKB_FORWARDED 1 #define IPSKB_XFRM_TUNNEL_SIZE 2 #define IPSKB_XFRM_TRANSFORMED 4 #define IPSKB_FRAG_COMPLETE 8 #define IPSKB_REROUTED 16 }; 成员opt就是ip_options_compile最终存放数据的地方,它只在发送带IP选项的数据报的时候用于暂存IP选项内容到opt的成员__data中,在处理接收到的数据报中的IP选项的时候,直接在skb的IP首部里操作,opt的成员is_data值置0,表示__data成员中没有数据。 解析完struct ip_options后,在回应数据报的发送过程中,又可以通过ip_append_data函数像主动发送IP数据一样处理IP选项。 |
最近读者: