Chinaunix首页 | 论坛 | 博客
  • 博客访问: 472123
  • 博文数量: 41
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2015-02-05 14:08
个人简介

c++ programmer

文章分类

全部博文(41)

文章存档

2020年(2)

2018年(3)

2017年(23)

2016年(13)

我的朋友

分类: C/C++

2017-03-22 16:10:24

IP选路原理

  1. 搜索匹配的主机地址;
  2. 搜索匹配的网络地址;
  3. 搜索默认表项(默认表项一般在路由表中被指定为一个网络表项,其网络号为0)。
  匹配主机地址步骤始终发生在匹配网络地址步骤之前。
  IP层进行的选路实际上是一种选路机制,它搜索路由表并决定向哪个网络接口发送分组。
这区别于选路策略,它只是一组决定把哪些路由放入路由表的规则。IP执行选路机制,而路

由守护程序则一般提供选路策略。
 上面3个步骤都没有成功,那么该数据报就不能被传送。如果不能传送的数据报来自
本机,那么一般会向生成数据报的应用程序返回一个“主机不可达”或“网络不可达”的错误。

路由表解析


  

 1. Destination: 目的地址,其匹配规则由Flags标志决定。
 2. Gateway: 对于直接路由,该地址是外出IP地址(非tcp首部的源地址);对于间接路由,该地址是下一跳路由地址(以太网首部的目的mac地址)。
 3. Flags: 路由标志,一共有五种不同的标志。
    U: 该路由可以使用;
    G: 该路由是到一个网关(路由器)。如果没有设置该标志,说明目的地是直接相连的; 标志G是非常重要的,因为由它区分了间接路由和直接路由(对于直接路由来说是不设置标志G的)。其区别在于,发往直接路由的分组中不但具有指明目的端的IP地址,还具有其链路层地址。当分组被发往一个间接路由时, IP地址指明的是最终的目的地,但是链路层地址指明的是网关(即下一站路由器)。简单的说,直接路由时MAC地址和IP地址都是目的地址的MAC和IP地址;而间接路由时MAC地址为网关的MAC地址,而IP地址则还是目的IP地址。
    H: 该路由是到一个主机,也就是说,目的地址是一个完整的主机地址。如果没有设置该标志,说明该路由是到一个网络,而目的地址是一个网络地址:一个网络号,或者网络号与子网号的组合;当为某个目的IP地址搜索路由表时,主机地址项必须与目的地址完全匹配而网络地址项只需要匹配目的地址的网络号和子网号就可以了。
    D: 该路由是由重定向报文创建的;
    M: 该路由已被重定向报文修改.
 4. Refcnt: 正在使用路由的活动进程个数。
 5. Use: 通过该路由发送的分组数。
 6. Interface: 网络接口。

通俗的表述一下选路规则和路由表配合使用时的工作流程:

打算发送一个IP数据报到ip地址为xxx.xxx.xxx.xxx时:

1. 按照IP选路规则:首先搜索匹配的主机地址。 路由表的flag字段指明了路由可用状态(U)和路由是到一个主机(H)。因此这一步所做的工作就是找出所有路由表中flag同时包含UH的项,逐条地将xxx.xxx.xxx.xxx地址与目的地址(Destination) 比较,如果相同,则配合成功,使用该路由项。使用路由项时需要进一步判断flag标志,确定时一个直接路由(flag不包含G)还是一个间接路由(flag有G)。直接路由时,将以太网帧头中的目的mac地址和ip头中的目的ip都设置为xxx.xxx.xxx.xxx对应的mac地址和ip;间接路由时,以太网帧头中的目的mac地址则更改为路由表gateway指向的ip的对应的mac地址,ip头中的目的ip则仍然为xxx.xxx.xxx.xxx。如果在该步骤中未能找到适用的路由项,则进入步骤2;
2. 当未匹配到主机地址时,则进入第二步,匹配网络地址。找出路由表中flag包含U并且不包含H的项,配合子网掩码(xxx.xxx.xxx.xxx使用本机配置的子网掩码,路由表使用表中Genmask指明的子网掩码),计算出xxx.xxx.xxx.xxx的网络号和
路由表 目的地址(Destination) 的网络号,并进行对比,如果相同,则使用该路由项。与步骤1中相同,使用仍需进一步判断flag标志,确定是直接路由还是间接路由,处理流程与1完全相同,不再赘述。如果在该步骤中未能找到适用的路由项,则进入步骤3;
3. 如果在1,2步骤完成后,仍未找到适用的路由项,则在路由表中搜索默认表项(网络号为0)。与1,2步骤相同,使用默认表项时也需要进一步判断flag标志,确定是直接路由还是间接路由,处理流程与1,2完全相同,不再赘述。如果没有搜索到默认表项,则进入步骤4;
4. ip选路失败。产生一个icmp差错报文返回给应用或发送主机。

通过上述表述我们可以清晰的知道路由表中各个字段的作用:
1. Destination:路由的目的地址。用于与发送地址xxx.xxx.xxx.xxx进行对比,以确定该路由项是否适用。flag字段包含H时,需要对比完整地址;不包含H时,取两者网络号对比;
2. Gateway:路由的网关地址。只在间接路由时使用(flag包含G),使用方式,获取网关地址对应的mac地址,并将该mac地址填入到以太网帧的目的mac地址中;
3. Genmask:路由项的子网掩码。当路由项是路由到一个网络时(flag不包含H),进行网络地址匹配时需要使用到。
4. Flags: 路由标志。
5. Iface: 路由的使用的网卡。

值得注意的时flag中H和G是独立的,H标志确定路由到的时一个主机地址还是网络地址,这决定了对比的方式;G标志区分是直接路由还是间接路由,决定发送的以太网帧中目的mac地址。

IP数据包经由路由转发的时候源ip,目的ip,源MAC,目的mac是否发生改变,如何改变?

 A—–(B1-B2)—–(C1-C2)——-E
 如上拓扑图为例,B1和B2是路由器B上的两个接口,C1和C2是路由器C上的两个接口,A和E是PC,由主机A向主机E发送数据包。
 1. 在主机A形成的数据包的目的IP就是E的IP,源IP就是主机A的IP地址,目标MAC地址就是B1的MAC地址,源MAC地址就是A的MAC地址,由A发给路由器B;
 2. B经过重封装后,源IP和目标IP是不变的,源MAC地址变成B2的MAC地址,目标MAC地址变成C1的MAC地址,封装完成发送给路由器C;
 3. 路由器C接收到数据包后和B做的操作是一样的,源IP和目标IP的不变的,源MAC地址变成C2的MAC地址,目标MAC地址变成主机E的MAC地址,然后发送给主机E;
 4. 这样E就收到了这个数据包,当恢复数据包的时候就是把收到的数据包的源IP地址(主机A的IP地址)和源MAC地址(接口C2的MAC地址)作为他的目标IP和目标MAC地址

 由此可见,在路由过程中,无NAT时,无论是直接路由还是间接路由,都遵循源IP地址和目的IP地址不变的规则,可变化的是源MAC地址和目的MAC地址。



后续补上实例解析......





@本文总结摘抄于《TCP/IP详解第一卷》 第九章 IP选路


阅读(4580) | 评论(0) | 转发(0) |
0

上一篇:TCP之1460MSS和1448负载

下一篇:可再入函数

给主人留下些什么吧!~~