Chinaunix首页 | 论坛 | 博客
  • 博客访问: 339424
  • 博文数量: 54
  • 博客积分: 446
  • 博客等级: 下士
  • 技术积分: 821
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-30 17:37
文章分类

全部博文(54)

文章存档

2015年(35)

2014年(19)

我的朋友

分类: 网络与安全

2015-09-04 15:44:31

一、概述
  这一部分的主要内容有IP选路机制,包括CIDR(无类型域间选路);路由表结构;另外介绍了两种ICMP差错:ICMP主机与网络不可达差错与ICMP重定向差错;动态选路协议:RIP(会重点介绍),OSPF,BGP。
二、IP选路机制
  图3-1很好的概括了IP层选路的工作流程:
  
                                       图3-1
由此可见路由表是其中重中之重,下面就来具体看一下路由表的结构(图3-2):
     
                               图3-2
   查看路由表结构要使用netstat命令,-r选项表明列出路由表,-n选项表明以数字格式打印出IP地址,观察打印出的路由表的各列,Destination列为目标地址,Gateway表明下一跳的地址,以第一行举例说明,如果目的地是140.252.13.65,则该路由器将分组转发给140.252.13.35。
  Flags这一列非常重要,下面具体解释一下这五种不同的标志:
  U:该路由可以使用
  G:该路由是直接路由
  这里需要理解直接路由与间接路由的概念,看图3-3,这也是输出路由表的网络环境:
           
                                                图3-3
svr4(140.252.13.35)要发包给slip(140.252.13.65),必须经过路由器bsdi的140.252.14.35接口,这也是svr4主机的路由表第一行的内容,因为目的地址slip与svr4并非直接相连,所以为间接路由,用间接路由转发数据包时(例如转发svr4到slip的包),IP数据包中的目的IP地址用的是slip的IP(即路由表第一项Destination列的内容),但其链路层目的地址使用的是IP值为140.252.13.35的硬件地址(即路由表第一项Gateway列对应的硬件地址),这两部分内容(目的IP地址与目的链路层地址)表示的是不同路由器的值。而若没有“G”标志,即该路由表项为直接路由,转发相应数据包时,这两部分内容表示的是相同路由器的值。
  H:路由表第一列(Destination列)是一个完整的主机地址
  D:该路由由重定向报文创建
  M:该路由由重定向报文修改
  参考记数Refcnt(Reference count)列给出的是正在使用路由的活动进程个数。
  “Use”列显示的是通过该路由发送的分组数。
  “Interface”列是本地接口的名字
列一下IP层选路机制的基本原理:
1)搜索匹配的主机地址(需要完全匹配)
2)搜索匹配的网络地址(用掩码与目标地址,然后进行匹配)
3)搜索默认表项
可以用route命令静态添加删除路由表,命令具体用法书上说得不是很详细,后面再补充。
三、无类型域间选路CIDR(Classless InterDomain Routing)
    无类型域间选路(CIDR)是一个防止Internet路由表膨胀的方法,也称为超网(supernetting),CIDR涉及的内容主要有给定某个组织一个IP网络号,并给出地址分配要求(例如这个组织的每个部门各需多少IP地址,分配的先后顺序),给出分配方案;给定某个IP数据包,完成其匹配工作。
  为了说清楚这个概念,用Tanenbaum的《Computer Networks》这本书上的一个例子:假设一个地区分配了C类地址194.24.0.0,假设剑桥大学需要分配2048个IP地址,也就是说主机号应该是11位,这样子网掩码就应当是32-11 = 21位,由于这是分配的第一个地址,故可以从194.24.0.0开始分配:
                  194.24.0.0:11000010  00011000  00000000  00000000
                Subnet Mask:11111111  11111111  11111000  00000000
则这一网段的地址范围应当是194.24.0.0~194.24.7.255,将这一网段的任何一个地址与掩码255.255.248.0相与,最后得出的都是该网段的网络号194.24.0.0,该网段的广播地址可以用网络号对应的IP地址主机位全部置1得到,即:194.24.0.0 + 0.0.7.255。
  如果这时牛津大学要求分配4096个地址,主机号应当是12位,由于现在剩下的地址是从194.24.8.0开始的,如果从这个地址分配,无法满足需要,我们算出子网掩码应是32-12 =20位,故从194.24.16.0处开始分配,可以得到网络号;如果这时爱丁堡大学再要求分配1024个字节,则可以从194.24.8.0处分配,具体分配方案可以看表3-1
        
                                     表3-1
  假设一个数据包的IP地址是194.24.17.4,分别与这三个已分配地址段的子网掩码相与,它只与牛津大学的网络号相匹配,因此匹配目的地址是牛津大学的路由表项。
     仔细观察这三个已分配地址与掩码,写出其二进制形式:
              Address                                                             Mask
     C:11000010  00011000  00000000  00000000              11111111  11111111 11111000  00000000
     E:11000010  00011000  00001000  00000000              11111111  11111111 11111100  00000000
     O:11000010  00011000  00010000  00000000              11111111  11111111 11110000  00000000  
其IP地址的前19位是完全相同的,因此可以将这三段网络在路由表中合并为一项,194.24.0.0/19
  CIDR还使用最佳匹配原则,比如一个IP既可以匹配/22的掩码,也可以匹配/20的掩码,则选择/22掩码对应的项。
  CIDR最初是针对C类地址提出的,通过路由聚合,它可以使Internet路由表增长的速度缓慢下来(通过路由聚合),“无类型”的意思是选路决策是基于整个32bit IP地址的掩码操作,而不管其IP地址是A类,B类或是C类
三、ICMP主机与网络不可达差错
   对于某个IP数据报,如果路由表中找不到匹配项,而又没有默认(default)路由存在,则路由器会给原始发送端发送一份“ICMP主机不可达的差错报文”’,图3-3的网络,将SLIP链路断开,然后在svr4主机上ping gemini主机,就可模拟这个过程,图3-4是ping程序的输出及tcpdump的输出:
               
                
                         图3-4
    “ICMP主机与网络不可达差错报文”的具体格式与之前traceroute程序的端口不可达报文同,类型为3,代码为0(网络不可达)或1(主机不可达)
四、ICMP重定向差错
   下面这幅图(图3-5)很形象地说明了ICMP重定向的过程:
             
                                       图3-5
   ICMP重定向允许主机在进行选路时不需要具备智能特性,智能特性放在路由器端,在图3-5的例子中,主机启动时允许只有一个默认表项(R1),当主机将本应发往R2的IP数据报转发至R1时,R1路由器将该数据报转发给R2,然后R1发现它转发数据报至R2的接口与它从主机接收该数据报的接口相同,即该数据报可以由主机直接转发给R2路由器(这点在整个过程中非常重要),于是R1路由器向主机发送一条ICMP重定向报文,主机收到后将根据报文建立到R2的路由表项,这样主机就通过这种逐步学习的方式不断完善自己的路由表。 
   注意:1. 重定向报文只能由路由器生成; 2. 重定向报文是由主机使用的,路由器不使用重定向报文。
   下面通过一个更具体的例子来说明ICMP重定向过程,还是图3-3所示的网络,运行netstat查看solaris主机的路由表:
             
   可以发现如果solaries主机(140.252.1.32)想发送IP数据包给bsdi主机(140.252.13.35),只能通过default选项,将数据包先转发给gateway路由器,这时在solaries主机上运行ping程序,发送IP数据包给bsdi主机,指定-v选项可以看到主机接收到的任何ICMP报文:
                 
   看打红框的部分,可以看到gateway路由器已向solaris主机发出了ICMP主机重定向报文,重定向至netb(140.252.1.183),再检查一下solaris的路由表,会发现多了一行,用红框标注:
              
 多出来这行就是根据重定向报文生成的路由表项,可以看到Flags字段中有“D”
 ICMP重定向报文的格式如图3-6所示:
            
                                      3-6

代码字段的0-3表明有四种类型的重定向报文如图3-7所示:
           
                        3-7
 这里的IP地址关系较为复杂,容易混淆,这里整理一下,图3-6所示的只是ICMP报文,如果要在网络上发送出去,前面一定要有一个IP首部,IP首部的源IP地址,记作IP1,就是发送该ICMP重定向差错报文的路由器地址,回到上一个例子就是gateway路由器的地址(140.252.1.4);ICMP报文8字节首部信息之后的数据部分,其中有IP首部信息,是引起该ICMP差错报文的IP数据报首部信息,其中源IP地址字段IP2,就是需学习路由的主机的IP地址,在我们的例子中是solaris的地址(140.252.1.32);目的IP地址字段IP3,是该数据报的目标主机地址,在例子中是bsdi(140.252.13.35),主机建立的新路由表项中应当填在Destination字段中;最重要的IP4,即ICMP报文中5~8字节的内容,就是新路由表项中Gateway字段应填入的地址(140.252.1.183)
五、ICMP路由器发现报文
  配置路由器,可以用前面所说的route add命令,也可以使用ICMP路由器通告与请求报文。
 当路由器启动时,它定期在所有广播或多播传送接口上随机发送ICMP路由器通告报文,报文的格式如下:

       
这个图已经非常清楚了,“优先级字段”说明一下,0x80000000说明对应的地址不能作为默认路由器地址使用,优先级的默认值一般是0。
  主机在引导期间一般发送三份路由器请求报文,每三秒钟发送一次。一旦接收到一个有效的通告报文,就停止发送请求报文,请求报文格式如下:
       
 这里还要说明一下,一份给定的通告报文其默认生命周期是30分种。

参考资料:

                 《TCP/IP详解卷1:协议》第9章
                 《Computer Network》 Andrew. S . Tanenbaum
阅读(1416) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~