网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!

背景说明:

网络的知识,是大家开发过程中,非常重要也是非常底层的知识。所以网络知识是一个非常、非常核心的面试知识点

在40岁老架构师 尼恩的读者交流群(50+)中,其相关面试题是一个非常、非常高频的交流话题。社群中,还遇到过大概的变种:

形式1:聊聊ARP地址解析协议?

形式2:在浏览器地址栏输入一个 URL 后回车,背后发生了什么?

形式3:…非常多

这些问题,都和三张表有关。

可以说,掌握了三张表,就掌握了网络通讯的核心。

这里尼恩给大家 把网络三张表,做一下系统化、体系化的梳理,使得大家可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”

也一并把这个相关题目以及参考答案,收入咱们的《尼恩Java面试宝典》,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

注:本文以 PDF 持续更新,最新尼恩 架构笔记、面试题 的PDF文件,请从这里获取:码云

首先,说一下网络中的数据包

首先我们需要知道,网络上传输的东西是什么?

在使用TCP/IP协议传输时,网络上的数据,是以二进制数据包的形式传输的,核心的三个部分,如下:

这个数据包,其中有这么几个字段很重要:

  • 源 IP 地址
  • 源 MAC 地址
  • 目标 IP 地址
  • 目标 MAC 地址

这些都是和地址相关的, 就像寄送快递,这就是里边的 收件人电话,收件人地址,有了这个地址信息,对方才能收到这个包。

在网络中,每一台计算机,每一个通讯设备,都有自己的地址,包含 IP 地址和 MAC 地址。

注意: MAC地址 又称为 硬件地址 、 物理地址 (因为这种地址用在MAC帧中)。

为什么需要那么多地址呢?

一个ip地址,还要一个mac地址。

原因是,网络协议是分层的。 不同的地址,给不同的层使用。

  • ip地址,网络层使用,
  • mac地址, 数据链路层使用。

什么是网络层,什么是链路层?

请参见TCP/IP协议与七层ISO模型的对应关系,大致如下图所示:

图:TCP/IP协议与七层ISO模型的对应关系

网络三张表1:ARP表

网络中的三张表ARP表, MAC表, 路由表

先看第一个 ARP表。 提起ARP表必然先想起ARP(address resolution protocol)协议,地址解析协议。

为什么需要 ARP 协议?

链路层中,同一局域网中的一台主机要和另一台主机进行通信,需要通过 MAC 地址进行定位,然后才能进行数据包的发送。

而在网络层中,计算机之间是通过 IP 地址定位目标主机,对应的数据报文只包含目标主机的 IP 地址,而没有 MAC 地址

因此,在发送之前,需要做个翻译的工作:根据 IP 地址获取 MAC 地址。

只有翻译成功,才能将数据包发送到正确的目标主机,而这个获取过程是通过 ARP 协议完成的。

网关设备上的ARP表项

在日常维护工作中,在华为的网关设备上,可以执行display arp相关命令,查看设备上的ARP表项信息。

通过在网关设备上查看ARP表项,网络管理员可以查看下挂用户的IP地址、MAC地址和接口等信息

例如,当网络管理员知道某个用户的IP地址,想查询该用户的MAC地址时,可以通过查看ARP表项信息获取。

用户可以执行display arp all.看到IP-MAC的表项,我们可以看到已知的IP地址的MAC地址是什么,这样很方便我们排查故障

上述回显中,每行ARP表项的具体含义如下:

IP地址为172.16.10.3,MAC地址为0025-9efb-be55,TYPE字段为S(代表该ARP表项为静态ARP表项)。这条静态ARP表项出接口为GE1/0/6,VLAN编号为100。

IP地址为172.16.20.3,MAC地址为0200-0000-00e8,TYPE字段为S(代表该ARP表项为静态ARP表项)。这条静态ARP表项出接口为GE1/0/19。

IP地址为172.16.10.1,MAC地址为0025-9ef4-abcd,TYPE字段为I(代表该ARP表项为接口本身的ARP表项)。这条ARP表项代表IP地址172.16.10.1是接口Vlanif100的IP地址。

IP地址为172.16.10.2,MAC地址为0025-9efb-be55,TYPE字段为D(代表该ARP表项为动态ARP表项)。这条动态ARP表项是从接口GE1/0/6动态学习到的,VLAN编号为100,剩余存活时间为20分钟。

IP地址为172.16.20.1,MAC地址为0025-9ef4-abcd,TYPE字段为I(代表该ARP表项为接口本身的ARP表项)。这条ARP表项代表IP地址172.16.20.1是接口GE1/0/19的IP地址。

IP地址为172.16.20.2,MAC地址为0200-0000-00e8,TYPE字段为D(代表该ARP表项为动态ARP表项)。这条动态ARP表项是从接口GE1/0/19动态学习到的,剩余存活时间为18分钟。
代码转自,华为企业技术文档。

ARP表的使用过程

由于IP协议使用了ARP协议,因此通常把ARP协议划归到网络层。但ARP协议的用途是为了从网络层使用IP地址,解析出在链路层使用的硬件地址。

每一台主机都设有一个ARP高速缓存,里面有本局域网上的各种IP地址到MAC硬件地址的映射表(ARP表),表里面的内容由ARP协议进行动态更新。

ARP表内的数据会老化,达到老化时间会自动删除,在此通信时,由ARP协议重新添加。

有PC0,PC1两台主机

PC0向PC1发送一个ping报文,向PC0输入1.1.1.3 然后开始发送,PC0先查询本地APR表查询1.1.1.3对应MAC地址,但并没查到,这种情况PC0在本局域网上广播发送一个ARP请求分组。ARP请求分组的主要内容是:

我的IP地址是1.1.1.2,硬件地址是xx-xx-xx-xx-xx-xx。我想知道IP地址为1.1.1.3的主机的硬件地址。

在本局域网上的所有主机上运行的ARP进程都会收到此ARP请求分组。PC1的IP地址与ARP请求分组中要查询的IP地址一致,就收下ARP请求分组,并向PC0发送ARP响应分组,同时在这个ARP响应分组中写入自己的硬件地址。其余主机ip地址都与ARP请求要查询的ip地址不一致,不做任何回应。
响应内容为:

我的ip地址是1.1.1.3,我的硬件地址是xx-xx-xx-xx-xx-xx

虽然ARP请求分组是广播发送的,但ARP响应分组是普通的单播,即从一个原地址发送到一个目的地址。

接下来PC0就可以使用刚获取的PC1MAC地址,进行icmp数据发送。

网络三张表之2:MAC表

首先,来看交换机是怎么进行数据转发的。

交换机是怎么进行数据转发的

MAC表工作在链路层,主要给 交换机用的。

一个局域网的主机设备,多了以后,需要通过交换机, 组织和管理起来。

主机设备接到 交换机的端口上。

交换机内部维护一张 【MAC 地址表】,记录着每一个 MAC 地址的设备,连接在哪一个端口上。

  • 如果发来的包首部中包含的目标 MAC 地址在 MAC 地址表中没有映射关系,交换机就将此包广播给所有端口,也即发给了所有机器;
  • 如果地址表有映射,那就只发给那一个端口

比如主机 A 想要给 主机C 发送消息,就需要用到mac表。

但是,注意一下,一开始交换机的 MAC 地址表是空的,交换机并不知道 C 的端口号,因此 A 发送的消息将会被广播, 同时,A 的 MAC 地址和它对应的端口号会被记录到 MAC 地址表中。

具体如下图:

C收到广播之后,发现是发给自己的,就对A进行回复。

C 对 A 的消息进行响应的时候,交换机就不需要进行广播消息了,因此它已经知道 A 计算机在哪个端口了,并且同样的,C 的 MAC 地址和它对应的端口号会被记录到交换机的 MAC 地址表中。

C 通过交换机给 A 发送消息,此时 MAC 地址表中含有 A 的信息

MAC表的数据内容

MAC表放在了另一个层级,数据链路层

如上图所示,mac 表这样设计的。交换机内部维护一张 MAC 地址表,记录着每一个 MAC 地址的设备,连接在其哪一个端口上。

MAC 地址端口
bb-bb-bb-bb-bb-bb1
cc-cc-cc-cc-cc-cc3
aa-aa-aa-aa-aa-aa4
dd-dd-dd-dd-dd-dd5

假如你仍然要发给 B 一个数据包,构造了如下的数据结构从网口出去。

MAC表的使用过程

交换机是根据MAC地址转发数据帧的。

当PC0发送ARP数据包,交换机会把数据包发往PC0之外的所有主机,并在相应包中记录下相应Mac地址与接口数据。

当PC0向PC1发送一帧数据,从1口进到交换机。交换机收到帧后,根据帧中的目的MAC先查本地MAC表,没有查到应从哪个接口转发这个帧。

接着,交换机把这个帧的源MAC和接口1写入交换表中,并向除1以外的所有接口广播这个帧,PC2将此广播帧丢弃,因为目的地址不对。

PC1收下这个目的地址是自己MAC的数据,并回应数据包,此时交换机会把PC1的MAC和对应接口2写入表中。然后当PC0与PC1再次发送数据交换机可以根据目的MAC查表找出对应的接口,将数据包直接送达对应的主机。

考虑到有可能在交换机的接口更换主机,或者主机要跟换主机更换网卡,这时交换机中MAC表也是动态的、有自己的老化时间,会自动删除相关数据。

当交换机中一台主机突然从2口切换到3口,交换机收到的此主机的数据仍然会发送到原端口2口就会出现超时情况,直到Mac中数据更新,或者手动把交换机断电重启重更新Mac表数据。

网络三张表之3:路由表

说起路由表,就不得不提起路由器

路由器是一种具有多个输入端口和多个输出端口的专用设备也可称为计算机。其任务是转发分组。

路由器结构由两部分组成:路由选择部分和分组转发部分。

说明: 此处的路由器与家用路由器略有不同,家用路由器集成了路由器和交换机的功能为了,更方便用户使用

路由表的起源

前面的mac表,是因为 局域网内的 主机多了, 被逼出来对主机进行 分组管理的。相当于按照 端口,对主机分组管理。

路由表怎么来的呢? 也是被逼的。但是这一次,是被IP地址逼的。

当IP地址多了之后, 需要划分子网,路由器的根本目标,就是解决跨子网IP之间的路由。

而跨子网IP之间的路由, 是通过 路由表完成的。

这里有点复杂,先从网关开始说起。

网关的由来

有了子网之后,每个子网,有一个网关,相当于子网的总代理

所有的报文,需要进行这个 子网网关的 转发。

有了网关之后, A 在自己电脑里配置的一个网关 IP 地址,以便在发给不同子网的机器时,发给这个 网关IP 地址, 由这个网关转发。

有了这个代理之后, 数据包的转发规则如下:

  • 如果源 IP 与目的 IP 处于一个子网,直接将包通过交换机发出去。
  • 如果源 IP 与目的 IP 不处于一个子网,就交给路由器去处理。

怎么知道,两个IP在同一个子网呢?

比如,我们希望达到下面的目标:

  • 192.168.0.1 和 192.168.0.2 处于同一个子网
  • 192.168.0.1 和 192.168.1.1 处于不同子网

那么,我们可以认为的规定一个规则:

  • 以 192.168.0.xxx 开头的,就算是在一个子网
  • 否则就是在不同的子网。

192.168.0.xxx 开头的,就算是在一个子网,否则就是在不同的子网。

那对于计算机来说,怎么表达这个意思呢?于是人们发明了子网掩码的概念

在上面的规则中,咱们的子网掩码定为 255.255.255.0

计算的时候,将源 IP 与目的 IP 分别同这个子网掩码进行与运算

  • 相等则是在一个子网,
  • 不相等就是在不同子网,就这么简单。

比如

  • A电脑:192.168.0.1 & 255.255.255.0 = 192.168.0.0
  • B电脑:192.168.0.2 & 255.255.255.0 = 192.168.0.0
  • C电脑:192.168.1.1 & 255.255.255.0 = 192.168.1.0
  • D电脑:192.168.1.2 & 255.255.255.0 = 192.168.1.0

那么 A 与 B 在同一个子网,C 与 D 在同一个子网,但是 A 与 C 就不在同一个子网,与 D 也不在同一个子网,以此类推。

所以如果 A 给 C 发消息,A 和 C 的 IP 地址分别 & A 机器配置的子网掩码,

  • 发现相等,网关就把 数据发给 C
  • 发现不相等,网关则 A 认为 C 和自己不在同一个子网,于是把包发给路由器,就不管了,之后怎么转发,A 不关心

接下来,工作交个路由器。

路由器怎么进行跨子网的路由

现在 A 要给 C 发数据包,已经可以成功发到路由器这里了,

问题就是,路由器怎么知道,收到的这个数据包,该从自己的哪个端口出去,才能直接(或间接)地最终到达目的地 C 呢。

路由器收到的数据包有目的 IP 也就是 C 的 IP 地址,需要转化成从自己的哪个端口出去,很容易想到,应该有个表,就像 MAC 地址表一样。

这个表就叫路由表

和 MAC 地址表的不同的是,路由表并不是一对一这种明确关系,我们下面看一个路由表的结构。

目的地址子网掩码下一跳端口
192.168.0.0255.255.255.00
192.168.0.254255.255.255.2550
192.168.1.0255.255.255.01
192.168.1.254255.255.255.2551

我们学习一种新的表示方法,由于子网掩码其实就表示前多少位表示子网的网段,所以如 192.168.0.0(255.255.255.0) 也可以简写为 192.168.0.0/24

目的地址下一跳端口
192.168.0.0/240
192.168.0.254/320
192.168.1.0/241
192.168.1.254/321

这就很好理解了,路由表就表示,192.168.0.xxx 这个子网下的,都转发到 0 号端口,192.168.1.xxx 这个子网下的,都转发到 1 号端口

配合着结构图来看(这里把子网掩码和默认网关都补齐了)

表中的下一跳列 还没有值,在这里不重要,重要的是,咱们理解了路由表的核心。

路由表的使用过程

路由器工作在网络层,主要功能就是实现跨网段传输数据。

如上图:一网段的主机要与其他网段的主机通信,则数据会先发送给指定的网关,也就是路由器,由路由器选择网段继续通信,所以发送的数据包起始中网络层的ip地址不变,源ip地址就是当前主机的ip地址,目的ip地址就是不同网段的主机的ip地址,但是链路层由于数据要先发给路由器,那么目的mac就是路由器的mac地址,然后路由器选择其他网段,则源mac变成路由器另一个网口的mac地址,目的mac就是目标主机的mac地址,所以整个过程网络层的一直不变,但是链路层一直再变

如上图: 由于现在是两台路由器和两个网段的主机,所以需要构成三个局域网,当源主机跨网段与目标主机通信时,由于网段不同,数据会先发送给路由器,然后路由器再选择对应的目的网段,但是此时路由器另一端所在的网段与之目标主机的网段不同,所以无法继续向下发送,此时需要设置下一跳,下一跳的目的就是指定当前自己网段的主机要访问其他网段的主机时从这个路由器应该跳到哪个路由器,只要设置了,就可以直接发送数据到指定的路由器,整个过程就完成
1、 当网络中有多个路由器是,两个主机需要通信路由器需要记录下一跳信息,下一跳的目的就是指定当前自己网段的主机要访问其他网段的主机时从这个路由器应该跳到哪个路由器

2、 路由表记录着下一跳。

路由表中记录着不同网段的信息。路由表中记录的信息有的需要手动添加(称为静态路由表),通过路由协议自动获取的(称为动态路由表),我们的主机直接连到路由器上(中间无三层网络设备)这种情况是直连路由,属于静态路由。

路由选择处理机的任务是根据所选定的路由选择协议(路由协议后续在做总结)构造出路由表,同时经常或定期和相邻路由器交换路由信息而不断地跟新和维护路由表。

面试题:聊聊ARP地址解析协议

1:首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。

2:当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机IP地址,源主机MAC地址,目的主机的IP地址。

3:当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址。

4:源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。

注意:广播发送ARP请求,单播发送ARP响应。

说在最后:

尼恩说明: 其他的网络面试题这里不多说,具体请参见《尼恩Java面试宝典》网络协议面试专题,有几十道相关的面试题。

前面已经 给大家通过系列文章,实现了多个自由:

响应式 编程自由响应式圣经:10W字,实现Spring响应式编程自由

本地缓存 自由Caffeine 源码、架构、原理(史上最全,10W字 超级长文)

红黑树 自由红黑树( 图解 + 秒懂 + 史上最全)

DDD 自由阿里一面:谈一下你对DDD的理解?2W字,帮你实现DDD自由

Disruptor 自由:《队列之王: Disruptor 原理、架构、源码 一文穿透

还需要啥自由,可以告诉尼恩。 尼恩帮你实现…

推荐阅读:

Linux命令大全:2W多字,一次实现Linux自由

收个滴滴Offer:从小伙三面经历,看看需要学点啥?

1000亿数据、30W级qps如何架构?来一个天花板案例

美团2面:如何保障 MySQL 和 Redis 数据一致性?这样答,让面试官爱到 死去活来

吃透8图1模板,人人可以做架构

干翻 nio ,王炸 io_uring 来了 !!(图解+史上最全)

SpringCloud+Dubbo3 = 王炸 !

4次迭代,让我的 Client 优化 100倍!泄漏一个 人人可用的极品方案!

100亿级订单怎么调度,来一个大厂的极品方案

阿里一面:你做过哪些代码优化?来一个人人可以用的极品案例

网易二面:CPU狂飙900%,该怎么处理?

阿里二面:千万级、亿级数据,如何性能优化? 教科书级 答案来了

峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?

场景题:假设10W人突访,你的系统如何做到不 雪崩?

2个大厂 100亿级 超大流量 红包 架构方案

Nginx面试题(史上最全 + 持续更新)

K8S面试题(史上最全 + 持续更新)

操作系统面试题(史上最全、持续更新)

Docker面试题(史上最全 + 持续更新)

Springcloud gateway 底层原理、核心实战 (史上最全)

Flux、Mono、Reactor 实战(史上最全)

sentinel (史上最全)

Nacos (史上最全)

TCP协议详解 (史上最全)

分库分表 Sharding-JDBC 底层原理、核心实战(史上最全)

clickhouse 超底层原理 + 高可用实操 (史上最全)

nacos高可用(图解+秒懂+史上最全)

环形队列、 条带环形队列 Striped-RingBuffer (史上最全)

一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之间混乱关系(史上最全)

单例模式(史上最全)

分布式事务 (秒懂)

缓存之王:Caffeine 的使用(史上最全)

Java Agent 探针、字节码增强 ByteBuddy(史上最全)

Docker原理(图解+秒懂+史上最全)

Redis分布式锁(图解 - 秒懂 - 史上最全)

Zookeeper 分布式锁 - 图解 - 秒懂

Zookeeper Curator 事件监听 - 10分钟看懂

Netty 粘包 拆包 | 史上最全解读

Netty 100万级高并发服务器配置

Springcloud 高并发 配置 (一文全懂)

  • 4
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值