程序员社区

路由器

路由器是设备对外通信的窗口,是不同局域网互联互通的桥梁,认识和了解路由器的工作原理,不管是工作中还是生活中,都是有意义的

路由器

路由器,Router,负责不同网络之间的通信,充当网关的作用。根据目的IP地址,通过内部路由表查找最佳路径,把IP数据包转发到下一个设备,实现不同网络、不同网段间的通信

路由器的两个功能:路由,转发

路由器工作在:网络层

路由器端口分为内网口和外网口,它们有各自的IP地址和MAC地址,内网口连接各种设备主机,外网口连接其他网络

在这里插入图片描述

在这里插入图片描述

内部结构

逻辑上由:输入/输出接口、数据转发部分、路由管理部分、用户配置接口,共5部分组成

在这里插入图片描述

输入端口

数据帧到达端口后,物理层进行比特的接收,数据链路层进行CRC校验并检查目的MAC地址是否与此端口符合,如果符合,则去掉数据链路层的帧头和帧尾,并将其送往网络层做排队处理

路由管理

路由器管理着一张路由表,它负责记录一个网络到另一个网络的路径。路由表或由路由协议(RIP/OSPF/ISIS/BGP)动态配置(动态路由),或管理员静态配置(静态路由),或直连路由

数据转发

根据路由表形成的转发表转发数据到下一跳(如何理解?后面会讲到)

输出端口

交换结构传送过来的分组先进行缓存,数据链路层处理模块将分组加上链路层的首部和尾部,交给物理层后送往线路

路由表

路由表是路由器实现不同网络间通信的关键,路由器收到数据后是根据路由表查找转发的

在这里插入图片描述

形成方式

  • 本地直连网段

路由器上的每一个接口在启用之后都会在路由表里生成一个路由条目

  • 静态路由

管理员手工配置

  • 动态路由

路由器上运行动态路由协议(RIP/OSPF/ISIS/BGP),运行相同动态路由协议的路由器可以建立邻居,每个邻居会将自己知道的所有路由条目发送给对方

参数

  • Destination/Mask

一个路由条目的前缀和掩码

  • Proto

形成这个路由条目的协议,Direct是本地直连网段,Static是静态路由

  • Pre

选择的优先级,越小越优先

  • Cost

一个目的地的开销,计算最优路径,越小越优先

  • Flags

D是download,表示该路由下发到FIB表

  • NextHop

下一跳的IP地址,下一跳就是去往下一个设备

  • Interface

发出数据包的接口

  • Metric

度量值,衡量一条路由好坏的标准

路由表匹配

“最长匹配原则”

数据包中目的IP与路由表的掩码做“与”运算,得到的结果与路由表前缀比较,取相同的部分最长的路由条目,作为转发路径

控制原则

如果两条路由条目,前缀相同,长度一致,怎么选择?比较度量值Metric

工作原理

在这里插入图片描述

  • A在网络层将来自上层的报文封装成IP数据包,其中源IP地址为自己,目的IP为C,主机A会用源IP配套的子网掩码与目的地址进行“与”运算,得出目标网段地址与自己的网段不同,A与C不是同一网段,因此A通过自己内部的路由表查找,数据包需要发给路由器1
  • A通过ARP请求获取路由器1的G1/0/1的MAC地址,在链路层将其封装成目标MAC地址,源MAC地址是自己
  • 路由器1从G1/0/1口接收到数据帧,输入端口数据链路层校验CRC并检查目的MAC符合,去掉链路层首部,把数据包交给网络层,排队等待路由器的处理机处理
  • 路由器根据目的IP地址(C的IP地址),在路由表中检查是否有匹配的项。如果没有,则根据默认路由转发,如果默认路由也没有,则丢弃,并给源主机返回一个目的不可达的ICMP报文。如果在路由表中有匹配的项,查到下一跳的IP地址是路由器2的端口G2/0/1的IP地址,输出端口是G1/0/2,则路由器的交换结构把数据包转发到G1/0/2的网络层,G1/0/2的网络层并不会对数据包进行处理,直接送往数据链路层进行封装,链路层会把源MAC地址设置为G1/0/2的MAC地址,目的MAC地址设置为G2/0/1的MAC地址。如果路由器的转发表里有G2/0/1的MAC(这个后面讲),则直接封装好发送出去即可。如果没有G2/0/1的MAC地址,则路由器需要发送ARP请求获取G2/0/1的MAC地址,获取后同样是封装好送到物理层发出去
  • 路由器2的G2/0/1口收到后,也是根据目的IP地址,在路由表中匹配,发现匹配的路由条目是Direct,本地直连网段,输出端口是G2/0/2,则由G2/0/2发送ARP广播请求目的主机C的MAC地址,然后在链路层封装,然后发送出去,最终到达C

路由表与转发表

进程转发(Process Forward)

路由器在输出端口时需要目的MAC地址来封装链路层首部,需要在路由器的ARP cache检查是否存在,如果不存在,还需要发ARP广播请求去请求对方的MAC地址,这整个过程Cisco命名为“进程转发”

但是,缺点也有,过程缓慢,效率低下

快速转发CEF(Cisco Express Forward)

于是Cisco CEF创建了另外一张表:adjacency table,用来收集二层MAC地址信息。然后再根据routing table + adjacency table创建CEF table,这张表里有路由器转发需要的一切信息,甚至把发往下一跳的二层头构建好了,转发时用二层头+IP包就可以从输出端口发送出去了(当然,ttl要减1,重新计算CRC)

转发表FIB(Forward Information Base)

以上都是基于软件CPU转发,转发效率低下,相比硬件转发至少一个数量级的差距,所以我们需要将CEF table下发到硬件芯片上,硬件只对二进制0和1敏感,所以需要对CEF table进行十进制转二进制

所以,转发表FIB是给硬件芯片看的

总结

路由协议产生路由表,路由表产生硬件转发表,硬件转发表负责流量的转发

章节内容参考https://www.zhihu.com/question/23328152/answer/137899901

到底什么是路由表

路由表routing table,又称为路由择域信息库(routing information base),是一个存储在路由器或计算机中的数据库。路由表存储着指向特定网络地址的路径

从上面这段话,我们可以知道,路由表里存着的是路径,什么的路径?报文该往哪走的路径

这句话怎么理解?

我们知道路由表存在于路由器计算机中。先看路由器,路由器有很多的接口,当一条报文过来,到达路由器,路由器要知道从哪个接口发出去。再来看计算机,计算机不像路由器有很多的接口,但是它可能有很多的虚拟网卡,报文要发出去,也需要知道从哪个网卡走(实际上都是从主网卡走,只是封装报文的时候用到虚拟网卡的ip地址等参数)

查看路由表

Windows:

route PRINT -4   

在这里插入图片描述

Linux:

ip route  

问题

大部分的计算机,当你自动或手动配置了网卡的IP地址后,系统会自动把目的IP和网卡加入路由表中,目的IP一般都是0.0.0.0,表示任意IP地址

在这里插入图片描述

主机A需要和主机B进行通信,已知主机B的ip地址是192.168.1.2/24,现在需要把主机A的ip地址配置为同网段,比如192.168.1.1/24

A是Linux系统,可以通过ifconfig命令配置

在这里插入图片描述

主机A设置了IP地址,发现并不能ping通,ping不通的原因查询可以点击之前的文章"ping"

其中有一个原因就是路由表内找不到去往主机B的路径,所以我们需要手动添加

Linux可以用ip route add 192.168.1.0/24 dev eth0 table local,把路径写入路由表内

192.168.1.0/24表示目的IP,这里是一个网段

eth0是主机A的配置IP地址192.168.1.1的网卡名

table local表示添加到路由表local里,路由表有多个,如果想查看,可以用ip route list table table_number[或者table_name]

Linux系统维护4个路由表:

  • 0#表:系统保留表
  • 253#表:default table,没特别指定的默认路由都放在该表
  • 254#表:main table,没指明路由表的所有路由放在该表
  • 255#表:local table,保存本地接口地址、广播地址、NAT地址,由系统维护

所以上面的意思是所有发给192.168.1.0/24网段的报文都要从eth0发出,现在应该可以ping通了

最后,判断选择哪条路由,并不只是根据network destination,还需要结合其他参数,这里就不深究了


赞(0) 打赏
未经允许不得转载:IDEA激活码 » 路由器

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区