※ 首先要了解
① 源主机在发起通信之前,会将自己的IP与目的主机的IP进行比较,如果两者位于同一网段(用网络掩码计算后具有相同的网络号),那么源主机发送arp请求广播报,请求目的主机的mac地址,在收到目的主机的ARP应答后获得对方的物理层(MAC)地址,然后用对方MAC作为报文的目的MAC进行报文发送。位于同一VLAN(网段)中的主机互访时属于这种情况,这时用于互连的交换机作二层交换转发;
② 当源主机判断目的主机与自己位于不同网段时,它会通过网关(Gateway)来递交报文,即发送ARP请求来获取网关IP地址对应的MAC,在得到网关的ARP应答后,用网关MAC作为报文的目的MAC进行报文发送。
注:
对位于同一子网,即同一网段(不需要经过路由,所以是二层转发);
而对于位于不同子网,即不同的网段(必须经过路由器,所以该数据报文先经过三层路由转发)
那三层转发和二层转发有什么区别呢?
1.数据转发依靠的关键字不同,二层转发主要依靠MAC地址,而三层转发主要依靠IP地址。
2.数据交换的范围不同,二层交换指在同一网段内的通信,三层交换指跨网段的通信。
3.在三层转发的过程中,还要进行二层的封装。也就是说,在三层转发过程中二层帧头中的(源、目的)MAC地址是要改变的。但是IP数据报中的源IP和目的IP地址是不会改变的
下面主要以三层转发为例,做一个详细的说明和梳理。
1. 概述
如图1所示,交换机Router,SW1,SW2的所有表项为空,Host 1要ping Host 2,即Host 1要给Host 2发送ICMP echo请求,Host 2收到请求之后,发现是请求自己的IP地址,会回复ICMP echo应答报文。
图1 网络拓扑图
Host 1的IP地址为1.1.1.1/24,默认网关为1.1.1.254,MAC地址为ca02.1a14.0000;
Host 2的IP地址为2.2.2.2/24,默认网关为2.2.2.254,MAC地址为ca03.1a14.0000;
Router的fa0/0口的IP地址为1.1.1.254/24,MAC地址为ca06.1b2c.0008;
Router的fa0/1口的IP地址为2.2.2.254/24,MAC地址为ca06.1b2c.0006。
注:由此可以看出路由器可以具有多个ip地址和多个mac地址;
并且主机的网关一般来说就是与路由器相连的端口的ip;
2. 三层转发的整个过程
2.1 Host 1的ARP请求
Host 1将ICMP echo请求报文,封装到源IP地址为1.1.1.1,目的IP地址为2.2.2.1的IP报文中。然后查询Host1的路由表,准备将报文发送给Host 1的默认网关1.1.1.254。由于Host 1没有其默认网关的MAC地址,因此Host 1会将该报文存到内存,先发送ARP请求来获取MAC地址。
Host 1将源物理地址为ca02.1a14.0000,源协议地址为1.1.1.1,目的物理地址填充00:00:00:00:00:00,目的协议地址为1.1.1.254的ARP请求,封装在源MAC地址为ca02.1a14.0000,目的MAC地址为ffff.ffff.ffff的以太网帧发出,如图2所示。
图2 ARP请求
2.2 SW1学习MAC地址
Sw1收到该帧广播,同时将ca02.1a14.0000与自身的1端口关联起来,加入到交换机的MAC地址表中。
2.3 Router的ARP应答
Router收到这个帧之后,去掉二层封装,查看到ARP请求中的目的协议地址为fa0/0口地址,会发送 响应物理地址为ca06.1b2c.0008,响应 协议地址为1.1.1.254,目的MAC地址ca02.1a14.0000,目的IP地址1.1.1.1的ARP应答,封装在源MAC地址为ca06.1b2c.0008,目的MAC地址为ca02.1a14.0000的以太网帧中发出,如图3所示。
图3 ARP应答
同时Router也会将物理地址ca02.1a14.0000与IP地址1.1.1.1存入到自己的ARP表中,如图4所示。
图4 Router的ARP表
2.4 SW1学习MAC地址
Sw1收到帧之后,查询MAC地址表,将帧从1口发出,同时将ca06.1b2c.0008地址与2口关联,加入到MAC地址表中。
2.5 ICMP echo请求
Host 1收到Router发送的ARP应答之后,会将物理地址ca06.1b2c.0008与IP地址1.1.1.254存入到自己的ARP表中,如图5所示。
图5 Host 1的ARP表
Host 1会调出ICMP echo请求,封装成源MAC地址为ca02.1a14.0000,目的MAC地址为ca06.1b2c.0008的数据帧(注意此处的目的MAC设成了路由器的 fa0/0口的MAC),发送给Router,如图6所示。
图6 ICMP echo请求
Router的fa0/0收到该报文,查找本地路由表,判断目的IP是否和自己IP处于同一网络,发现Host 2的IP和自己接口fa0/1的IP为同一网段,则Router会将该报文从fa0/1发送给Host 2。但由于Router的fa0/1口没有2.2.2.2的MAC地址,只能先进行ARP请求。
2.6 Router的ARP请求
Router会将源物理地址为ca06.1b2c.0006,源协议地址为2.2.2.254,目的物理地址填充全0,目的IP地址为2.2.2.2的ARP请求,封装在源MAC地址为ca06.1b2c.0006,目的MAC地址为ffff.ffff.ffff的以太网帧从fa0/1口广播出去。
2.7 SW2学习MAC地址
Sw2收到该帧之后会将该帧广播,同时将ca06.1b2c.0006与1口关联,加入到MAC地址表。
2.8 Host 2的ARP应答
Host 2收到ARP请求之后,会将响应MAC地址ca03.1a14.0000,响应IP地址2.2.2.2,目的MAC地址ca06.1b2c.0006,目的IP地址2.2.2.254的ARP应答,封装在源MAC地址为ca03.1a14.0000,目的MAC地址为ca06.1b2c.0006的以太网帧中发出。同时也将物理地址ca06.1b2c.0006与IP地址2.2.2.254关联起来,存入到自己ARP表中。
2.9 SW2学习MAC地址
Sw2收到帧之后,查询MAC地址表,将帧从2发出,同时将ca03.1a14.0000地址与1口关联,加入到MAC地址表中。
Router获到Host 2给他的ARP响应之后,会将物理地址ca03.1a14.0000与IP地址2.2.2.2关联,并且加入到ARP表中。这时,Router将刚才的ICMP echo报文转发给Host 2。
2.10 ICMP echo应答
Host 2收到由Host 1发送的ICMP echo请求之后,会将ICMPecho应答封装在源IP地为2.2.2.1,目的IP地址为1.1.1.1的IP报文中,发送给Host 1。
Host 1收到Host 2发送的ICMP echo应答,此次ping的过程结束,如图7所示。
图7 ICMP echo应答
再上一个简洁点的例子
三层转发举例
PC1准备向PC2发送数据包
(1) PC1检查报文的目的IP地址,发现和自己不在同一网段,则需要进行三层转发,通过网关转发报文信息;
(2) PC1检查自己的ARP表,发现网关的MAC地址不在自己的ARP表里;
PC1向Router发起arp请求(目的是获取网关的mac地址)
(3) PC1——>Router(网关)发出ARP请求报文;
(4) Router将PC1的MAC地址学习到自己的ARP表,
(5) Router(网关)——>PC1发出ARP应答报文;
(6) PC1学习到Router(网关)的mac地址,发出报文,此时源ip、目的ip不变,目的mac为Router(网关)的mac
(7) PC1——> Router(网关)发出报文。
(8) Router(网关)收到报文,发现是三层报文(原因是报文的目的mac是路由器自己的mac了,而二层转发根本就不需要经过路由器)
(9) Router(网关)检查自己的路由表(FIB),发现目的ip在自己的直连网段
(10)Router检查自己的arp表,如果发现有与目的ip对应的mac地址则直接封装报文(目的ip、源ip不变,目的mac为查arp表所得mac)发送给PC2
(11) 如果查ARP表没有得到与目的ip对应MAC,则重复(3)发arp请求
(12) PC2收到ARP广播报文,发现目的IP是自己的IP,于是给Router发送ARP应答报文。报文中会附上自己的mac地址。
(13) Router收到应答报文后,目的mac改为PC2的mac,然后向PC2发送数据帧。
(14) PC2向Router发送报文
(15) Router收到报文后,向PC1转发报文