当前位置: 首页 > news >正文

IP 层转发分组的过程

目录

IP 层转发分组的过程

1.1  基于终点的转发

1.2 最长前缀匹配

转发表中的 2 种特殊的路由

主机路由 (host route)

默认路由 (default route)

路由器分组转发算法

 1.3 使用二叉线索查找转发表


IP 层转发分组的过程

1.1  基于终点的转发

·分组在互联网中是逐跳转发的。

·基于终点的转发:基于分组首部中的目的地址传送和转发。

·为了压缩转发表的大小, 转发表中最主要的路由是(目的网络地址,下一跳地址) , 而不是(目的地址,下一跳地址)。

·查找转发表的过程就是逐行寻找前缀匹配

主机 H1 发送出的、目的地址是 128.1.2.132 的分组是如何转发的?

·H1 首先检查 128.1.2.132 是否连接在本网络上。

        如果是,则直接交付;否则,就送交路由器 R1。

128.1.2.132 AND 255.255.255.192 = 128.1.2.128     不匹配!

·路由器 R1 收到分组后查找转发表。先检查第 1 行。

·路由器 R1 收到分组后查找转发表。接着检查第 2 行。

        128.1.2.132 AND 255.255.255.128 = 128.1.2.128     匹配!

        进行分组的直接交付(通过路由器 R1 的接口 1)。

1.2 最长前缀匹配

·使用 CIDR 时,在查找转发表时可能会得到不止一个匹配结果

·最长前缀匹配 (longest-prefix matching) 原则:选择前缀最长的一个作为匹配的前缀。

·网络前缀越长,其地址块就越小,因而路由就越具体。

·可以把前缀最长的排在转发表的第 1 行。

路由器 R1 如何转发目的地址是 128.1.2.196 的分组?

·路由器 R1 收到分组后查找转发表。先检查第 1 行。

        128.1.2.196 AND 255.255.255.192 = 128.1.2.192     不匹配!

·路由器 R1 收到分组后查找转发表。接着检查第 2 行。

        128.1.2.196 AND 255.255.255.128 = 128.1.2.128     匹配!

·路由器 R1 收到分组后查找转发表。接着检查第 3 行。

        128.1.2.196 AND 255.255.255.192 = 128.1.2.192     匹配!

问题:R1 从哪个接口向外转发分组?

最长前缀匹配: 选择前缀最长的一个作为匹配的前缀。故选择 接口 0 。

·网络前缀越长,其地址块就越小,路由就越具体(more specific)。

·可以把前缀最长的排在转发表的第 1 行,以加快查表。

转发表中的 2 种特殊的路由

主机路由 (host route)

·又叫做特定主机路由

·是对特定目的主机的 IP 地址专门指明的一个路由。

·网络前缀就是 a.b.c.d/32

·放在转发表的最前面

默认路由 (default route)

·不管分组的最终目的网络在哪里,都由指定的路由器 R 来处理。

·用特殊前缀 0.0.0.0/0 表示。

默认路由举例

只要目的网络不是 N1 和 N2,就一律选择默认路由,把 IP 数据报先间接交付默认路由器 R1,让 R1 再转发给下一个路由器。

路由器分组转发算法

 1.3 使用二叉线索查找转发表

·二叉线索 (binary trie):一种特殊结构的树,可以快速在转发表中找到匹配的叶节点。

·从二叉线索的根节点自顶向下的深度最多有 32 层,每一层对应于 IP 地址中的一位。

·为简化二叉线索的结构,可以用唯一前缀 (unique prefix) 来构造二叉线索。

·为了提高二叉线索的查找速度,广泛使用了各种压缩技术。

用 5 个唯一前缀构成的二叉线索

规则:先检查 IP 地址左边的第一位,如为 0,则第一层的节点就在根节点的左下方;如为 1,则在右下方。然后再检查地址的第二位,构造出第二层的节点。依此类推,直到唯一前缀的最后一位。每个叶节点代表一个唯一前缀。 为检查网络前缀是否匹配,必须使二叉线索中的每一个叶节点包含所对应的网络前缀和子网掩码。

在二叉线索中查找 IP 地址

欢迎一起学习~

相关文章:

  • 基于ecal的foxglove studio可视化工具的使用
  • Pyroch中transforms 图像增强发方法的应用
  • 如何在 JavaScript 中使用 map() 迭代数组
  • 【Java基础】自定义类型处理器xxxTypeHandler
  • 【百度Apollo】自动驾驶规划技术:实现安全高效的智能驾驶
  • leetcode—跳跃游戏—贪心算法
  • QT生成二维码
  • 【百度Apollo】探索创新之路:深入了解Apollo开放平台
  • 《每天十分钟》-红宝书第4版-迭代器与生成器(二)
  • 使用 MongoDB 的 estimatedDocumentCount 快速估计文档数量
  • 熟悉MATLAB 环境
  • 【Spark系列3】RDD源码解析实战
  • C#用正则表达式判断字符串是否纯数字vs用Char.IsDigit 方法遍历字符数组是否纯数字
  • Spring Boot(番外):防止反编译之Jar包加密
  • Java EE 5 SDK架构
  • [笔记] php常见简单功能及函数
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【刷算法】从上往下打印二叉树
  • golang中接口赋值与方法集
  • JavaScript异步流程控制的前世今生
  • Laravel 菜鸟晋级之路
  • Leetcode 27 Remove Element
  • mongodb--安装和初步使用教程
  • PAT A1050
  • Python连接Oracle
  • python学习笔记-类对象的信息
  • Python学习之路13-记分
  • React as a UI Runtime(五、列表)
  • Ruby 2.x 源代码分析:扩展 概述
  • Vue官网教程学习过程中值得记录的一些事情
  • WebSocket使用
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 构建工具 - 收藏集 - 掘金
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 数据库巡检项
  • 组复制官方翻译九、Group Replication Technical Details
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (3)nginx 配置(nginx.conf)
  • (3)STL算法之搜索
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (一) springboot详细介绍
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)甲方乙方——赵民谈找工作
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .Net Core缓存组件(MemoryCache)源码解析