浅谈通信网络(四)——报文转发(IP/MAC)
看此文前,建议先看:
http://www.cnblogs.com/daiaiai/p/8994932.html
https://www.cnblogs.com/daiaiai/p/9047713.html
前面说过数据包的处理顺序为:数据链路层、网络层、传输层、最后才是应用层。
路由转发:通过IP地址转发
二层转发:在处理数据链路层的时候,一般说的即通过MAC地址转发报文,就是二层转发。
三层转发:在处理网络层的时候,一次路由(首包CPU转发并建立三层硬件表项)、多次交换(后续包芯片硬件转发)
具体细节如下:
路由转发:
1.接收数据
检查目的MAC;
处理部件:网络接口——网卡、光模块、电模块等。
三层网络接口一般只接收两种MAC地址的数据:
目的MAC是自己、目的MAC是全1的广播地址
其他MAC地址的数据包将丢弃。
但是如果开启混杂模式,mac同样会接收所有监听到的数据包。
二层网络接口会接收所有MAC地址的数据报文。
2.MAC地址表学习
剥离目的MAC,再检查源MAC
核实MAC地址表里面,是否已经学习了MAC地址:
如果已经学习,则刷新老化时间为最新;
如果没有学习,则将MAC地址和和接收到该数据包的接口加入MAC地址表
备注:广播MAC地址不加入MAC地址表
3.剥离源MAC地址,检查目的IP
处理部件:TCP/IP协议栈
如果是自己的IP地址,则交由TCP层处理;
如果不是自己的IP地址内,在同一个网段内,直接进行下一步,查询目的IP的ARP;
如果在不同网段内,查询路由表,进行三层转发
查询路由表的最终结果是查询到最小子网掩码直连路由,得到下一跳的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,二层接收所有数据包
2.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.路由分类
一般我们路由分类为:静态路由和动态路由
静态路由:黑洞路由、直连路由、缺省路由、甚至包括策略路由等
动态路由:OSPF、RIP、BGP、EBGP、ISIS等
而此处,我想告诉你一个更重要的分类,即:直连路由和迭代路由。
直连路由从何而来?
a.当你的网络接口上电,这个时候叫物理up;
如果该网络接口配置了IP地址或者所在VLAN的虚接口配置了IP地址,则会使能协议UP,此时就会生成直连路由
b.另外一种是你手动注入路由表的,凡是你的路由不仅仅指定或者不指定下一跳IP地址,还指定了出接口的时候,则该条路由直接变为直连路由
除了介绍之外的路由,都将是迭代路由。
直连路由的意义为:通过该路由,你可以直接终止路由表查询,通过它的下一跳IP地址查询ARP表,或者出接口可以直接到达转发目的网络。
迭代路由的意义为:通过该路由得到的下一跳IP,继而查询ARP表不一定能够到达转发目的网络;还需要额外查询到达该下一跳IP的路由如何到达才行。
迭代路由如何理解勒?
比如从昆明开车到北京,中间会经过昆明-成都-西安-北京。当在昆明的时候,听A说要想去北京,得先到达西安;可问题是如何到达西安勒?又听B说,要想去西安,得先到达成都。
而从昆明到成都,是可以直接走成昆高速到达的。所以A说的相当于是迭代路由,而B说的是直连路由。
一般所谓定义的冲突域、广播域的概念是怎么回事?
冲突域指都能够同时监听学习到信号的同一通道内:
有线使用集成器链接的多个主机,当某一个主机发送一个信号的时候,别的所有主机都是可以接受到信号的;
无线,Wifi里面,同一个频段内的终端也是一个冲突域。
因此在冲突域内,专门制定了CSMA/CA和CSMA/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地址路由的。
更多场景,空了再继续添加。
由于确实没在一个大厂待过,有错之处还望指正!
如果转发,请注明出处!
参考文献和书籍:
1.TCP/IP详解卷1:协议 作者LawrenceBerkeley
2.华为NE40产品帮助手册
3.华为93产品帮助手册