路由表与IP数据报转发:基础小白指南

news2024/11/15 9:50:41

目录

1. 路由表的基本概念

2. 路由表中的默认路由

3. IP数据报的转发流程

4. 路由聚合

5. 最长前缀匹配

总结


在网络世界中,IP数据报的转发是如何进行的? 这篇文章将带你深入了解路由表的基本概念和IP数据报的转发流程。我们会用简洁明了的语言和实际例子,帮助你快速掌握这一重要的网络知识。


1. 路由表的基本概念

什么是路由表?
路由表是路由器用来决定如何转发IP数据报的核心。一个IP路由表通常包含以下主要信息:

  • 目的网络地址:表示数据报要到达的目标网络。
  • 地址掩码:用于确定目的网络的范围。
  • 下一跳路由器:数据报需要转发到的下一个路由器的地址。
  • 接口:数据报通过哪个接口发送。

图示例
图4—23(a)展示了一个简单的路由表例子,有四个网络通过三个路由器连接在一起。每一个网络上都可能有成千上万个主机。可以想象,若按目的地址来制作路由表,则所得出的路由表就会过于庞大(如果每一个网络有1万台主机,四个网络就有4万台主机,因而每一个路由表就有4万个项目)。但若按目的主机所在网络的地址来制作路由表,那么每一个路由器中的路由表就只包含4个项目。

以路由器R2的路由表为例,由于R2同时连接在网络2和网络3上,因此只要目的主机在这两个网络上,就可通过接口0或接口1由路由器R2直接交付,不需要下一跳路由器的地址。若目的主机在网络1中,则下一跳路由器应为R1,其IP地址为128.0.2.7。同理,若目的主机在网络4中,则路由器R2应把分组转发给IP地址为128.0.3.1的路由器R3。

注意
用一个IP地址并不能准确标识一个网络,因此路由表中除了目的网络地址外还要有一个地址掩码(合起来等价于一个网络前缀)。

图4—23(a)所示的整个网络拓扑可简化为图4—23(b)所示的链路。使用这样的简化图,可以使我们不用关心某个网络内部的具体拓扑及有多少台计算机连接在该网络上,因为这些与分组转发问题并没有什么关系。这样的简化图强调了在互联网上转发数据报时,是从一个路由器转发到下一个路由器。

总结
由于路由器是根据路由表中的目的网络地址来确定下一跳路由器的,因此有以下结论:

  1. IP数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次的间接交付)。
  1. 只有最后一个路由器才试图向目的主机进行直接交付

2. 路由表中的默认路由

什么是默认路由?
默认路由是一种特殊的路由条目,用于减少路由表的大小和查找时间。当一个网络只有少量的对外连接时,默认路由非常有用。

示例
在图4—24中,主机H的路由表只需要三个项目:到本网络的路由、到网络N的路由和默认路由

默认路由的优势

  1. 减少路由表的大小:默认路由可以避免为每个可能的目的地址添加一条路由条目,从而简化路由表。
  1. 提高查找效率:使用默认路由可以加快路由查找的速度,尤其在网络边缘或主机发送数据报时。

具体例子
在图4—24所示的例子中,连接在网络N上的主机H的路由表只需要3个项目。第一个项目就是到本网络主机的路由,其目的网络就是本网络N,因而不需要路由器转发,而是直接交付。第二个项目是到网络N的路由,对应的下一跳路由器是R2。第三个项目就是默认路由,只要目的网络不是N1和N2,就一律选择默认路由,把数据报先间接交付路由器R1,让R1再转发给下一个路由器,一直转发到目的网络上的路由器,最后进行直接交付。


3. IP数据报的转发流程

IP数据报是如何转发的?
我们用一个例子来说明IP数据报的转发过程。

例4—5
主机H1发送一个IP数据报,其目的地址是128.30.33.138。路由器R收到此数据报后,会依次查找路由表,找到匹配的条目并进行转发。

步骤

  1. 提取目的IP地址D
  1. 判断是否为直接交付
    • 对与路由器直接相连的网络逐个进行检查:用各网络的掩码和D逐位相“与”,看结果是否和相应的网络地址匹配。若匹配,则把分组直接交付(当然还需要把D转换成物理地址,把数据报封装成帧发送出去),转发任务结束;否则间接交付。
  1. 间接交付
    • 对路由表中的每一行(目的网络地址、掩码、下一跳、接口),用其中的掩码和D逐位相“与”,其结果为N。若N与该行的网络地址匹配,则把数据报传送给该行指明的下一跳路由器;否则继续查找。
  1. 使用默认路由
    • 若路由表中有一条默认路由,则把数据报传送给路由表中所指明的默认路由器;否则报告转发错误。
  1. 报告错误
    • 若没有默认路由,则报告转发数据报出错。

总结
IP数据报的首部中没有地方可以用来指明“下一跳路由器的IP地址”。在IP数据报的首部写上的IP地址是源IP地址和目的IP地址,而没有中间经过的路由器的IP地址。既然IP数据报中没有下一跳路由器的IP地址,那么待转发的数据报又怎样找到下一跳路由器呢?当路由器收到一个待转发的数据报时,在从路由表得出下一跳路由器的IP地址后,不是把这个地址填入IP数据报,而是送交下层的网络接口软件。


4. 路由聚合

什么是路由聚合?
路由聚合(Route Aggregation)是一种将多个相同路由的表项合并为一个表项的技术,能够有效减少路由表的大小。

示例
图4—26展示了如何将四个网络的路由合并为一个CIDR地址块,减少路由表的表项数量。

路由聚合的优势

  1. 减少路由表的大小:通过将多个相同路由的表项合并为一个表项,可以显著减少路由表的大小。
  1. 提高查找效率:减少表项数量有助于提高路由查找的效率。
  1. 优化网络资源:路由聚合能有效利用网络资源,减少不必要的路由信息传递。

具体操作
对于路由器R来说,到网络1、网络2、网络3和网络4的下一跳路由器都是R1,而这四个网络的地址空间正好可以合并成一个CIDR地址块,因此在路由表中完全可以用一个网络前缀140.23.7.0/24来指示这四个网络的路由。

持续优化
实际上这种地址聚合可以不断进行下去,多个路由相同的小的CIDR地址块可以聚合成大的地址块,大的地址块还可以聚合成更大的地址块,如图4—26中的R路由表。


5. 最长前缀匹配

什么是最长前缀匹配?
在使用CIDR时,路由表中可能存在多个有包含关系的地址块前缀。最长前缀匹配(Longest-Prefix Matching)是指在这些匹配结果中选择具有最长网络前缀的路由。

示例
在图4—26中,若存在一条直接到网络4的链路,则应选择该链路中的最长前缀匹配项进行数据报的转发。

最长前缀匹配的优势

  1. 更具体的路由选择:由于网络前缀越长,其地址块就越小,因此最长前缀匹配能够选择更加具体的路由。
  1. 实现特定主机路由:通过最长前缀匹配,可以方便地实现特定主机路由,只需在路由表中加入一条前缀为“特定主机IP地址/32”的表项即可。
  1. 实现默认路由:默认路由可以用网络前缀0.0.0.0/0来表示,因为该网络前缀的长度为0,任何IP地址都能和它匹配。

缺点

  • 查找时间变长:由于需要遍历整个路由表才能找到最长匹配的前缀项,因此查找路由表的时间会变长。

总结

路由表与IP数据报转发的关键点

  1. 路由表:包含目的网络地址、地址掩码、下一跳和接口等信息。
  1. 默认路由:可以减少路由表的大小和查找时间,特别适用于网络边缘或主机发送数据报时。
  1. IP数据报的转发流程:包括直接交付、间接交付和使用默认路由等步骤。
  1. 路由聚合:能够有效减少路由表的大小,提高查找效率,优化网络资源。
  1. 最长前缀匹配:在使用CIDR时选择具有最长网络前缀的路由,提供更具体的路由选择,方便实现特定主机路由和默认路由。

通过这篇文章,你应该对路由表和IP数据报的转发有了一个基础的了解。希望这些知识能帮助你更好地理解网络世界的运作。如果有任何疑问或建议,欢迎在评论区留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1940148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为mate20 激活设备

升级失败 需要 准备2个usb线 一根usb1.0工程线 一根正常线 。工程线怎么做,找一个10k电阻 把红线和绿线连起来。我用的是贴片电阻103 大概是2512 1W,也可以用金属膜电阻 步骤① 热风枪吹开后盖

vscode下运行django项目(命令与可视化操作两种方式python .\demo\manage.py runserver)

文章目录 实验前提1. 命令方式操作2. code图形方式操作 实验前提 vscode配置django环境并创建django项目(全图文操作) https://blog.csdn.net/xzzteach/article/details/140591167 1. 命令方式操作 python .\demo\manage.py runserver关闭运行 2. c…

App Instance 架构示例

前言 在Unity程序设计过程中,我们处理的第一个对象是Application Instance。 它的主要职责是启动流程管理、卸载流程管理,次要职责是管理在内部的子系统生命周期。其他职责,提供或桥接应用程序的配置信息、及其他第三方接口。 它通常以单例的…

buu做题(7)

[BJDCTF2020]Mark loves cat 开始的界面没啥东西, 看了下源码好像也没啥东西 用dirsearch扫描一下 有git 泄露 用工具githack下载源码 <?phpinclude flag.php;$yds "dog"; $is "cat"; $handsome yds;foreach($_POST as $x > $y){$$x $y; }f…

【过题记录】 7.21

Mad MAD Sum 算法&#xff1a;思维&#xff0c;前缀最大值 模拟一下他的运行过程就会发现&#xff0c;两次之后整个数组就固定了&#xff0c;之后每次都是每个数往后移动一位&#xff0c;可以模拟两次之后计算每个数的存活轮数&#xff0c;计算贡献。 #include<bits/stdc.h…

FreeRTOS 任务的挂起与恢复

任务的挂起与恢复的API函数 挂起 - vTaskSuspend 挂起任务类似暂停&#xff0c;可恢复&#xff1b; 删除任务&#xff0c;无法恢复&#xff0c;类似“人死两清” 使用 必须将 INCLUDE_vTaskSuspend 定义为 1 才能使用此函数 void vTaskSuspend( TaskHandle_t xTaskToSuspen…

GIT命令学习 二

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

PostgreSQL简介和安装

一、Postgresql简介&#xff1a; 1、PostgreSql是功能强大的&#xff0c;开源的关系型数据库&#xff0c;底层基于C语言实现&#xff1b; 2、开源&#xff1a;允许对PostgreSql进行封装&#xff0c;用于商业收费&#xff1b; 3、版本迭代速度快&#xff0c;正式版本已经到15.R…

《昇思25天学习打卡营第24天|基于 MindSpore 实现 BERT 对话情绪识别》

1. BERT 模型概述 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一个预训练的语言表示模型&#xff0c;可以应用于多种自然语言处理任务&#xff0c;包括对话情绪识别。BERT 通过双向 Transformer 编码器&#xff0c;能同时考虑句子…

【Langchain大语言模型开发教程】基于文档问答

&#x1f517; LangChain for LLM Application Development - DeepLearning.AI Embedding&#xff1a; https://huggingface.co/BAAI/bge-large-en-v1.5/tree/main 学习目标 1、Embedding and Vector Store 2、RetrievalQA 引包、加载环境变量 import osfrom dotenv import…

单例模式_Golang

目录 一、单例模式 1.1 基本概念 1.2 使用场景 二、Golang实现 2.1 懒汉模式&#xff08;Lazy Loading&#xff09; 一、单例模式 1.1 基本概念 一个类只能生成一个实例&#xff0c;且该类能自行创建这个实例的一种模式,这个定义个人感觉可以拆的通俗一些,在项目的生命周…

2-41 基于matlab的小车倒立摆系统的控制及GUI动画演示

基于matlab的小车倒立摆系统的控制及GUI动画演示。输入小车及倒立摆的初始参数&#xff0c;位置参数&#xff0c;对仿真时间和步长进行设置&#xff0c;通过LQR计算K值&#xff0c;进行角度、角速度、位置、速度仿真及曲线输出&#xff0c;程序已调通&#xff0c;可直接运行。 …

【BUG】已解决:ModuleNotFoundError: No module named‘ pip‘

已解决&#xff1a;ModuleNotFoundError: No module named‘ pip‘ 目录 已解决&#xff1a;ModuleNotFoundError: No module named‘ pip‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰…

JAVA零基础学习2(算术逻辑三元运算符、原码反码补码、标准的类如何描写)

JAVA零基础学习2&#xff08;算术逻辑三元运算符、原码反码补码、标准的类如何描写&#xff09; 算术运算符算术运算符自增和自减运算符算术运算符的优先级示例代码 逻辑运算符三元运算符示例代码示例1&#xff1a;简单的条件判断示例2&#xff1a;嵌套的三元运算符 原码反码补…

WebGSI地图切片|栅格地图切片原理|地图矢量切片原理

介绍 图栅格切片是WebGIS中使用的一种新技术&#xff0c;通过地图栅格切片可以有效缩短服务器的地图生成时间和地图传输时间&#xff0c;提高系统的响应速度。 地图切片是在多个比例尺下配置地图&#xff0c;预先将每个比例尺下的地图绘制成小图片&#xff0c;保存到服务器上一…

set(集合),multiset容器及pair队组的创建

1.set的基本概念&#xff1a;所有元素再插入时自动按升序排序&#xff0c;set/multiset属于关联式容器&#xff0c;底层结构是用二叉树实现的 set与multiset区别&#xff1a; set中不允许容器中有重复的元素 multiset允许容器中有重复的元素 2.set的构造函数 3.set的大小和…

【Linux】进程间通信之-- 共享内存与信号量的介绍(下)

前言 上一篇&#xff0c;我们由进程间通信&#xff0c;引入并讲述了管道、匿名管道和命名管道&#xff0c;本节&#xff0c;将继续学习进程间通信的另一种方式之&#xff0c;共享内存。还要学习几个系统调用接口&#xff0c;并演示两个进程通过共享内存来进行通信。。。 目录 1…

数据结构——队列(链式结构)

一、队列链式结构定义 队列的链式存储结构是一种用链表实现的队列,它不像顺序存储结构那样需要预先分配固定大小的空间。链式存储结构的队列由节点组成,每个节点包括数据和指向下一个节点的指针。队列的链式存储结构可以动态地分配内存,更灵活地处理数据。在链式存储结构中…

【07】LLaMA-Factory微调大模型——微调模型导出与微调参数分析

上文介绍了如何对微调后的模型进行使用与简单评估。本文将介绍对微调后的模型进行导出的过程。 一、llama-3微调后的模型导出 首先进入虚拟环境&#xff0c;打开LLaMA-Factory的webui页面 conda activate GLM cd LLaMA-Factory llamafactory-cli webui 之后&#xff0c;选择…

SQL39道常见题型

SQL1 查询所有列 现在运营想要查看用户信息表中所有的数据&#xff0c;请你取出相应结果。 select * from user_profile 结果&#xff1a; SQL2 查询多列 还是上面那个输入&#xff0c;题目换成&#xff1a;现在运营同学想要用户的设备id对应的性别、年龄和学校的数据&#…