11网络层-分组转发算法

路由

分组转发

1)从数据报的首部提取目的主机的IP地址D,得出目的网络地址N

2)若N就是与此路由器直接相连的某个网络地址,则进行直接交付,不需要经过其他路由器,直接将数据报交付给目的主机(这里包括将目的主机地址D转为具体硬件地址,把数据报封装为MAC帧,再发送此帧);否则间接交付,执行(3);

3)若路由表中有目的地址为D的特定主机路由,则把数据报送给路由表中下一条路由器;否则执行4

4)若路由表中有到达网络N的路由,则把数据报传送给路由表中所指明的下一条路由器;否则,执行5

5)若路由表中有一个默认路由,则把数据报传送给路由表中指明的默认路由器;否则执行6)

6)报告转发分组出错

在互联网上转发分组时,都是从一个路由器转发到下一个路由器。对于每条路由最主要的时以下两个信息(目的网络地址,下一条地址)

现在互联网所有分组的转发都是基于目的主机所在的网络,但大多数情况下都允许有这样的特例,即对特定的目的主机指明一个路由。这个路由也叫做特定主机路由。特定主机路由的子网掩码时255.255.255.255.要在所有路由器上添加。

默认路由

默认路由(Default route),是对IP数据包中的目的地址找不到存在的其他路由时,路由器所选择的路由。目的地不在路由器的路由表里的所有数据包都会使用默认路由。这条路由一般会连去另一个路由器,而这个路由器也同样处理数据包: 如果知道应该怎么路由这个数据包,则数据包会被转发到已知的路由;否则,数据包会被转发到默认路由,从而到达另一个路由器。每次转发,路由都增加了一跳的距离。

默认路由静态路由的命令格式一样。只是把目的地ip和子网掩码改成0.0.0.0和0.0.0.0。

主机里的默认路由通常被称作默认网关。默认网关通常会是一个有过滤功能的设备,如防火墙代理服务器

路由还可以采用默认路由以交少路由表所占用的空间和搜索路由表所用的时间。这种转发方式在一个网络只有很少的对外连接时时很有用的。默认路由用0.0.0.0表示

子网划分

子网划分的基本思路:

1)一个拥有很多物理网络的单位,可将所属的物理网络划分为若干个子网。划分子网纯属一个单位内部的事情,本单位意外看不到这个网络是由多少个子网构成的,因为这个单位对外仍然表现为一个网络。

2)划分子网的方法时从网络主机号借用若干位作为子网号当然主机号也就相应的减少了同样的位数。于是两级IP地址在本单位内部变为三级IP地址:网络号、子网号和主机号。也可记为:

IP地址 ::={,,}

3)凡是从其他网络发送给本单位某台主机的IP数据报,仍然是根据IP数据报的目的网络号找到连接本单位网络上的路由器。但此路由器收到IP数据报后,再按照目的网络号和子网号找到目的子网,再把OP数据报交付给目的主机。

子网掩码

子网掩码

再IP数据报的首部无法看出源主机和目的主机所连接的网络是否进行了子网的划分。这是因为32为的IP地址本身以及数据报的首部都没有包含任何有关子网划分的信息。因此必须宁外想办法,这就是使用子网掩码。

把三级地址的子网掩码与收到的数据报的目的IP地址逐位相“与”,就能得出所要找的子网的网络地址。

使用子网掩码的好处是:不论有没有划分子网,只要把子网掩码与IP地址进行与运算,就能立即得出网络地址。这样再路由器处理到来的分组时就可采用同样的算法。

互联网规定:所有的网络都必须使用子网掩码,同时再路由器的路由表也必须有子网掩码一栏。不划分子网,那么该网络的子网掩码就是默认子网掩码。

A类地址的默认子网掩码是255.0.0.0

B类地址的默认子网掩码是255.255.0.0

C类地址的默认子网掩码是255.255.255.0

使用子网掩码时的分组转发

在使用子网划分之后,路由表中现必须包含以下三项内容:目的网路地址、子网掩码和下一跳地址。

在划分子网的情况下,路由器转发分子算法

1)从收到的数据报的首部提取目的IP地址D;

2)先判断是否位直接交付。对路由器直接相连的网络逐个进行检查:用各个网络的子网掩码与D逐位相与,看结果是否和相应的网络地址匹配。若匹配,则把分组进行直接交付(当然还要将D转为物理地址,将数据报封装成帧发送出去),转发任务结束。否则就间接交付,执行3)

3)若路由表中有目的地址位D的特定主机路由,则把数据报传送给路由表中所执行的下一条路由器;否则执行4)

4)对路由表中的每一行(目的网络地址,子网掩码,下一跳地址),用其中的子网掩码和D逐位相与,得到结果N。若N与改行的目的网络地址匹配,则把数据传送给改行指明下一跳路由器;否则执行5)

5)若路由表中有一个默认路由,则把数据报传送给路由表中指明的默认路由器;否则,执行6)

6)报告转发分组出错

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 06:52:03       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 06:52:03       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 06:52:03       57 阅读
  4. Python语言-面向对象

    2024-07-13 06:52:03       68 阅读

热门阅读

  1. MySQL与Redis优化

    2024-07-13 06:52:03       25 阅读
  2. C++中的RTTI(运行时类型识别)的定义

    2024-07-13 06:52:03       26 阅读
  3. 「字符串匹配算法 1/3」朴素和Rabin-Karp

    2024-07-13 06:52:03       28 阅读
  4. Vue 组件之间的通信方式

    2024-07-13 06:52:03       25 阅读
  5. centos 安装vnc,配置图形界面

    2024-07-13 06:52:03       19 阅读
  6. 客户端与服务端之间的通信连接

    2024-07-13 06:52:03       23 阅读
  7. Redis服务器统计和配置信息简介

    2024-07-13 06:52:03       26 阅读
  8. React:useState和useEffect

    2024-07-13 06:52:03       27 阅读
  9. MySQL 面试真题(带答案)

    2024-07-13 06:52:03       17 阅读
  10. C#中的方法

    2024-07-13 06:52:03       23 阅读