现代社会的人们几乎时时刻刻都在接触网络,但几乎很少有人会去思考在网络通信过程中究竟发生了些什么,因为网络对于人们来说就是一个黑匣子,屏蔽掉了所有的细节,我们只需要知道如何使用即可。但作为一名从事于网络工作的人员,我们则必须知道其中的细节。我们需要知道当我ping一台处于网络中的计算机时所发生的事情,即报文在网络设备上的转发处理。提到转发就不得不提二三层转发的概念。
现有如下网络结构图,我们在此网络结构图的基础上简单描述一下二三层转发的流程。
二层转发原理
在OSI模型中,二层为数据链路层,介乎于物理层和网络层之间。数据链路层在物理层提供的服务基础上向网络层提供服务,其最基本的服务室负责直接相连的网络设备之间的通讯。数据在进入二层以后被封装或者解封装为数据帧的形式。
数据链路层转发的主要依据链路层信息MAC地址来完成的。MAC地址就是我们常说的硬件地址,网络中每个通讯设备都有自己唯一的MAC地址,这个地址是独一无二的,设备根据MAC地址判断出要把数据包转发到何处,以及数据包是从何处来的。因此,交换机中需要一张MAC地址与端口号一一对应的表,以便在交换机内部实现二层数据转发,这张二层转发表就是FDB(Forwarding Database)表。
1)ARP请求
在图中,当PC-A向PC-B发起一个ICMP请求回应报文时,计算机上的IP模块发包时,首先比较自己的IP和网关相与是否等于PC-B的IP和网关相与的值,发现相等,于是认为只需要进行二层转发。
于是,PC-A查找自己的ARP缓存表里有没有PC-B对应的MAC地址,没有查找到,于是发起一个ARP请求的广播报文,请求PC-B的IP对应的MAC地址,在这个广播报文中,帧头部的目的MAC地址为广播地址ffff-ffff-ffff,而报文段里,源IP与源MAC都是PC-A的,目的IP为PC-B,而目的MAC则全为0。
PC-A将这个帧封装好后从接口发送出去,交换机接收到这个帧以后,首先检查帧的头部信息,发现帧的头部信息中,源MAC地址在自己的MAC表里没有查到,于是首先进行学习,将此帧的源MAC地址和接收的端口号添加到自己的MAC表中。
随后交换机检查帧头部的目的MAC地址,发现这是一个广播地址,于是向除了接收这个帧的接口以外的所有接口进行转发。连接在交换机上的计算机在接收到这个帧以后进行进行解析,除PC-B以外的计算机发现请求的IP地址不是自己,于是将其抛弃。而PC-B解析后发现报文中的目的IP地址正是自己的IP地址,并且发现报文中的源MAC地址和源IP地址在自己的ARP表里没有,于是将其添加到自己的ARP表里,随后又发现这个ARP报文是一个ARP请求回应报文,于是封装一个ARP回应报文,在这个ARP报文里,源MAC地址是PC-B,目的MAC地址是PC-A,随后将这个帧发送给交换机。
交换机接收到这个帧后,发现帧的源MAC地址在自己的MAC表里没有,于是学习,将其添加到自己的MAC表中。随后根据帧里的目的MAC在自己的MAC表里进行查找,找到了对应项,据此将此帧转发出去。
PC-A接收到交换机转发的帧以后,发现该帧的目的MAC正是自己,确认这个帧是发送给自己的,于是继续解封装,发现该帧为ARP回应,目的IP是自己,源IP正是PC-B,于是将PC-B对应的IP和MAC添加到自己的ARP表中。
2) ICMP请求回应过程
现在PC-A已经获得了PC-B的MAC地址,那么现在把刚开始放入缓存中的ICMP报文取出,将目的MAC设置为PC-B的MAC地址,并将这个报文发送出去。
交换机接收到这个帧后,检查帧的头部信息,发现源MAC地址在自己的MAC表里,然后再根据目的MAC地址进行查找,查到了对应的表项,于是将这个帧从对应的端口发送出去。
PC-B接收到这个帧后发现其目的MAC是自己,于是继续解封装,在IP报文里发现这是一ICMP的请求回应报文,于是自己封装一个ICMP的回应请求,源IP、源MAC为自己,目的IP、目的MAC为PC-A。
交换机接收到这个帧后,检查帧的头部信息,发现源MAC地址在自己的MAC表里,然后再根据目的MAC地址进行查找,查到了对应的表项,于是将这个帧从对应的端口发送出去。
PC-A接收到这个帧以后,发现目的MAC是自己,于是接收这个帧,并进行解析,发现这个帧是PC-B对自己刚才发送的ICMP请求报文的回应。
三层转发原理
1)PC-A ping PC-C
PC-A开始封装一个ICMP请求回应报文,当封装IP报头的时候,发现目的IP和自己不属于同一个网段。
2)PC-A把这段报文交给网关处理
由于不处于同一个网段,PC-A继续封装报文,在封装帧的时候目的MAC寻找自己的ARP表中网关的MAC地址,没有查找到,于是把这段报文缓存起来。
3)PC-A向网关发起一个ARP请求
PC-A向网关发起一个ARP请求,寻求网关的ARP地址。路由器接收到这个请求,查看到帧头部信息里的目的发现这是一个广播帧,于是接受下这个帧但不进行转发,继续解析,发现ARP报文中的源MAC以及源IP地址不在自己的ARP表中,于是进行ARP学习。继续解析,发现目的IP正是自己,于是,路由器发起一个ARP回应给PC-A。
PC-A接收到这个帧后,发现目的MAC正是自己,于是接收下这个帧并进行解析,发现这个帧正是网关发来的ARP回应,于是在自己的ARP表里添加网关对应的MAC,然后取出缓存的ICMP报文,将帧头部的目的MAC置换为网关的MAC地址,并发送出去。
路由器接收到这个帧后,查看到目的MAC是自己的MAC地址,于是接收下来并开始解析,在自己的路由表中的路由条目中查找IP首部中的目的IP,查找出该IP对应的目的网络号和端口,于是,重新进行二层封装,但发现自己的ARP表中没有PC-C的MAC地址,于是将这个帧缓存起来,并发出一个ARP请求广播报文。
4)路由器发起ARP请求寻找PC-C的MAC地址