二层&三层转发原理
ARP-地址解析解析
ARP是通过已知的IP地址获取相对应的MAC地址的协议。
如果本地没有目的的MAC地址,则通过发送ARP广播来学习:二层头部中目的MAC是全1,二层到三层之间ARP头部中的目的MAC是全0。
但对方回应的是ARP单播。
二层转发
同一网段(同一广播域)内的通信为二层通信。
比如一台交换机上连接的两台设备(Host1 Host2)之间的通信。
第一次通信时,Host1在封装数据包时,发现Host2的IP地址和自己的IP地址在同一网段。
就采取二层通信过程,第二层数据包封装时,会封装Host2的MAC地址,于是查看本地的ARP表。发现没有Host2对应的表项。
于是向交换机发送一个ARP广播,第三层头部目的IP为Host2的IP地址,第二层头部目的mac为1,同时,加上ARP头部封装在二层到三层之间,ARP头部的目的mac为全0.
交换机在收到Host1的数据包时,会根据接受数据包的源端口和源mac地址,更新/新增一条表项到交换机的mac地址表。
比如图中的就是GE 0/0/1 3C-52-82-49-7E-9D(Host1的mac地址)
交换机根据目的mac查找mac地址表,发现目的IP是全1,即广播,于是把Host1发来的数据包复制转发到除接收端口以外的其他所有已激活端口上,又称泛洪。
与交换机相连的已激活端口上的设备收到这个广播包时
根据目的IP判断:如果目的IP是自己,就回应一个ARP单播数据包;如果目的IP不是自己的IP,就丢弃数据包,不做任何操作。
只有Host2收到数据包时,发现目的IP是自己的IP,于是Host2收到数据包时,
根据源IP和源IP更新自己的ARP表项:新增一条Host1的IP-MAC表项。后续Host2向Host1发送数据包时,就可以根据这个表项来封装二层、三层的目的IP和MAC。
然后回应一个ARP单播包:源IP源MAC是Host2自己的IP和MAC,目的IP和目的MAC是Host1的IP和MAC。
交换机收到这个数据包时,会根据源MAC地址和接收到这个数据包的端口来新建一条MAC地址表项:GE0/0/2 48-A4-72-1C-8F-4F。
之后如果有数据包的目的MAC是Host2时,直接把数据包通过GE0/0/2转发给Host2即可。
交换机查看目的MAC,发现是Host1,根据已有的MAC地址表项,将数据包通过GE 0/0/1发送给Host1。
Host1接受到数据包,根据源IP和目的IP判断出这个是Host2回应给自己的数据包,
于是,根据源MAC地址,更新自己的ARP表项:新建一条Host2的IP和MAC对应的ARP表项。
然后Host1与Host2通信时,就根据本地的ARP表项来封装二层和三层的头部。
交换机转发
从上面的交换机转发过程可知,交换机是根据源MAC和接受数据包的源端口来更新/新增MAC地址表项,并根据MAC表来转发数据包的。
- 广播帧
如果接受的是广播包,在学习源MAC和源端口后,将这个数据包泛洪到其他所有端口。 - 未知单播帧
在学习源MAC和源端口后,收到的数据包中目的MAC在本地找不到对应的MAC地址表项,也是将这个数据包泛洪到其他所有端口。 - 已知单播帧
收到数据包后,在学习源MAC和源端口后,目的MAC在本地有对应的MAC地址表项,于是根据MAC地址对应表项,将数据转发给对应的端口即可。
三层转发
如果将上层的交换机换成路由器,那么Host1与Host2之间的通信即为三层通信了。这个图中路由器与Host之间的端口为Host的网关。
第一次通信时,Host1向Host2发送数据包,根据目的IP判断,Host2和自己不是同一网段(广播域),也没有对应的ARP表项。
Host1不能通过ARP广播来学习Host2的MAC地址,以为路由器会隔离广播域,广播数据包到达网关就不会转发出去了。
但是跨网段的数据包,下一跳必然是网关。于是,Host1在封装数据包时,目的IP是Host2的IP,但是目的MAC是网关的MAC。
这样网关接收到数据包后,解封装到第二层时,发现目的MAC是自己,于是继续解封装,打开第三层头部发现目的IP是Host2的IP。
路由器查看本地路由表,发现Host2对应的网段与自己相连,于是通过GE0/0/2转发。并且通过查看ARP表项,封装目的MAC为Host2的MAC。
此时,目的IP是Host2,目的MAC是Host2的MAC地址。源IP和源MAC不变。
Host2收到数据包后,发现目的MAC和目的IP是自己,于是根据源IP和源MAC更新本地ARP表项,
并且回应数据包:源MAC和源IP是自己,目的IP和目的MAC是Host1.