数据链路层协议——以太网协议

1. 数据链路层

  • 网络层用于将数据从一台主机发送到另一台主机。
  • 传输层用于将数据可靠的从一台主机发送到另一台主机。(网络层没有保证可靠性的策略,传输过程中可能会出现各种意外,例如:丢包,网络拥塞等。通过传输层可以保证数据可靠的传输到对端主机。
  • 数据链路层用于在局域网内找寻目标主机。当一台主机要和其他主机通信时,本质上其实是将数据交给路由器通过一跳一跳的方式最终到达目标主机的。

本章介绍数据链路层的工作原理,如何在局域网内找到目标主机(路由器)。

2. 以太网协议

2.1 认识以太网

局域网通信技术

  1. 以太网:每个节点有全球唯一的48位地址,即制造商分配给网卡的MAC地址,以保证以太网上所有节点能互相鉴别。以太网具有广播特性、半双工和全双工传输特性以及CSMA/CD特性等。(1000 Mbps)和10G以太网,它们都符合IEEE 802.3系列标准规范。
  2. 令牌环网:通过在网环上按顺序依次传递令牌,确保在同一时刻只有一个节点能够独占信道,从而避免了传输冲突。
  3. 无线局域网(WLAN):无线局域网技术基于无线通信技术,通过无线信号进行数据传输。它提供了无线接入网络的便利,用户可以在无线覆盖范围内随时随地连接到局域网,并享受网络资源和服务。

认识以太网

  • "以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
  • 例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
  • 以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;

局域网通信原理:所有主机都会收到消息,但是在数据链路层发现消息不是发给自己的,就会自动丢弃该报文。

例如在上图局域网中,主机A给主机E发送一个消息,其他的所有主机其实都会收到,但是在数据链路层判断出该报文并不是发给自己的,于是直接丢弃了。

碰撞避免

由于局域网通信中,所有主机共享一个通信信道,所以难免存在多条数据发生碰撞的问题,因为发生碰撞可能会对数据造成干扰,所以局域网中同一时间只能有一台主机发消息。站在系统的角度来看,局域网就是一种临界资源,多台主机(多个进程)访问局域网(临界资源)时是互斥的(加锁)。

为了解决这个问题,以太网采用了以下措施:

  1. 在发送数据前,先侦听信道是否空闲,如果空闲则立即发送数据。
  2. 如果信道忙,则继续侦听,直到信道空闲时再发送数据。
  3. 在发送数据的同时,继续侦听信道是否发生冲突。
  4. 如果在发送数据过程中检测到冲突,则立即停止发送数据并发送一个特殊的信号,通知其他所有站点发生了冲突。
  5. 发生冲突的站点会执行一种特殊的退避算法(如截断二进制指数退避算法),等待一段时间后再重新尝试发送数据。

通过这种方式,以太网能够在一定程度上减少碰撞的发生,提高通信效率。

令牌环网则采用了令牌传递的方式来控制数据的传输,从而避免了碰撞的问题。在令牌环网中,每个节点都连接在一个环形链路上,并且只有拥有令牌的节点才能发送数据。当一个节点想要发送数据时,它必须等待获得令牌。当一个节点完成数据传输后,它会将令牌传递给下一个节点。通过这种方式,令牌环网能够确保在任意时刻只有一个节点在发送数据,从而避免了碰撞的发生。

令牌环网中的令牌传递机制也可以类比为操作系统中的信号量或互斥锁,它们都是用来控制多个进程对共享资源的访问。

2.2 以太网帧格式

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

如何将报文和有效载荷分离

因为以太网的报文都是固定大小,所以我们提取出报文的头14个字节,尾4个字节,剩下的就是数据了。

报文向上交付给哪个协议

接收端收到该报文后,可以提取出该报文的2位类型字段,根据2位类型交给不同的协议。常见的类型:0800为IP协议,0806为ARP协议,8035为RARP协议。

举个例子

当主机A想要给主机E发送MAC帧时,局域网中所有的主机都会收到该报文,但是到达数据链路层后发现该报文并不是发送给自己的,于是将该报文丢弃。

主机E收到该报文后,发现该报文是发给自己的,然后进行CRC校验,判断该报文在传输过程中是否出现错误,如果没有,提取出类型字段为0800,判断出要将数据交给IP协议,于是将报文和有效载荷进行分离,然后将数据向上交付。

2.3 认识MAC地址

  • MAC地址用来识别数据链路层中相连的节点;
  • 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
  • 在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址).

MAC地址有点像我们的身份证,每台主机都拥有一个全球唯一的MAC地址。

我们使用ifconfig命令来查看我们的MAC地址,前面的ether就是以太的意思。

如何理解MAC地址和IP地址

在网络通信中,当我们给对方发送消息时,我们需要知道对方的IP地址。根据IP地址我们就能将数据从一台主机发送到另一台主机,IP地址就像是一个终极目标。而MAC地址的作用像是为了这个终极目标而划分成的一个个小目标。

  • 1.源IP和目的IP表示通信过程中的起始和终点
  • 2.源MAC和目的MAC表示的是通信过程中每一个区间上的起始和重点

举个例子:唐僧要从东土大唐到西天取经,中间会路过黑风岭,女儿国,车迟国。在这个例子中,东土大唐和西天相当于是通信的两台主机,黑风岭,女儿国,车迟国看作是路由器,唐僧理解为是通信中的报文。

在东土大唐(发送端)时,唐僧(报文)确定好了目的地(目的IP)以及下一站要去的地点(目的MAC)时,出发到达黑风岭(路由器),到达后,他的目的IP是不会发生改变的,因为他要去的一直都是西天(接收端)。但是源MAC和目的MAC就会发生改变了,他已经完成了从东土大唐到黑风岭,接下来就应该从黑风岭到女儿国。

如图所示,最终就完成了整个报文的传输过程。

2.4 认识MTU

MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制.

  • 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;
  • 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU
  • 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);
  • 不同的数据链路层标准的MTU是不同的;

对于MAC帧来说,其中的数据长度其实就是上层协议交付给他的报文。

为什么要设置MTU

如果不设置MTU,那么数据就不会分包。在网络传输中就会出现数据过长的问题。

长数据的传输速度慢,且容易发生碰撞,发生碰撞可能会导致数据出现错误,发送端要将整个长数据重新发送(重发的成本较大)。

但是这也不代表分包就是好的。

如果将长数据分包,也就意味着丢包的概率概率增大。原本网络的丢包概率为万分之一,如果我们将报文分成一百个,那么丢包概率就上升到了百分之一。

所以我们在网络通信中,尽可能避免传送长数据。

2.5 MTU对IP协议的影响

由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包

  • 将较大的IP包分成多个小包, 并给每个小包打上标签;
  • 每个小包IP协议头的 16位标识(id) 都是相同的;
  • 每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为1, 否则置为0);
  • 到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;
  • 一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据;

因为网络通信的最大传输单元为1500。所以数据网络层交给数据链路层的报文大小就不能超过1500个字节,但是IP协议至少20字节,也就是说IP报文的数据部分不能超过1480个字节。如果超过了就需要在IP层分包。对接收端IP层组装。

2.6 MTU对UDP协议的影响

  • 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报.
  • 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了.

2.7 MTU对TCP协议的影响

因为IP报文的数据长度最大为1480,也就意味着TCP协议交给IP协议的报文大小最大为1480。但是TCP协议报头的最小长度为20字节,也就是说TCP协议的数据部分不能超过1460的大小,一旦超过就会在网络层分包。

  • TCP的一个数据报也不能无限大, 还是受制于MTU. TCP的单个数据报的最大消息长度, 称为MSS(MaxSegment Size);
  • TCP在建立连接的过程中, 通信双方会进行MSS协商.
  • 最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU).
  • 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值.
  • 然后双方得知对方的MSS值之后, 选择较小的作为最终MSS. MSS的值就是在TCP首部的40字节变长选项中(kind=2);

对于TCP来说,分片也会增加TCP报文丢包的概率,但与UDP不同的是TCP丢包后还需要进行重传,因此TCP应该尽量减少因为分片导致的数据重传。

MTU和MSS的关系如下:

我们可以使用ifconfig命令查看MTU的大小。

2.8 模拟通信过程

当前主机B想要给主机C发送消息。

1.主机B要将数据传输给主机C,首先必须先将数据交给局域网中的路由器F,主机B会构建好MAC帧报文进行将报文发送到局域网中。发送报文如下:

2.局域网中所有主机都会收到该报文,其他主机在数据链路层识别出该报文的目的地址不是自己的,于是直接将该报文丢弃,路由器F收到该报文后,判断出该报文是给自己的,于是向上交付给网络层,网络层提取出目的IP后,通过路由表查询到下一次应该将数据交给路由器G。

3.路由器F构建MAC帧报文,发送到路由器F和路由器G所在的局域网中。构建报文如下:

3.不断经过以上过程,最终将数据传送给了主机D

3. ARP协议

地址解析协议(Address Resolution Protocol,ARP)协议,根据IP地址获取MAC地址的一个TCP/IP协议。

3.1 ARP协议的作用

为什么会存在ARP协议

我们刚刚模拟了通信过程,但是中间有一个疑点,主机B如何知道路由器F的MAC地址,从而构建出MAC帧的。

  • 方法一:所有主机出厂时内置一份其他所有主机的MAC地址,显而易见不太现实。
  • 方法二:通信过程中获取对方的MAC地址。

而ARP协议就是我们说的方法二,通过IP地址获取对方的MAC地址。

ARP的作用

ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.

  • 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
  • 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
  • 因此在通讯前必须获得目的主机的硬件地址;

3.2 ARP协议的位置

ARP协议实际上是在MAC帧协议之上的。我们再来看一下MAC帧的报文格式。

类型字段的含义是交给上层的哪个协议,其中就有0806对应的就是交给上层的ARP协议,而8035协议是RARP协议。

ARP协议是将IP地址转化为MAC地址,而RARP的作用刚好相反,是将MAC地址转化为IP地址。

3.3 ARP协议数据报格式

  • 注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
  • 硬件类型指链路层网络类型,1为以太网;
  • 协议类型指要转换的地址类型,0x0800为IP地址;
  • 硬件地址长度对于以太网地址为6字节;
  • 协议地址长度对于和IP地址为4字节;
  • op字段为1表示ARP请求,op字段为2表示ARP应答。

仔细观察会发现其实前半部分就是以太网报文的首部,而在以太网协议的角度来看,其实ARP协议就是以太网报文的数据部分,这也验证了其实ARP协议是在以太网协议之上的。

3.4 ARP协议工作流程

现在,主机A想要给主机E发送消息,但是在局域网内通信,必须要知道对方的MAC地址,我们现在来模拟一次主机A是如何获取主机E的地址的。

APR请求

1.主机A在ARP层构建ARP报文。

  • 主机A构建的是ARP请求,所以ARP报文中的op字段设置为1。
  • ARP报文中的硬件类型字段设置为1,表示当前使用的是以太网通信。
  • ARP报文中的协议类型设置为0800,表示路主机A要根据主机E的IP地址来获取主机E的MAC地址。
  • ARP报文中的硬件地址长度和协议地址长度分别设置为6和4,因为MAC地址的长度是48位,IP地址的长度是32位。
  • ARP报文当中的发送端以太网地址和发送端IP地址,对应就是主机A的MAC地址和IP地址。
  • ARP报文当中的目的以太网地址和目的IP地址,对应就是主机E的MAC地址和IP地址,但由于主机A当前还不知道主机E的MAC地址,因此将目的以太网地址的二进制序列设置为全1,表示在局域网中进行广播。

2.主机A在MAC帧层构建MAC帧。

  • 封装MAC帧报头时,以太网目的地址和以太网源地址,对应分别是主机E和主机A的MAC地址,但由于主机A不知道主机E的MAC地址,因此MAC帧报头当中的以太网目的地址的二进制序列也只能设置为全1,表示在局域网中进行广播。
  • 因为这里封装的是一个ARP请求数据包,因此MAC帧当中的帧类型字段设置为0806。

3.主机A在局域网中以广播的形式发送。

所有主机都会收到该报文。在MAC帧层,其他主机会先看该报文的目的MAC,发现是以广播的形式,于是再提取出类型字段,发现是0806,这是一个ARP请求报文,于是将该报文的报头和有效载荷分离,并且将有效载荷向上交付给ARP层。

在ARP层,其他主机先提取出op字段,判断出这是一个ARP请求的报文,然后再提取出目的IP字段,发现这个报文并不是交给自己的,于是直接将该报文丢弃,而主机E判断出这个报文是自己的后,就会对该报文进行应答。

ARP响应

4.主机E收到报文后,进行ARP应答,他也会在ARP层构建一个报文。

  • 主机E构建的是ARP响应,所以ARP报文中的op字段设置为2。
  • 主机E填写源MAC,源IP,目的MAC和目的IP

5.主机E在MAC帧层构建MAC帧

填写目的MAC和源MAC。

6.主机E在局域网中发送该报文

所有主机都会收到MAC帧报文,在MAC帧层提取出目的MAC是MACA,与自己的MAC地址不相同,于是直接丢弃报文,不会向上交付。

而主机A在提取出目的MAC后判断出该报文是发给自己的,于是将该报文进行报头和有效载荷的分离,并将有效载荷向上交付。在ARP层,先提取出op字段,发现这是一个ARP响应,于是就可以拿到主机E的MAC地址了。

为什么MAC帧中已经有了源MAC和目的MAC,ARP报头中还要有这两个字段?

MAC帧中的源MAC和目的MAC地址用于在数据链路层上传输数据,而ARP报头中的源MAC和目的MAC地址则用于在数据链路层上传输ARP请求和响应。这两个字段在不同的上下文中有不同的用途。

如果下层使用的不是以太网协议,而是其他协议(不一定包含源MAC和目的MAC字段),在ARP层可以提取出源MAC和目的MAC。

为什么主机A在收到ARP应答后,MAC帧中已经有了源MAC,为什么到ARP层才能提取出MACE?

局域网中的任何一台主机可能即会发送ARP请求,也会收到ARP请求。如果只在MAC帧层,是无法判断出这个报文是一个ARP请求还是ARP应答。也就是说,主机A无法判断出该报文是请求主机A的MAC还是对A发送的ARP请求的一个响应,所以主机A需要向上交付给ARP层,ARP提取出op字段为2时才能够判断出这是一个ARP响应。

3.5 ARP缓存表

我们并不是每一次获取ARP都需要经过上述过程。每个主机都会维护一个ARP缓存表,当进行了一次ARP请求和响应时,就把MAC和IP的映射填入ARP缓存表中,下次查询就可以直接去ARP缓冲表中查了,不需要再进行ARP的请求和响应了。

我们可以使用arp -a命令来查看我们主机的ARP缓存表

需要注意的是缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。

3.6 RARP协议

RARP(Reverse Address Resolution Protocol),即反向地址解析协议,是地址解析协议(ARP)的反向过程。RARP协议的主要功能是将物理地址(MAC地址)转换为IP地址。在计算机网络中,当设备(如某些无盘工作站或路由器)启动时,它可能知道自己的物理地址,但不知道自己的IP地址。这时,设备可以使用RARP协议来请求其逻辑地址。

相关推荐
七夜zippoe2 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
盟接之桥2 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
会员源码网2 小时前
理财源码开发:单语言深耕还是多语言融合?看完这篇不踩坑
网络·个人开发
米羊1213 小时前
已有安全措施确认(上)
大数据·网络
Fcy6483 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满3 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠3 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
主机哥哥4 小时前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
Harvey9034 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
ManThink Technology4 小时前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络