当正常情况下,我们需要访问某个地址时,必然需要知道对方的IP地址,这个是必然条件,比如我们访问www.baidu.com这个网址,其实访问的也只是百度的IP地址,只不过期间经过了DNS域名解析,将这个域名地址解析成一个IP地址这个过程。
这就像是我们发快递,必然要知道收件人的姓名(这也就相当于收件人=目的IP,发件人=源IP)然后我们还需要知道对方的目的地址在哪。(目的地址和源地址就像是IP地址的掩码),如果我跟对方在同一个城市,那么我们就不需要使用快递,直接本地把快递给别人即可。这个就是二层转发,也就是当源IP和目的IP在同一个网段时,这时候只需要进行二层转发即可。
当我们发送报文时,发现源IP和目的IP不在同网段,那这时候就需要网关这个参数。
网关的作用就像是快递员,当我们发快递需要发往其他城市时,肯定不会为了一个小东西就直接开车前往其他城市,那这时候比较方便的做法就是寄快递,将东西(报文)交给快递员,然后由快递员在各个城市之间转发,直至最后到达收件人的手上。
所以在这个过程中,我们的源IP和目的IP肯定是不能变化的。这就像是收件人和寄件人姓名和地址,必然不能发生变化,而变化的在于快递是在谁手上,比如一开始报文从我的手上发给快递员A,那这时候源MAC则是我,目的MAC则是快递员A,然后当快递到达了快递员A手上后,可能需要发往其他城市的其他快递员手上,那这时候报文在到达快递员A后,会重新进行封装,将源MAC修改成快递员A,目的MAC修改成快递员B。直至最后,当快递员B找到收件人,则将报文的源MAC修改成快递员B,目的MAC修改成收件人本人。
当报文需要进行二层转发时,是不需要查找三层的路由表信息的,而且二层转发的时候也不会对报文里面的某些字段进行修改,这样,二层转发的速度和效率必然远远高于三层转发。
当报文需要进行三层转发时,需要将目的MAC,目的IP字段进行识别,然后在根据目的IP地址的网段在自己的路由表中进行查找,匹配,然后对应ARP里面的信息,进行转发。
这个过程毋庸置疑是比二层转发要慢的。
若还是有些不懂的。可以继续看下去,后续以实验用例介绍:
实际拓扑以及报文的变化介绍:
假设以这个拓扑图来演示实验:
二层转发过程:
当PC1想访问PC2时(以ping为例),
首先,PC1会开始封装报文:
按照封装顺序,是从上到下封装---应用层----传输层----网络层----网络接口层(TCP/IP模型,这里只讲网络层和网络接口层的封装-网络接口层分数据链路层和物理层)
-----------------------------------------------------------------------------------------------------------
| 物理层:网线的封装标准和格式 |
| 数据链路层:源MAC:PC1的MAC 目的MAC:暂时未知 |
| 网络层封装:源IP:10.0.0.1 目的IP:10.0.0.2 协议:ICMP |
-----------------------------------------------------------------------------------------------------------
但是在这个报文的封装过程中,我们首先需要判断源IP和目的IP是否在同一个网段,如果不是同一个网段则需要提交给网关,由网关去查找转发。若是在同一网段则根据目的IP在ARP表中找到对应的目的MAC,然后进行封装, 但是正常来说,刚开始的时候肯定是没有目的MAC这个字段的。所以在目的MAC字段,应暂时未空,然后通过ARP信息去找到目的IP对应的MAC地址。
那这时候,我们PC1会先发送一个ARP的请求报文,作用是用于请求10.0.0.2这个地址的MAC地址信息。ARP的请求报文如下:
-----------------------------------------------------------------------------------------------------------
| 物理层:网线的封装标准和格式 |
| 数据链路层:源MAC:PC1的MAC 目的MAC:FFFF-FFFF-FFFF |
| ARP报文头:ARP的操作位:1(请求-Request) |
| 发送站的协议地址:10.0.0.1 |
| 接收站的协议地址:10.0.0.2 |
| 发送站的硬件地址:PC1的MAC |
| 接受站的硬件地址:FFFF-FFFF-FFFF |
------------------------------------------------------------------------------------------------------------
由于ARP的请求报文是以广播形式发送的,所以其中的目的MAC和接收站的硬件地址都是为12个F,代表的是所有设备都会接受。这个报文从PC1的接口发出去,会先到达SW1这个二层交换机,所以交换机的处理方式是:收到二层报文,会将其中的源MAC和接受的端口记录起来,形成MAC地址表,然后根据报文目的MAC按照MAC地址表进行转发,若MAC地址表中有的则直接转发对应端口,若MAC地址表中没有的则跟广播数据帧的转发一样,从除了接收端口以外所有端口发送出去。此时报文会从SW1的1口和2口发送出去,该报文到达路由器时,路由器从下到上解封装,发现目的MAC是广播可以接受,但是接收站的协议地址不是自己,但是路由器本身默认是拒绝转发广播包的,所以会直接丢弃。PC2收到该报文后,同样进行从下到上解封装,发现报文源MAC是自己,于是解封装ARP报文,发现是个请求包,于是就其中的源MAC和源IP记录在本地的ARP表中,然后以该地址重新封装报文。发送给PC1,封装格式如下:
-----------------------------------------------------------------------------------------------------------
| 物理层:网线的封装标准和格式 |
| 数据链路层:源MAC:PC2的MAC 目的MAC:PC1的MAC |
| ARP报文头:ARP的操作位:2(请求-Reply) |
| 发送站的协议地址:10.0.0.2 |
| 接收站的协议地址:10.0.0.1 |
| 发送站的硬件地址:PC2的MAC |
| 接受站的硬件地址:PC1的MAC |
------------------------------------------------------------------------------------------------------------
报文中发送站协议地址和源MAC都是PC2本身的,而接收站的协议地址和硬件地址和目的MAC则是从之前收到的ARP请求报文中获得的,然后以这个地址单播的形式发送出去。
SW1交换机收到了这个报文后,会根据报文的源MAC和接收的端口记录在本地MAC地址表,然后在根据目的MAC查找MAC地址表,找到对应的项进行转发,由于之前PC1发送过一次包,所以SW1里面有关于PC1的MAC和接受的端口,然后将报文从MAC地址表中对应的端口发出去,发到PC1的链路上。
当PC1收到了该报文后,从下到上解封装,发现目的MAC是自己,于是继续向上解封装,到ARP报文时,发现是个ARP的响应包,然后将发送站的协议地址和发送站的硬件地址进行捆绑,记录在本地形成ARP表,然后在回到刚开始的时候,将报文圆满的补充完成并且发出:
-----------------------------------------------------------------------------------------------------------
| 物理层:网线的封装标准和格式 |
| 数据链路层:源MAC:PC1的MAC 目的MAC:PC2的MAC |
| 网络层封装:源IP:10.0.0.1 目的IP:10.0.0.2 协议:ICMP |
-----------------------------------------------------------------------------------------------------------
当这个报文发送到交换机后,同理根据源MAC和接受的端口进行刷新MAC地址表,然后在根据目的MAC查找MAC地址表,从对应的接口转发出去,然后PC2收到后,同样进行从下到上解封装,并且对ICMP的回包和交互。
至此,二层转发过程结束。下面我们看三层转发。
三层转发过程:
当PC1想和PC3互相进行访问时,我们首先需要判断源IP和目的IP是否在同一个网段,如果不是同一个网段则需要提交给网关,由网关去查找转发。而在上图实验拓扑中,PC1和PC3肯定是不在同一网段的,那这时候肯定就需要在PC1上设置个网关参数。
网关:一般来说就是数据报文直接出口的三层设备的接口地址,如在这个例子当中,离PC1最近的三层设备就是R1,那网关地址一般也就是R1的G0/0/0口的IP地址。
这样一样对于PC1来说,所有不认识的数据包只需要丢给网关,然后由网关发出去就行了。所以R1的报文封装如下:
-----------------------------------------------------------------------------------------------------------
| 物理层:网线的封装标准和格式 |
| 数据链路层:源MAC:PC1的MAC 目的MAC:网关的MAC |
| 网络层封装:源IP:10.0.0.1 目的IP:20.0.0.1 协议:ICMP |
-----------------------------------------------------------------------------------------------------------
其中源IP和源MAC肯定是自己,目的IP肯定得是PC3本身,不然这个报文也就失去了原本的含义,而目的MAC字段则是需要将报文交给的设备,也就是网关的接口MAC。一般来说三层设备的每个三层接口都有个单独的MAC地址。
这样一来报文的封装就会以这样的形式封装了,PC1需要根据ARP表找到网关IP地址所对应的MAC地址,然后进行封装,但是刚开始的时候,可能PC并没有网关的MAC,所以可能还得需要发送ARP报文进行MAC地址的学习。
ARP报文参数如下:
-----------------------------------------------------------------------------------------------------------
| 物理层:网线的封装标准和格式 |
| 数据链路层:源MAC:PC1的MAC 目的MAC:FFFF-FFFF-FFFF |
| ARP报文头:ARP的操作位:1(请求-Request) |
| 发送站的协议地址:10.0.0.1 |
| 接收站的协议地址:10.0.0.254 |
| 发送站的硬件地址:PC1的MAC |
| 接受站的硬件地址:FFFF-FFFF-FFFF |
------------------------------------------------------------------------------------------------------------
整个ARP的报文流程同上二层转发流程一样。这里就不多叙述了。
当PC1收到了ARP响应包后,就知道了网关-R1的G0/0/0口的IP地址,然后根据正常的报文封装进行封装发出:
-----------------------------------------------------------------------------------------------------------
| 物理层:网线的封装标准和格式 |
| 数据链路层:源MAC:PC1的MAC 目的MAC:网关的MAC |
| 网络层封装:源IP:10.0.0.1 目的IP:20.0.0.1 协议:ICMP |
-----------------------------------------------------------------------------------------------------------
这个报文从PC1发出,到达交换机后,交换机会将这个报文按照MAC地址表进行转发,从对应的关联接口发出,发到R1的G0/0/0口,然后R1收到了这个报文后会进行解封装,匹配目的MAC是否是自己,是的话接受,然后看目的IP,如果是自己则继续接收解封装,如果不是自己则进行查表转发。查的表为路由表。
路由表中如果有该目的IP的路由项,则从对应的出接口和下一跳转发,若没有这个地址则会进行丢弃。
假设在R1的路由表中有该路由项,那R1会进行匹配出接口和下一跳地址,若下一跳地址不是本地的直连路由,则再以下一跳地址进行再次查表操作,如果下一跳地址是自己的直连路由则根据ARP表找到对端接口的MAC地址直接报文封装进行转发。
这个过程中报文的封装如下:
-----------------------------------------------------------------------------------------------------------------
| 物理层:网线的封装标准和格式 |
| 数据链路层:源MAC:R1的G1口MAC 目的MAC:R2的G0口MAC |
| 网络层封装:源IP:10.0.0.1 目的IP:20.0.0.1 协议:ICMP |
-----------------------------------------------------------------------------------------------------------------
在这个报文地址中源MAC变成了R1的G0/0/1出接口,而目的MAC则变成了对端G0/0/0口的MAC地址,然后进行报文封装发送,当这个报文到达R2时,R2同样会对报文进行目的MAC匹配,是否是自己或者是否能接收。然后收了之后在判断目的IP是否是自己决定下一步操作。如果是自己则接收,如果不是自己则进行查表转发,当发现目的IP是自己的直连接口,那就会直接以目的IP的MAC地址进行报文封装发出,整个过程还是得需要依靠ARP表项进行封装。当报文从R2发出时,封装如下:
-----------------------------------------------------------------------------------------------------------------
| 物理层:网线的封装标准和格式 |
| 数据链路层:源MAC:R2的G1口MAC 目的MAC:PC3的MAC |
| 网络层封装:源IP:10.0.0.1 目的IP:20.0.0.1 协议:ICMP |
-----------------------------------------------------------------------------------------------------------------
如此一来,该报文就能正常的发送到PC3上,然后PC3进行接收,判断目的MAC和目的IP是否是自己,是则接收,不是则丢弃。接收后发现是个ICMP的报文,于是需要回应一个响应包,这个报文的转发流程同PC1发送给PC3的流程一样。