2023年11月27日发(作者:)

浅谈通信⽹络(四)——报⽂转发(IPMAC

看此⽂前,建议先看:

前⾯说过数据包的处理顺序为:数据链路层、⽹络层、传输层、最后才是应⽤层。

路由转发:通过IP地址转发

⼆层转发:在处理数据链路层的时候,⼀般说的即通过MAC地址转发报⽂,就是⼆层转发。

三层转发:在处理⽹络层的时候,⼀次路由(⾸包CPU转发并建⽴三层硬件表项)、多次交换(后续包芯⽚硬件转发)

具体细节如下:

路由转发:

1.接收数据

检查⽬的MAC

处理部件:⽹络接⼝——⽹卡、光模块、电模块等。

三层⽹络接⼝⼀般只接收两种MAC地址的数据:

⽬的MAC是⾃⼰、⽬的MAC是全1的⼴播地址

其他MAC地址的数据包将丢弃。

但是如果开启混杂模式,mac同样会接收所有监听到的数据包。

⼆层⽹络接⼝会接收所有MAC地址的数据报⽂。

地址表学习

剥离⽬的MAC,再检查源MAC

核实MAC地址表⾥⾯,是否已经学习了MAC地址:

如果已经学习,则刷新⽼化时间为最新;

如果没有学习,则将MAC地址和和接收到该数据包的接⼝加⼊MAC地址表

备注:⼴播MAC地址不加⼊MAC地址表

3.剥离源MAC地址,检查⽬的IP

处理部件:TCP/IP协议栈

如果是⾃⼰的IP地址,则交由TCP层处理;

如果不是⾃⼰的IP地址内,在同⼀个⽹段内,直接进⾏下⼀步,查询⽬的IPARP

如果在不同⽹段内,查询路由表,进⾏三层转发

查询路由表的最终结果是查询到最⼩⼦⽹掩码直连路由,得到下⼀跳的IP地址(如果没有指定下⼀跳IP地址,则⽬的IP地址作为下⼀跳IP

址)

4.学习/查询ARP

查询ARP表到下⼀跳IP地址的⽬的MAC地址和出接⼝

如果其中没有该IP地址的记录,则发起ARP学习得到MAC地址;

如果其中有记录,则标记该数据包的⽬的MAC地址

备注:该处并未开始封装⽬的MAC地址,因为源MAC地址需要优先封装,但是还没确定

5.根据出接⼝,得到源MAC地址,并完成源MAC和⽬的MAC封装

备注:三层接⼝,从接⼝直接获得源MAC地址;⼆层接⼝则从所在vlan的逻辑接⼝处获得源MAC

6.发送数据

⽹络接⼝对局域⽹内,进⾏转发

⼆层转发(交换机):

⼀般只发⽣在⼀个交换设备内多个接⼝处于同⼀个VLAN内的情况。

1.接收数据,并不会筛选⽬的MAC,⼆层接收所有数据包

地址表学习/刷新,同上

3.查找⽬的MAC:若⽬的MAC是⼴播或组播,则在所属的Vlan中⼴播或组播;

否则在MAC表中查找是否存在Vid对应的⽬的MAC表项

如果在,则根据查询到的端⼝,直接转发;

如果不在,则在VLAN内除了接收⼝外的所有接⼝转发

三层转发(三层交换机)

⼀次路由:

过程同路由转发,

并学习了三层转发信息表,包括⽬的IP、⽬的MAC、出⼝VLAN、出接⼝

多次交换(精确地址匹配转发):

当后续有同样⽬的IP的数据包流,直接查询三层转发信息表进⾏转发。过程如下:

1.刷新源MAC地址表项;

2.筛选⽬的MAC地址为⾃⼰,查询三层表项

3.精确IP地址匹配,查询三层转发信息表,直接得到出接⼝予以转发。

备注⼀:

交换机只有⼀个MAC地址,所有vlanif接⼝共享⼀个MAC地址;

路由器每个三层接⼝(包括vlanif)对应⼀个MAC地址。

备注⼆:

为了便于理解查询路由表的最终结果是查询到最⼩⼦⽹掩码直连路由,⾸先罗列如下⼏个概念:

I.路由选路原则

a.⼦⽹掩码最长匹配

b.管理距离最⼩优先

c.度量值最⼩优先

备注:策略路由优先级最⾼,即⾸先匹配策略路由

II.路由分类

⼀般我们路由分类为:静态路由和动态路由

静态路由:⿊洞路由、直连路由、缺省路由、甚⾄包括策略路由等

动态路由:OSPFRIPBGPEBGPISIS

⽽此处,我想告诉你⼀个更重要的分类,即:直连路由和迭代路由。

直连路由从何⽽来?

a.当你的⽹络接⼝上电,这个时候叫物理up;

如果该⽹络接⼝配置了IP地址或者所在VLAN的虚接⼝配置了IP地址,则会使能协议UP,此时就会⽣成直连路由

b.另外⼀种是你⼿动注⼊路由表的,凡是你的路由不仅仅指定或者不指定下⼀跳IP地址,还指定了出接⼝的时候,则该条路由直接变为直连

路由

除了介绍之外的路由,都将是迭代路由。

直连路由的意义为:通过该路由,你可以直接终⽌路由表查询,通过它的下⼀跳IP地址查询ARP表,或者出接⼝可以直接到达转发⽬的⽹

络。

迭代路由的意义为:通过该路由得到的下⼀跳IP,继⽽查询ARP表不⼀定能够到达转发⽬的⽹络;还需要额外查询到达该下⼀跳IP的路由如

何到达才⾏。

迭代路由如何理解勒?

⽐如从昆明开车到北京,中间会经过昆明-成都-西安-北京。当在昆明的时候,听A说要想去北京,得先到达西安;可问题是如何到达西安

勒?⼜听B说,要想去西安,得先到达成都。

⽽从昆明到成都,是可以直接⾛成昆⾼速到达的。所以A说的相当于是迭代路由,⽽B说的是直连路由。

⼀般所谓定义的冲突域、⼴播域的概念是怎么回事?

冲突域指都能够同时监听学习到信号的同⼀通道内:

有线使⽤集成器链接的多个主机,当某⼀个主机发送⼀个信号的时候,别的所有主机都是可以接受到信号的;

⽆线,Wifi⾥⾯,同⼀个频段内的终端也是⼀个冲突域。

因此在冲突域内,专门制定了CSMA/CACSMA/CD来解决冲突的问题。

⼴播域是指⼴播MAC,即全1MAC可以到达的区域。

可见,所有冲突域都是⼴播域。另外由于交换机同⼀VLAN内,也会⼴播,所以同⼀个VLAN内也是属于⼴播域。

IP层能够隔离⼴播域的根本原因是会剥离MAC地址,所以并不会涉及到⼴播MAC的转发。

虽然可能在同⼀个物理介质内,但如果采⽤了多址技术,终端设备能够区分出来不同的通道。因此也属于不同的冲突域和⼴播域。

⽐如wifi⾥⾯使⽤不同频率⽽构建的不同通道。

ARP存在的意义:

我们知道MAC地址表,标记了MAC地址和接⼝的对应关系;

ARP表,则标记了IP地址和MAC地址的对应关系。

MAC地址表,通过查询数据包的源MAC和进接⼝学习;

ARP表,通过发起ARP学习获得。

ARP表,是否也可以通过查询数据包获得MAC地址和IP地址的关系学习勒?⽽并不需要再次发送ARP。甚⾄都不再需要ARP表,直接在

MAC地址表内添加就⾏了?

答:由于IP地址的数量有千千万万,对于维护这个表是完全不可能的。⽐如对接互联⽹设备来的数据流,MAC地址只有⼀个,但是该MAC

地址对应的IP地址却有千千万万个。

那是否可以抓取同⼀⽹段内IP的数据包来获取MAC地址和IP地址对应关系?

答:如果采⽤这种⽅式,当需要转发的IP地址在⼀个⽹段内,可是⼜没有学习到该IP地址的MAC地址怎么办呢?那就还是得发送ARP

采⽤这种⽅式,实现起来并不⽐ARP简单;

还会不断刷新⽼化时间,增加额外开销;

还需要同时再运⾏ARP,显得过于多余,增加性能负担。

备注:那有没有直接从数据包层获取IP/MAC地址表项,⽽不是发起ARP请求获得?可以的,当本地接⼝收到(不包括被接⼝拒绝的包)的

报⽂,经过ARP处理过,包括对⽅ARP请求和免费ARP,都可能将源IP和源MAC写⼊。具体看⼚家实现情况,⼀般是可配置开关。

RFC826告知会学习,但是在个⼈电脑上测试并不学习,华为交换机告知可以配置,默认是可以学习。

场景1

如果本段设备要使⽤路由转发的原理检查对端是否存活,该如何构造数据包呢?好吧,这就是单臂还回路由。

场景2

如果在路由器上,做了关于到公⽹IP的策略路由的出接⼝,但是并没有指定下⼀跳,是否可以?如果是同时指定下⼀跳和出接⼝呢?另外再

只指定下⼀跳呢?

场景3:

如果ping全⽹络地址255.255.255.255,是不是就可以到达全世界呢?

不⾏,因为路由器发现和⾃⼰的接⼝并不在同⼀个⽹段,所以就⾛路由表,路由表是没有关于该IP地址路由的。

更多场景,空了再继续添加。

由于确实没在⼀个⼤⼚待过,有错之处还望指正!

如果转发,请注明出处!

参考⽂献和书籍:

/IP详解卷1:协议 作者LawrenceBerkeley

2.华为NE40产品帮助⼿册

3.华为93产品帮助⼿册