加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_宿迁站长网 (https://www.0527zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux内核分析 - 网络[十四]:IP选项

发布时间:2016-09-26 12:59:21 所属栏目:Linux 来源:站长网
导读:副标题#e# 内核版本:2.6.34 在发送报文时,可以调用函数setsockopt()来设置相应的选项,本文主要分析IP选项的生成,发送以及 接收所执行的流程,选取了LSRR为例子进行说明,主要分为选项的生成、选项的转发、选项的接收三部分。 先看一个源站路 由选项的例

IP选项中的srr_is_hit和is_changed含义是不同的,srr_is_hit表示下一跳地址是从源路由选项中提取的,换言之, 本机仍不是目的主机;is_changed表示IP报头是否被改变,被改变的话就需要重新计算IP报头的校验和(这里由于IP选项LSRR可 能会改变IP报头的目的地址或选项LSRR中的值)。

if (srrptr <= srrspace) {     
 opt->srr_is_hit = 1;     
 opt->is_changed = 1;     
}

根据ip_options_rcv_srr()处理的结果,即再次查询路由表的结果rt2,决定报文是进行转发还是进行接收。转发的 话input=ip_forward(),表明主机只是到达目的地址的中转站;接收的话,input=ip_local_deliver(),表明主机是目的地址。

先看转发的情况,主机只是到达目的地址的中转站,调用ip_forward() -> ip_forward_finish() -> ip_forward_options(),该函数完成IP选项的处理。

ip_forward_options()

optptr指向IP选项头的位置,其中的for循环 找出LSRR选项中与路由项下一跳地址rt->rt_dst相同的选项,记录在srrptr中。ip_rt_get_source()将本机地址填入LSRR选 项(源站选项要求用主机的地址取代选项中的地址),然后设置IP报头的目的地址为LSRR选项中的下一跳地址,最后LSRR中指针 optptr[2]右移4个字节。

if (opt->srr_is_hit) {     
 int srrptr, srrspace;     
 optptr = raw + opt->srr;     
         
 for ( srrptr=optptr[2], srrspace = optptr[1]; srrptr <= srrspace; srrptr += 4 ) {     
  if (srrptr + 3 > srrspace)     
   break;     
  if (memcmp(&rt->rt_dst, &optptr[srrptr-1], 4) == 0)     
   break;     
 }     
 if (srrptr + 3 <= srrspace) {     
  opt->is_changed = 1; 
  ip_rt_get_source(&optptr[srrptr-1], rt);     
  ip_hdr(skb)->daddr = rt->rt_dst;     
  optptr[2] = srrptr+4;     
 } else if (net_ratelimit())     
  printk(KERN_CRIT "ip_forward(): Argh! Destination lost!n");     
 ……     
}

还是以开头的例子为例,在主机192.168.1.2上收到来自192.168.1.1的报文,最后转发出去的报文选项如下图所示:

Linux内核分析 - 网络[十四]:IP选项

再看接 收的情况,主机是报文的最终地址,调用ip_local_deliver()像处理正常IP报文一样处理该报文,接下来的流程与”IP协议”章 节中描述的一样。最终主机192.168.1.100收到的报文选项如下图所示:

Linux内核分析 - 网络[十四]:IP选项

总结:

生成源站路 由选项时,最后两项地址是相同的,都是192.168.1.100

源站路由实现是依靠两次路由查找改变了报文的流程

源站路由的 更改需要重新计算校验和

(编辑:云计算网_宿迁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!