『 Linux 』数据链路层 - ARP协议及数据链路层周边问题
文章目录
- ARP协议
- ARP欺骗
- RARP协议
- DNS服务
- ICMP协议
- ping 命令
- 正向代理服务器
- 反向代理服务器
ARP协议
博客『 Linux 』数据链路层 - MAC帧/以太网帧中提到,当数据需要再数据链路层进行无网络传输时需要封装为MAC帧,而MAC帧的报文结构如下:
帧头部分存在两个字段分别为 “目的地址” 和 “源地址” ;
而在MAC帧中的地址字段为MAC地址,这意味着必须存在目的MAC地址时封装为MAC帧的数据才能正确到达对方主机;
在上篇博客中提到需要通过路由表找到对端地址,事实如此,但不全面;
路由表所能找到的地址为IP地址,需要通过一种特定的形式菜农获取到对应的MAC地址,这种方式即为 “ARP请求/响应” ;
ARP通常工作在数据链路层,位于IP协议的下层,MAC帧的上层;
ARP报文格式如该图所示;
-
硬件类型
硬件类型指示使用的网络硬件类型,以太网的值为
1
; -
上层协议类型
协议类型指示要解析的协议地址类型,这里指的是要转换的地址类型,对
IPv4
而言值为0x0800
; -
MAC地址长度
指定硬件地址的长度,在以太网上MAC地址长度为
6 byte
; -
IP地址长度
指定协议地址的长度,以字节为单位,
IPv4
地址长度为4byte(32bit)
; -
操作类型
指示请求或响应的类型,常见的操作码包括:
-
1
: ARP请求 -
2
: ARP响应
-
-
源MAC地址
发送方的MAC地址;
-
源IP地址
发送方的IP地址;
-
目的MAC地址
表示目标设备的MAC地址;
通常情况下该ARP报文作为请求发出时该字段通常为
FF:FF:FF:FF:FF:FF
,表示广播到当前局域网内的所有设备;作为响应发出时该字段为具体MAC地址(源发送端的MAC地址),通常作为响应发回时表示ARP请求已经获取到了对应设备的MAC地址,只需要将MAC地址返回即可;
-
目的IP地址
表示接收方的IP地址;
实际上一个包含数据的MAC帧在经过一个设备发往另一个设备时需要知道对端的具体的MAC地址,而在网络层IP协议对应的路由表中只能查到对端的IP地址;
因此通常情况下包含数据的MAC帧需要在发送前先发送一个具有对端IP地址的ARP协议报文,即ARP请求;
这个ARP请求对应的IP地址字段包含着下一跳(Next Hop)目标端的IP地址,对应的MAC地址通常情况为FF:FF:FF:FF:FF:FF
表示广播到当前局域网内的所有设备;
这个ARP请求同样会经过以太网协议封装为对应的MAC帧,对应的系统在使用ARP进行查询时默认会在封装MAC帧时将对应的目的MAC地址字段也填充为FF:FF:FF:FF:FF:FF
表示广播;
当该MAC帧发送后,由于是广播发送,故当前局域网内的所有设备都会受到该封装ARP请求的MAC帧;
当设备接收到对应的MAC帧后查询MAC帧帧头中的目的MAC地址为FF:FF:FF:FF:FF:FF
广播,解包MAC帧,并且根据类型为0x0806
(表示ARP报文)交付给上层的ARP协议,ARP协议本身就是用于负责IP地址与MAC地址之间的转换工作,故其内置有对应的地址;
ARP协议查看ARP报头识别操作类型为1
,表示为请求,对应的查询该ARP请求中的目标端IP地址是否与本设备的IP地址相同,这里有两种情况:
-
目标端IP地址与本端IP地址不同
当比对后发现ARP请求中目标端IP地址与本端IP地址不同时则丢弃该报文,不做任何响应;
-
目标端IP地址与本端IP地址相同
当比对后发现ARP请求中目标端IP地址与本端IP地址相同时则返回一个ARP响应,这个ARP响应操作类型为
2
,表示响应;对应的源MAC地址字段即为本端设备的MAC地址,源IP地址即为本端设备的IP地址(与所接收的ARP请求中的目的IP地址字段相同);
此时的目的MAC地址字段则不是广播,而是源发送端的MAC地址,是一个具体的MAC地址,对应的目标端IP地址则为源发送端的IP地址;
随后同样的封装为MAC帧并且发回源发送方;
由于发出ARP响应的一端在对ARP响应进行封装为MAC帧时对应的MAC地址填充为源发送方的MAC地址,故即使其他设备接收到了该MAC帧也会因为MAC地址不同而丢弃该MAC帧;
当源发送方接收到包含ARP响应的MAC帧时,将在以太网协议中对MAC帧进行解包,其对应的协议类型为0x0806
表示ARP报文从而交付给上层ARP协议完成分用;
ARP协议接收到该ARP报文时将检查操作类型字段,其为2
表示响应;
在确认该ARP报文为响应后,将会检查包含在其中的IP地址和MAC地址,并将ARP响应中的IP地址和MAC地址作为映射关系写入本地的ARP缓存中,通常这个映射信息会有一个TTL
(生存时间)来定期刷新这些数据(可利用arp -a
等命令来查看当前机器中的ARP缓存);
当一个IP数据包要被封装为MAC帧并进行发送时,系统将会查询ARP缓存,以确定目标IP地址对应的MAC地址;
一旦找到目标MAC地址,以太网层就可以用这个MAC地址填入MAC帧中的目的MAC地址字段来封装,并通过网络发送;
-
值得注意的一点是
无论何时在需要发送IP数据包时,系统都将先查询ARP缓存中是否存有对应IP地址的MAC地址的映射;
如果ARP缓存命中(找到对应的MAC地址映射),系统则立即用该MAC地址来封装IP数据包为MAC帧并通过网络接口发出;
若是ARP缓存未命中(未找到对应MAC地址映射),系统则生成并发送一个ARP请求以获得该IP地址对应的MAC地址,并将该IP数据包临时放置在一个等待队列中(确保在等待ARP响应期间不因该IP报文的未发出而阻塞导致其他IP数据包无法发送从而影响网络通信效率);
当接收到一个ARP请求,并且ARP缓存被更新时,系统会立即取出等待队列中的所有IP数据包(通常取出方式为
FIFO
,也可能用其他策略,如批量处理或是根据已解决的IP地址将队列中的所有对应目标的数据报一次性提取出来进行处理)并尝试进行发送,没有成功发送出去的IP数据包会重新被放置进等待队列中;重新被放置进等待队列中的IP数据包将会根据对应的IP地址再次发起一轮ARP请求;
如果在一定时间内尚未收到ARP响应,系统可能会重发ARP请求若干次,若多次请求无果,则最终可能丢弃这些待发送的IP数据包并向上层协议报告发送失败;
ARP欺骗
通常情况下,当一台设备接收到一个ARP响应后将会更新对应的ARP缓存(ARP缓存MAC地址与对应IP地址的映射);
当设备接收到多个ARP应答时其ARP缓存将会更新为最新的ARP响应中的映射关系;
但当一台中间设备尝试伪造ARP响应发送给当前局域网内的另一台设备时对应的设备也会更新对应的ARP缓存;
以该图为例;
在图中一共有三台设备,分别为主机A,路由器B以及主机C;
其中三台设备在同一局域网内,对应的路由器B连接着其他局域网,能够与公网进行相连接(间接);
主机A在发送一个IP数据包前将会查看ARP缓存,当ARP缓存未命中时将会与对应设备进行一次ARP请求与响应;
此时主机A与路由器B进行了一次ARP的请求与响应,对应的主机A将会更新ARP缓存;
但在同一期间内,即在与路由器B进行一次ARP交互并更新了ARP缓存后主机C通过某种方式向主机A发送若干个伪造的ARP响应;
在主机A收到的若干个ARP响应后ARP缓存将会以最先的ARP响应为准,对应的伪造的ARP响应的IP地址为路由器B的IP地址,而对应的MAC地址为主机C的MAC地址;
由于ARP缓存被污染,主机A将会错把主机C当做是路由器B对其进行数据发送;
其中主机C即为中间人,这种方式也被称为中间人攻击;
中间人可以选择仅仅窃听,修改,转发,阻止流量或是重定向流量等操作;
在进行窃听时主机C可以通过同样发送伪造ARP报文的方式欺骗路由器B达成双向欺骗;
RARP协议
RARP协议与ARP协议在同一层,同样的工作在数据链路层中;
与ARP协议不同的是,RARP协议用于已有MAC地址但不知IP地址的情况,即MAC地址转IP地址;
通常在这种情况时局域网中通常会有设备具有RARP服务,这样的机器被称为RARP服务端;
在RARP服务端中配置了一个RARP对应的映射表,同样用来映射MAC地址和IP地址;
因为RARP客户端(发送端)无法判断局域网内哪些设备具有RARP服务或是对应的RARP服务能够给予RARP客户端对应的IP地址,因此RARP协议需要进行广播请求;
通常情况RARP协议在以下情况会进行广播请求:
-
无IP地址的初始状态
当设备启动兵没有配置静态IP地址时,通常可能需要通过网络协议动态获取IP地址;
在这种情况下设备知道自己的MAC地址但不知道自己应该使用哪个IP地址;
-
首次连接网络
当一台新设备首次连接到网络且没有任何之前的配制记录时需要通过RARP请求来获取IP地址;
-
重置或启动后
在设备被重置或者重启后,如果不保存IP地址信息,设备再次启动后可能需要通过RARP广播请求来重新获取IP地址;
RARP协议因为一定的局限性已经逐渐被其他协议取代;
现代网络大多采用DHCP,因为它不仅可以动态分配IP地址,还能够提供其他配置信息,如子网掩码,网关,DNS服务器等;
DNS服务
域名系统(Domain Name System, DNS)是一个将人可读的域名转换成计算机可理解的IP地址;
如一般以人为视角看到的域名可能为example.com
样式的域名,而计算机并不一定能理解这个域名如何解析,而DNS就是负责将这样的域名转化为计算机可读的域名,即IP地址;
DNS的目的是为了用户能够更好的记住域名使得能够找到对应的服务器从而提供对应的服务;
通常一个域名有三个部分组成,以www.baidu.com
为例:
-
com
一级域名,表示这是一个企业域名,同级的还有
net
(网络提供商),org
(非盈利组织)等; -
baidu
二级域名,通常表公司名或是具有企业组织标志性元素的名字;
-
www
是一种习惯用法,之前大部分用户在使用域名时,往往命名成类似于
ftp.xxx.xxx/www.xxx.xxx
的格式,来表示主机支持的协议;
其工作步骤为如下:
-
用户请求
用户在浏览器中输入一个地址,如
www.example.com
; -
本地缓存查找
客户端计算机先检查自己的DNS缓存中是否存在对应域名于IP地址映射的缓存记录,如果有则直接使用该IP地址进行访问;
-
查询本地DNS服务器
如果本地缓存没有记录,计算机将会请求发送到配置好的DNS服务器(通常是通过DHCP得到的);
这个服务器检查其缓存,如果有该域名的记录,则直接返回;
-
递归查询
如果本地DNS服务器无法解析,将向根域名服务器请求信息;
如果服务器返回该域名的顶级域(TLD)服务器的地址,如
.com
TLD服务器;本地服务器则继续询问TLD服务器,获取该域名对应的权威DNS服务器地址;
本地服务器最终查询权威DNS服务器,得到该域名的IP地址;
-
返回结果
本地DNS服务器将结果缓存并返回给客户端;
-
缓存过期
DNS记录会有一个TTL(生存时间),控制缓存记录的有效期;
过期后需要重新进行解析;
ICMP协议
ICMP协议(Internet Control Message Protocol, 互联网控制消息协议) 是一种网络层协议, 用于在IP网络中传递控制和错误信息;
工作在网络层,位于IP协议的上层,TCP/UDP协议的下层;
主要作用在于报告网络故障,测试网络连接性,诊断问题以及在路由和数据传输中提供反馈;
ICMP通常分为两类报文:
- 通知出错原因
- 用于诊断查询
其类型与对应内容为如下:
ICMP协议主要功能为如下:
- 确认IP数据包是否成功到达目的地址
- 通知在发送过程中IP数据包被丢弃的原因
- ICMP也是基于IP协议工作的,但它并不是传输层的功能,因此被归为网络层协议
- ICMP协议只能搭配IPv4使用,如果是IPv6则需要使用ICMPv6
假设一台主机进行IP数据包的传输而目标主机电源处于关闭状态:
如该图所示:
当主机A向主机D发送一个IP数据包时,数据包将会逐层传输至路由器C部分;
当路由器C的ARP缓存未命中时将会广播ARP请求,进行IP地址与MAC地址的转换;
而主机D处于电源关闭的状态;
由于路由器C始终收不到ARP应答将会重复发送一段时间的ARP请求;
当到达一定时间后,由于ARP始终未命中,处于临时等待队列中的IP数据包将被丢弃,对应的路由器C将返回一个"目标不可达"的ICMP报文发回给主机A;
ping 命令
ping
命令通常是用来检查网络状态的一个命令,实际上ping
命令是通过ICMP协议来判断网络是否可达及网络状态的;
当用户在使用ping
命令对一个IP地址进行网络联通是否正常时,使用ping
命令的主机将会向目标主机发送一个ICMP Echo Request
报文,即需要目标主机响应对应报文;
如果目标主机可达并且正常工作将会响应一个ICMP Echo Reply
类型为0
的报文;
这个响应时间通常会被ping
命令记录下来,通常显示为time=XXXms
,其中XXX
是延迟时间,单位为毫秒;
-
以
baidu.com
为例:正在 Ping baidu.com [110.242.68.66] 具有 32 字节的数据: 来自 110.242.68.66 的回复: 字节=32 时间=96ms TTL=50 来自 110.242.68.66 的回复: 字节=32 时间=97ms TTL=50 来自 110.242.68.66 的回复: 字节=32 时间=86ms TTL=50 来自 110.242.68.66 的回复: 字节=32 时间=103ms TTL=50 110.242.68.66 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位): 最短 = 86ms,最长 = 103ms,平均 = 95ms
其中
baidu.com
表示需要ping
的域名,[110.242.68.66]
表示该域名对应IPv4的地址;32
字节数据表示ICMP Echo Request
(ping
请求)的数据包大小;对应的
2-5
行为Echo
回复信息;其中 “字节=32” 表示
ICMP Echo Reply
的大小;“时间=XXms” 表示数据包从发送到接收响应的花费时间,即往返时间(RTT);
TTL=50
表示数据包的生存时间,每个路由器会在传输数据包时将这个值-1
,到达0
时数据包会被丢弃;通常TTL默认时将被设置为
64
,128
,255
等,在经过网络传输时TTL将会-1
而网络工具中所显示的TTL为剩余值,通常估算跳数时为 “预想的初始TTL值减去剩余(最终显示)的TTL” ;剩余的即为统计信息;
当然如果ping
命令所发的ICMP Echo Request
报文没有被接收的话,在一定时间后离对应主机最近的网关路由器将会返回一个相关错误的ICMP
报文来报告错误,可能表示:
- 目标主机不可达(如电源关闭,网络连接问题,防火墙阻挡等)
- 网络路径存在问题(如路由器故障,网络拥塞,防火墙配置等)
可能会存在这样一个面试题:
-
ping
命令的端口号是什么?实际上
ping
命令是基于ICMP的,对应的也是网络层,而端口号是传输层的内容,在ICMP中并不会关心端口号这样的信息;
正向代理服务器
正向代理服务器通常是代替客户端去请求服务器资源;
客户端知道代理服务器的存在,但服务器不知道请求来自哪个客户端;
其工作流程为如下:
- 用户配置浏览器使用一个正向代理服务器来访问互联网
- 当用户请求一个网页时请求将先发送到代理服务器
- 代理服务器会代表用户请求网页并将结果返回给用户
实际上校园网就属于一种正向代理服务;
当用户在使用校园网进行网络通信时,实际上对应的数据包将由各个宿舍的默认网关发送至学校中的正向代理服务器中;
学校的代理服务器将会代理用户经过网络提供商(ISP)访问对应的内容,当接收到对应的响应时将会发回至校园的正向代理服务器中,随后代理服务器将会根据响应内容实行一些策略,如直接丢弃数据包(过滤)等操作;
反向代理服务器
反向代理服务器通常是位于服务器的上一个代理服务器,通常负责接收客户端的所有请求,并将这些请求根据一定的策略转发到内部服务器上;
其工作流程如下:
- 客户端发送请求到反向代理服务器,认为自己在直接与目标服务器交互
- 反向代理服务器根据请求内容,服务器负载等情况将请求转发给一组后端服务器中的一个或是多个
- 后端服务器处理请求后将响应发回反向代理服务器,反向代理服务器再将响应返回给客户端
反向代理服务器的应用场景通常为如下:
-
负载均衡
反向代理可以作为负载均衡器,将请求均衡的分发到多个后端服务器上从而提高系统的性能和可用性;
-
安全性
反向代理可以保护后端服务器的IP地址,提供安全层面的防护,如DDoS保护,访问控制等;
-
缓存
同正向代理一样,反向代理也可以进行缓存从而减少后端服务器的负担,提高响应速度;
-
SSL/TLS
终止反向代理服务器可以处理HTTPS请求的加密和解密,使后端服务器不用处理这些加密工作从而简化服务器配置;
-
地理位置分流
可以根据用户的地理位置将请求导向最近或者最合适的服务器;