
目录
网络层IP协议解决数据跨网络发送
传输层Tcp/Udp协议保证数据发送的可靠性
而数据链路层则解决数据在同一局域网中两台主机的通信问题
一、以太网
以太网并不是一种具体的网络,而是一种技术标准,它既包含了数据链路层的内容,也包含了一些物理层的内容。例如:规定了网络拓扑结构、访问控制方式、传输速率等。以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网、无线LAN等。
二、以太网的帧格式
以太网的帧格式如下图所示:

- 源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的;
- 帧协议类型字段有三种值,分别对应IP、ARP、RARP;
- 帧末尾是CRC校验码。

报头字段中有一个"类型"字段,为0800时,就是IP报文;为0806时,就是ARP报文;为8035时,就是RARP报文,如上图。
三、局域网通信的原理
局域网就好比一间课室,在课室里谁都可以发言,而且你的发言所有人都可以听得到。比如在课室里老师发言说:"小明你站起来一下。"这句话一定是被课室里的所有人都听到了的,但只有小明会站起来,其他人即使听到了也不会有任何动作,因为他们知道这条信息不是发给他们的。
在局域网内通信,假设局域网有M1到M10十台主机,每台主机此时如果M1主机想发消息给M6主机,数据到了M1主机的数据链路层后首先需要填以太网的报头字段,目的地址填的就是M6主机的MAC地址,源地址填的就是M1主机的MAC地址,类型填对应的上层协议。
M1主机填好报头之后,就将报文在局域网内转发了,这个报文一旦转发到了局域网,局域网内所有主机都会把它获取上来,它们需要判断这个报文是不是发给自己的。**除了M6以外的主机发现该报文都不是发给自己的,那么它们就会将该报文丢弃。**只有M6主机,获取上来报文之后发现是发送给自己的,它就对报文进行解包然后继续向上交付给上一层。自此就完成了局域网内的通信。

如果局域网内有两台主机比如M1和M5,有可能当M1主机想向局域网发送数据时M5主机也想发送,**如果两台主机同时往局域网内发信息,就会出现冲突,这种就属于数据碰撞。**所以此时就需要M1主机和M5主机随机等待上一段时间之后再重新发送数据,让两台主机发送的时间分开。因此,局域网也叫做碰撞域。
如果想要减少碰撞,那么局域网内的主机是越少越好,因为这样碰撞的概率就会降低。除此之外,每一台主机每次发送的数据不能过大,比如说其它主机每次发送的都是很短的数据,而M1主机每次发送的数据都很大,这就注定会使M1主机在发这个数据时要花费更多的时间,在这个时间内,其它主机由于数据比较小,所以发送地比较快,M1主机发送的数据就很容易跟别人的数据碰撞上。所以!数据链路层必须对上的网络层提要求,让报文大小不能过大,一般不能超过1500字节,这个最大值称为以太网的最大传输单元(MTU),如果IP报文的大小超过了这个值就要进行分片。
四、ARP协议
ARP协议也是数据链路层协议,它叫做地址解析协议 ,能够将IP地址转换成为MAC地址 。需要注意的是ARP协议并不是一个单纯的数据链路层协议,而是一个介于数据链路层和网络层之间的协议。 ARP协议建立了主机IP地址和MAC地址的映射关系。在网络通信时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的MAC地址。**数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的MAC地址与本机不符,则会直接丢弃该数据包。**因此在通信前必须获得目的主机的MAC地址。
这样说来,IP地址便是逻辑地址,而MAC就是物理地址,那么ARP协议不就相当于我们在系统编程的时候所说的页表吗!
ARP协议的工作流程

- 源主机发出ARP请求,询问"IP地址是192.168.0.1的主机的硬件地址是多少",并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播);
- 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的MAC地址填写在应答包中;
- 每台主机都维护一个ARP缓存表(叫做ARPT),可以用arp-a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址
ARP数据报格式
ARP协议的数据报格式如下图所示,其中各字段的含义是:

- 硬件类型指的是数据链路层的网络类型,1为以太网
- 协议类型指的是要转换的地址类型,0x0800为IP地址
- 硬件地址长度对于以太网地址为6字节
- 协议地址长度对于IP地址为4字节
- OP字段为1表示ARP请求,OP字段为2表示ARP应答
ARP欺骗原理
我们一想上面的工作流程就会想到IP协议的中间人攻击,这不就是第一次的公钥无法安全传递的问题吗?
同样的,如果MAC地址被人篡改,也会导致信息的流失,而这个过程,我们叫做ARP欺骗!
而ARP 协议的致命缺陷是:当设备收到一个 ARP 响应包时,无论自己是否发送过对应的请求,都会直接更新本地的 ARP 缓存表,且不会验证响应包的真实性。
攻击者正是利用这一点,向目标设备发送伪造的 ARP 响应包,篡改目标设备的 ARP 缓存表,实现两种常见攻击:
一、直接代替一端主机。
让攻击者向设备 A 发送伪造的 ARP 响应包,声称 "网关的 IP(192.168.1.1)对应的 MAC 地址是我的 MAC 地址"。设备 A 的 ARP 缓存表被篡改,后续所有发往网关的流量,都会被发送到攻击者的设备。
二、成为中间人

如图,主机M向两端都发送大量消息,告诉对方:我是ipxx,我的 MAC 地址是macM"。因为 ARP 协议没有验证机制,两边主机都会直接更新自己的 ARP 缓存表,认为 "ip对应的 MAC 是macM"。
这样主机 A 和路由器 R 之间的所有流量,都会先经过攻击者的主机 M。
如何避免ARP欺骗?
- 手动绑定MAC地址在本地,避免缓存被篡改。
- 使用 360卫士/火绒等ARP 防火墙工具
- 改用HTTPS/SSH等加密协议
