分组转发是指在互联网络中路由器转发IP分组的物理传输过程与数据报转发机制。根据分组的目的IP地址与源IP地址是否属于同一个子网可分为直接转发和间接转发。算法
先简单介绍一下路由器,从下图(a)中能够看出,路由器的主要工做就是为通过路由器的每一个数据包寻找一条最佳的传输路径,并将该数据有效地传送到目的站点。因而可知,选择最佳路径的策略即路由算法是路由器的关键所在。为了完成这项工做,在路由器中保存着各类传输路径的相关数据——路由表(Routing Table),供路由选择时使用,表中包含的信息决定了数据转发的策略。在实际上的路由器中,像下图中所示的“直接”和“其余”的几个字符并无出如今路由表中,而是被记为0.0.0.0 。安全
能够把整个的网络拓扑简化为下图(b)所示的那样。在简化图中,网络变成了一条链路,但每个路由器旁边都注明其IP地址。使用这样的简化图,可使咱们没必要关心某个网络内部的具体拓扑以及链接在该网络上有多少台主机,由于这些对于研究分组转发问题并无什么关系。这样的简化图强调了在互联网上转发分组时,是从一个路由器转发到下一个路由器。在路由表中,对每一条路由最主要的是如下两个信息:(目的网络地址,下一跳地址)网络
根据目的网络地址就能肯定下一跳路由器,这样作的结果是:数据结构
* IP 数据报最终必定能够找到目的主机所在目的网络上的路由器(可能要经过屡次的间接交付)。 * 只有到达最后一个路由器时,才试图向目的主机进行直接交付。
特定主机路由less
* 虽然互联网全部的分组转发都是基于目的主机所在的网络,但在大多数状况下都容许有这样的特例,即为特定的目的主机指明一个路由。 * 采用特定主机路由可以使网络管理人员能更方便地控制网络和测试网络,同时也可在须要考虑某种安全问题时采用这种特定主机路由。
默认路由 (default route)ide
不是 N1 和 N2,就一概选择默认路由,把数据报先间接交付路由器 R1,让 R1 再转发给下一个路由器。性能
必须强调指出测试
IP 数据报的首部中没有地方能够用来指明“下一跳路由器的 IP 地址”。设计
当路由器收到待转发的数据报,不是将下一跳路由器的 IP 地址填入 IP 数据报,而是送交下层的网络接口软件。3d
关于路由表
路由表没有给分组指明到某个网络的完整路径。
路由表指出,到某个网络应当先到某个路由器(即下一跳路由器)。
在到达下一跳路由器后,再继续查找其路由表,知道再下一步应当到哪个路由器。
下图为分组转发算法示意图:
划分子网和构造超网
上面所讨论的是IP层怎样根据路由表的内容进行分组转发,而没有涉及到路由表一开始是如何创建的以及路由表中的内容应如何进行更新。可是在进一步讨论路由选择以前,咱们还要先介绍划分子网和构造超网这两个很是重要的概念。
划分子网
1)从两级IP地址到三级IP地址
在早期,原来的两级IP地址的设计不够合理。
第一,IP地址空间的利用率有时很低。有的单位申请到了一个B类地址网络,但所链接的主机数并很少,但是又不肯意申请一个足够使用的C类地址,理由是考虑到从此可能的发展。第二,给每个物理网络分配一个网络号会使路由表变得太大于是使网络性能变坏。第三,两级IP地址不够灵活。有时状况紧急,一个单位须要在新的地点立刻开通一个新的网络。可是在申请到一个新的IP地址以前,新增长的网络是不可能链接到互联网上工做的。
为解决上述问题,从1985年起在IP地址中又增长了一个“子网号字段”,使两级IP地址变成为三级IP地址,它可以较好地解决上述问题,而且使用起来也很灵活。这种作法叫作划分子网(subnetting) [RFC 950]。或子网寻址或子网路由选择 。划分子网己成为互联网的正式标准协议。
划分子网是经过借用IP地址的若干位主机位来充当子网地址从而将原网络划分为若干子网而实现的。划分子网的思路以下:
划分子网时,随着子网地址借用主机位数的增多,子网的数目随之增长,而每一个子网中的可用主机数逐渐减小。
以C类网络为例,原有8位主机位,2的8次方即256个主机地址,默认子网掩码255.255.255.0。借用1位主机位,产生2个子网,每一个子网有126个主机地址;借用2位主机位,产生4个子网,每一个子网有62个主机地址……每一个网中,第一个IP地址(即主机部分所有为0的IP)和最后一个IP(即主机部分所有为1的IP)不能分配给主机使用,因此每一个子网的可用IP地址数为总IP地址数量减2;根据子网ID借用的主机位数,咱们能够计算出划分的子网数、掩码、每一个子网主机数:
如上表所示的C类网络中,若子网占用7位主机位时,主机位只剩一位,不管设为0仍是1,都意味着主机位是全0或全1。因为主机位全0表示本网络,全1留做广播地址,这时子网实际没有可用主机地址,因此主机位至少应保留2位。
总之,当没有划分子网时,IP地址是两级结构.划分子网后IP地址变成了三级结构。划分子网只是把IP地址的主机号这部分进行再划分,而不改变IP地址原来的网络号。
2)子网掩码
子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一块儿使用。子网掩码只有一个做用,就是将某个IP地址划分红网络地址和主机地址两部分。子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,仍是在远程网上。
子网掩码的计算:
如上图所示,IP地址,与掩码进行与运算,获得子网主机地址,可是须要注意的是,上图只是该IP下的一个子网之一,172.16.0.0(10101100 00010000 0000 0000) 是一个B类地址,采用上图的掩码,255.255.240.0(11111111 11111111 11110000 00000000),进行与运算,那么该IP的子网占用主机位四位,也就是说,该网络下,地址以11111111 11111111 0000 到 11111111 11111111 1111 开头的,分属于不一样的子网,每一个子网能够有0000 00000001 到 1111 11111111 (1 ~ 4094)台不等数量的主机。
经过简单的计算,读者不可贵到这样的结论:划分子网增长了灵活性,但却减小了可以链接在网络上的主机总数。
若是没有子网呢?使用子网掩码能够更便于查找路由表。如今互联网的标准规定:全部的网络都必须使用子网掩码,同时在路由器的路由表中也必须有子网掩码这一栏。若是一个网络不划分子网,那么该网络的子网掩码就使用默认子网掩码。默认子网掩码中I的位置和IP地址中的网络号字段net-id正好相对应。所以,若用默认子网掩码和某个不划分子网的IP地址逐位相“与”(AND),就应当可以得出该IP地址的网络地址来。这样作能够不用查找该地址的类别位就能知道这是哪一类的IP地址。
使用子网时分组的转发
在划分子网的状况下,分组转发的算法必须作相应的改动。
无分类编址CIDR(构造超网)
无分类域IBS路由选择CIDR (Classless Inter-Domain Routing. CIDR的读音是“sider" )。
1)网络前缀
CIDR最主要的特色有两个:
1. CIDR消除了传统的A类、B类和C类地址以及划分子网的概念。
CIDR把32位的IP地址划分为先后两个部分。前面部分是“网络前缀”(network-prefix)(或简称为“前缀”),用来指明网络,后面部分则用来指明主机。所以CIDR使IP地址从三级编址 (使用子网掩码)又回到了两级编址,但这己是无分类的两级编址。其记法是{<网络前缀>,<主机号>} 。CIDR还使用“斜线记法”(slash notation),或称为CIDR记法,即在IP地址后面加上斜线“/”,而后写上网络前缀所占的位数。例如128.14.35.7/20。
2. CIDR把网络前缀都相同的连续的IP地址组成一个“CIDR地址块”。
咱们只要知道CIDR地址块中的任何一个地址,就能够知道这个地址块的起始地址(即最小地址)和最大地址,以及地址块中的地址数。例如,128.14.35.7/20=10000000 00001110 00100011 00000111,这个地址所在的地址块中的最小地址和最大地址能够很方便地得出:
因为一个CIDR地址块中有不少地址,因此在路由表中就利用CIDR地址块来查找目的网络。这种地址的聚合常称为路由聚合(route aggregation),它使得路由表中的一个项目能够表示原来传统分类地址的不少个(例如上千个)路由。这减小路由器了之间的路由选择信息的交换,从而提升了整个互联网的性能。
从上图可看出,每个CIDR地址块中的地址数必定是2的整数次幕。除最后几行外,CIDR地址块都包含了多个C类地址(是一个C类地址的2^n倍,n是整数),这就是“构成超网”这一名词的来源。使用CIDR的一个好处就是能够更加有效地分配IPv4的地址空间,可根据客户的须要分配适当大小的CIDR地址块。
2)最长前缀匹配
在使用CIDR时,因为采用了网络前缀这种记法,IP地址由网络前缀和主机号这两个部分组成,所以在路由表中的项目也要有相应的改变。这时,每一个项目由“网络前缀”和“下一跳地址”组成。可是在查找路由表时可能会获得不止一个匹配结果。这样就带来一个问题:咱们应当从这些匹配结果中选择哪一条路由呢?
正确的答案是:应当从匹配结果中选择具备最长网络前缀的路由。这叫作最长前缀匹配((longest-prefix matching),这是由于网络前缀越长,其地址块就越小,于是路由就越具体(more specific)。最长前缀匹配又称为最长匹配或最佳匹配。
3)使用二叉线索查找路由表
使用CIDR后,因为要寻找最长前缀匹配,使路由表的查找过程变得更加复杂了。当跳由表的项目数很大时,须要设法减少路由表的查找时间。为了进行更加有效的查找,一般是把无分类编址的路由表存放在一种层次的数据结构中,而后自上而下地按层次进行查找.这里最经常使用的就是二叉线索(binary trie),它是一种特殊结构的树。IP地址中从左到右的比特值决定了从根节点逐层向下层延伸的路径,而二叉线索中的各个路径就表明路由表中存放的各个地址。
下图用一个例子来讲明二叉线索的结构。图中给出了5个IP地址。为了简化二叉线索的结构,能够先找出对应于每个IP地址的惟一前缀(unique prefix)。所谓惟一前缀就是在表中全部的IP地址中,该前缀是惟一的。这样就能够用这些惟一前缀来构造二叉线索。在进行查找时,只要可以和惟一前缀相匹配就好了。
完成IP的分组转发及路由选择同时,为了更有效地转发IP数据报和提升交付成功的机会,所以须要配合网络层 网际控制报文协议ICMP (Internet Control Message Protocol) [RFC 792]协议 。
可参考:http://www.javashuo.com/article/p-ovrcmmua-km.html 中 “ICMP协议(网际控制报文协议)”