跳转至

数据链路层

约 4704 个字 6 张图片 预计阅读时间 16 分钟

本篇介绍

前面已经介绍过传输层协议和网络层协议,知道了传输层协议本身并不是发送数据的一方,而实际上发送数据的是IP协议。在IP协议中,可以通过路由表确定下一跳的位置,但是IP协议只是给出了路线,并没有决定着如何让当前数据走到下一个路由器。实际上,这一点IP协议也做不到,因为这个动作需要由网络层的下一层:数据链路层来完成。本篇就会针对数据链路层做出解释

局域网介绍

局域网,是网络发明史中第一个诞生的网络。只要是某一个范围内部的计算机想要进行网络通信就必须要局域网,所以在局域网这个概念刚诞生时,每一个组织内部都有属于自己的局域网。随着时代的发展,最后使用最多的局域网就有了以太网,其他的还有例如令牌环网、无线网

以太网本质上不算是一个单独的网路,而是局域网中的一个技术标准。其中既包含了数据链路层的内容,也包含了一些物理层的内容。例如规定了网络拓扑结构、访问控制方式、传输速率等。以太网之间的数据交互一般会使用双绞线,传输速率一般有10M、100M、1000M等

为什么叫「以太网」

以太网(Ethernet)的名字来源于19世纪物理学中的“以太”(Ether 或 Luminiferous Ether)概念。这个名字的由来与以太网技术的发明者和其历史背景密切相关。以下是详细的解释:

  1. 物理学中的「以太」:在19世纪,物理学家认为宇宙中存在一种称为“以太”的介质,用于传播光波和其他电磁波。这种假设是为了解释光波如何在真空中传播,因为当时人们认为波需要某种介质才能传播(如声波需要空气作为介质)。虽然“以太”后来被爱因斯坦的相对论所否定,但它在科学史上曾经是一个重要的概念

  2. 以太网名字的灵感来源:以太网是由罗伯特·梅特卡夫(Robert Metcalfe)和他的团队在1973年于施乐帕洛阿尔托研究中心(Xerox PARC)开发的一种局域网技术。梅特卡夫在命名这项技术时,受到了“以太”这一概念的启发。在设计以太网时,梅特卡夫希望强调这种网络技术能够像“以太”一样,成为一种无形但无所不在的媒介,用于连接计算机并传输数据。他将这种网络命名为“Ethernet”,意指它是一种“承载数据的以太”,就像“以太”被认为是承载光波的介质一样

  3. 以太网的象征意义:以太网的名字不仅仅是一个科学隐喻,还体现了其设计目标:

    1. 无处不在:以太网的目标是创建一个通用的、高效的数据通信网络,类似于“以太”作为传播媒介的普遍性
    2. 透明性:以太网对用户来说是“透明”的,就像“以太”被认为是不可见但不可或缺的
  4. 以太网的发展:最初的以太网技术被称为“Alto Aloha Network”,后来梅特卡夫将其改名为“Ethernet”。这项技术基于一种叫做CSMA/CD(载波监听多路访问/冲突检测)的协议,能够在共享介质(如同轴电缆)上实现多台设备之间的通信

因为现在大部分的局域网都使用的是以太网的标准,所以下面基于以太网进行具体介绍

为什么现在大部分使用的是无线网,却还需要学以太网

无线网(Wi-Fi)与以太网虽然是不同的网络技术,但它们有着密切的关系和互补性:

技术层面的关系:

  1. 相似的网络层次

    • 两者都工作在OSI模型的数据链路层
    • 无线网基于IEEE 802.11标准,以太网基于IEEE 802.3标准
    • 同属于局域网技术家族
  2. 架构上的连接:无线网络通常是以太网的"最后一公里"连接。而无线接入点(AP)几乎都通过以太网连接到网络主干

  3. 数据帧转换:当数据从无线设备传输到有线网络时,无线接入点会将802.11帧转换为802.3(以太网)帧

功能互补性:

  • 应用场景互补

    • 以太网提供稳定、高速的有线连接
    • 无线网提供移动性和灵活部署
  • 核心与边缘

    • 以太网常作为网络骨干
    • 无线网常作为边缘接入技术

技术发展关系:

  • 技术继承:无线网络技术在设计时借鉴了以太网的许多概念
  • 标准兼容:两种技术都设计为可以无缝互连
  • 趋同发展:随着技术发展,两种技术在某些方面(如速率)趋于接近

无线网并没有取代以太网,而是扩展了网络连接的方式。现代网络基础设施通常同时使用这两种技术,形成一个完整的网络解决方案

以太网帧格式

基本介绍

两个使用了以太网标准的局域网之间需要通信就需要有对应的协议,这一点在前面的概念中也有充分体现。在数据链路层,一般称有效载荷+报头的数据为数据帧,基本格式如下:

其中,根据类型的不同,数据大小也不同,一般常见的有下面三种:

  1. 类型为0800,数据为IP数据报,数据大小为46字节到1500字节
  2. 类型为0806,数据为ARP请求/应答,数据大小为28字节
  3. 数据为8035,数据为RARP请求/应答,数据大小为28字节

下面针对每一个字段做出解释

目的MAC地址和源MAC地址

局域网内通信需要使用到MAC地址,而数据需要从发送方传输到接收方就需要使用到目的MAC地址,接收方需要知道是哪一台主机发送的数据就需要使用源MAC地址。这一点的理解与网络层IP地址中的源IP地址和目的IP地址类似

类型

当前以太网协议的上一层协议类型,可能是数据链路层上层网络层的IP协议,也可能是当前数据链路层内以太网协议上方的ARP协议或者RARP协议

数据

在前面的协议报中并没有对数据进行具体说明,但是在以太网协议中,需要关注此处的数据,主要是关注大小。在讨论网络层IP协议时提到了IP分片和组装,而分片的依据就是其下层数据链路层中的MTU,那么什么是MTU呢?

实际上,MTU就是此处数据链路层的最大数据大小,在Linux下,如果需要查看当前设备的MTU,可以使用ifconfig查看:

除了有MTU的概念外,还有一个MSS(Max Segment Size),二者的关系如下:

例如,以MTU=1500为例,IP报头+其数据部分总共大小在不想分片的情况下需要在46字节到1500字节以内,而对于IP协议来说,去除自己的报头后,剩下的数据大小实际上就只能是26字节到1480字节,即传输层的报头和数据部分总和大小在26字节到1480字节。其中的26字节到1480字节就是MSS大小

CRC校验和

以太网帧中的CRC(循环冗余校验)是一个32位的校验码,位于数据帧的尾部,用于检测传输过程中可能发生的错误。发送方在传输前会根据帧内容(不含前导码)通过特定多项式计算出一个校验值,接收方收到数据后会对整个帧重新计算校验值并与接收到的CRC比较,如结果为零则认为数据完整,否则判定该帧已损坏并予以丢弃。CRC能有效检测单比特错误、双比特错误和所有奇数位错误,是以太网提供可靠通信的基础保障机制。这种设计简单高效、易于硬件实现,为数据链路层提供了必要的错误检测功能,虽不能纠正错误,但能识别损坏的数据,使上层协议得以采取适当措施。但是具体如何进行校验不是本篇讨论的重点

局域网通信与交换机

局域网通信的过程图如下:

之前提到过,局域网内任意两台计算机通信都会被其他计算机知道,只是其他计算机通过识别以太网帧格式发现不属于自己的数据默认选择抛弃该数据。对于这一点,如果想让当前计算机对于不论是否是给自己的消息都接收,就可以让当前计算机的网卡开启混杂模式

关于混杂模式

混杂模式(Promiscuous Mode)是网络接口卡(NIC)的一种特殊工作状态,开启混杂模式后,网卡会接收所有经过的数据包,而不仅仅是目的MAC地址为自己的数据包。在标准模式下,网卡只接收目的MAC地址是自己的帧或广播/多播帧

基本工作原理为:在以太网环境中,所有连接到同一网段的设备都能"看到"传输的所有数据帧,但通常网卡会根据MAC地址过滤,只接收发给自己的帧。混杂模式则禁用了这个过滤机制

在实际开发中一般会有一下应用:

  1. 网络监控和分析:网络管理员使用Wireshark等工具进行网络故障排查
  2. 网络安全审计:检测网络中的异常流量和安全威胁
  3. 网络入侵检测系统(IDS):监控网络流量以发现潜在攻击
  4. 数据包嗅探:捕获网络中传输的数据,也可被滥用于非法监听

但是也可能存在以下的安全隐患:

  • 可被恶意用户用于捕获网络中的敏感数据
  • 在交换式网络中效果有限,因为交换机会定向转发数据
  • 可能被用于ARP欺骗等网络攻击的基础

一般用户不需要启用混杂模式,这通常需要管理员权限,并且主要用于网络诊断和安全分析等专业场景

同时也提到过,如果有多台计算机同时发送消息就很有可能出现数据碰撞,所以为了保证碰撞概率尽可能小,就需要保证局域网内部的计算机较少,同时确保数据帧的大小在合理的范围内(如果太小,可能两台计算机通信的频次就会比较高,如果太大,那么发送方就会花太长时间发送,如果出现数据丢失还需要重新传输,整体开销大),这就是为什么MTU规定上限为1500字节,下限是46字节。在局域网内部如果存在少量的计算机,那么出现碰撞问题,可以考虑让指定的计算机休眠,等待一段时间后再重新发送数据,这就是数据链路层的数据重传,但是这个重传并不是超时重传,为了尽可能不出现碰撞,在一个局域网内部需要保证任何时刻只有一台计算机使用整个局域网

但是,现实中一定存在一个局域网内的计算机很多,例如一家公司的服务器,所以为了减少碰撞就提出了划分碰撞域的概念,而具有划分碰撞域能力的设备就是交换机,实现划分碰撞域的过程如下:

将所有主机链接到交换机上,假设现在主机1需要给主机5发送数据,在刚开始时,局域网内所有的计算机(包括交换机)都会收到这个数据,只是除了主机5以外都会抛弃这个数据,但是交换机会慢慢“学习”发送方和接收方的位置。一段时间后,交换机知道了主机1、2和3都在其左侧,主机4和5都在其右侧,之后主机1再给主机5发送数据,交换机会查看主机5是否与主机1在同一侧,如果不在,就将数据转发到另外一侧。整个过程中始终还是局域网通信,所以交换机的判断方式还是通过MAC地址

有了交换机中,原来五台主机共同组成的一个大碰撞域就被划分成了两个小碰撞域,在一定程度上减少了碰撞的概率

ARP协议

基本介绍

在本篇最开始的介绍部分提到过,IP协议只负责指出下一跳,并不负责数据的运输,而数据的运输是通过数据链路层完成的,所以就有了一个结论:物理上,跑在网路上的数据都是数据帧;逻辑上是IP数据报。不过,IP协议虽然给出了下一跳的地址,但是这个地址是IP地址,而局域网通信必须要MAC地址,如果没有MAC地址,就无法完成网络层的数据到数据链路层的封装,例如发送方发现当前数据需要发送给不属于当前局域网的主机,就需要将数据交给路由器,发送方只知道路由器的IP地址,怎么知道路由器的MAC地址

这里就需要用到ARP协议,ARP协议是工作在数据链路层中位于以太网协议上层的协议,其作用就是通过目标主机的IP地址获取到目标主机的MAC地址

ARP协议报

为了了解ARP协议的工作模式,首先需要了解的就是ARP协议报格式,如下图所示:

在ARP协议中,每个字段含义如下:

  • 硬件类型:指链路层网络类型,1为以太网
  • 协议类型:指要转换的地址类型(上层协议),0x0800为IP地址
  • 硬件地址长度:对于以太网地址为6字节
  • 协议地址长度:对于IP地址为4字节
  • 操作字段:1表示ARP请求,2表示ARP应答

ARP协议工作原理

当发送方需要给局域网内部的目标主机发送消息,需要知道MAC地址,此时会发送一个填好相关值的ARP请求(需要注意的是,因为发起ARP请求方不知道目标MAC地址,所以以太网首部的目的MAC地址和ARP请求中的目的MAC地址均为FFFFFFFFFFFF)。因为局域网内通信,数据会被每一台计算机接收,只是不是目标主机不会向上层交付,而这个过程中,非目标主机首先会对这个数据帧进行解包,获取到ARP协议报之后看操作字段为1还是为2,因为一台计算机除了会收到ARP请求以外,还会收到ARP应答,接着判断目的IP地址是否是自己,如果不是就抛弃

当遇到目标主机,同样执行上面的步骤,接着,会在发送方MAC地址填入自己的MAC地址,目的MAC地址填入源发送方的MAC地址,最后封装为数据帧发送给源发送方

ARP请求和应答是否都会被所有计算机看到

注意,在上面的请求和应答过程中,ARP请求和应答在物理层面都会被局域网内所有设备看到,但是因为ARP请求部分目的MAC地址为广播地址,所以非目标主机需要交付给数据链路层中的上层处理,但是ARP应答部分目的MAC地址为具体值,非目标主机判断这个MAC地址不是自己直接会直接抛弃,而不会交付给数据链路层中的上层处理

最后,源发送方收到目标主机发送的ARP应答(操作字段为2),就会提取其中的发送方MAC地址字段

如果每一次通信都需要发送ARP协议来确定一个局域网内对方的MAC地址,那么效率会有点低,所以一般情况下一台设备在第一次获取到目标主机的ARP应答时都会对这个目标主机的MAC地址进行缓存。但是这个缓存并不是永久性的,一般是30分钟及以上,具体取决于不同的操作系统

RARP协议

ARP(地址解析协议)和RARP(反向地址解析协议)是一对功能互补但方向相反的数据链路层协议,关系如下表:

特性 ARP RARP
主要功能 将IP地址解析为MAC地址 将MAC地址解析为IP地址
应用场景 已知目标IP地址,需要获取其MAC地址以发送数据帧 设备知道自己的MAC地址,但需要获取自己的IP地址
协议类型值 0806 8035
使用时机 正常网络通信时持续使用 主要在无盘工作站启动或某些特殊设备初始化时使用

工作原理对比如下:

  • ARP过程:发送方广播“谁拥有这个IP地址?”,拥有该IP的设备回应自己的MAC地址
  • RARP过程:发送方广播“我的MAC地址是这个,我的IP地址是什么?”,RARP服务器回应分配给该MAC的IP地址

但是,RARP已基本被DHCP(动态主机配置协议)取代,因为DHCP不仅能分配IP地址,还能提供更多网络配置信息,如子网掩码、默认网关和DNS服务器地址等