Linux网络:数据链路层之以太网协议

为什么要把数据包从本节点交给下一个节点,是由目的 IP 决定的(IP 最大的意义,在于路径选择)!

如何把数据包从本节点交到下一个节点,是由数据链路层解决的!

  • 凡是能够跳转到下一跳,一定是直接相连的节点!
    直接连接的节点,一定是在同一个网段(局域网)!

  • 网络的本质是,多个局域网通过一些横跨局域网的路由器连接起来的大网络。
    路由转发的本质是,数据包通过中间路由器不断经过若干个局域网的过程。

  • 要解决网络中的路由转发问题,只需要解决在局域网内,一个数据包从一个节点交给下一个节点的问题,即局域网通信的问题。

  • 同一个局域网(子网)中,两个节点能够直接相互通信。
    局域网通信的原理:以太网、令牌环网等。

一、以太网

1.基本理解

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

因为 IP 层的存在,所以可以屏蔽掉底层网络的差异,统一使用 IP 地址。站在 IP 层往上看,所有的网络就没有差异了,全部都是 IP 网络。

以太网通信的原理:
在这里插入图片描述

以太网中的所有主机,共享一个通信信道,当一台主机给目标主机发送数据后,处于同一个局域网的所有主机都能够收到,它们都会对比自己的 MAC 地址和数据中的目的 MAC 地址,除了目标主机的对比是相等的之外,其余主机的对比都是不相等的,所以其余主机都会丢弃,只有目标主机会将其解包并向上交付。

由于以太网中的所有主机共享一个通信信道,所以不允许多台主机同时向局域网发数据,因此会有碰撞检测和碰撞避免算法,来保证在任一时刻,只允许一台主机向局域网发数据,这是通过概率和尝试去进行的。

局域网中的通信信道,就好比系统中的临界资源,在任何时刻只允许一个主体访问。在局域网中为了保证这一点,采用的是碰撞检测和碰撞避免算法。

2.以太网帧格式

在这里插入图片描述

说明:
 ① 源地址和目的地址:表明数据帧是哪个主机发的,要发给哪个主机。
 ② 类型:表示帧的数据是什么类型。共有三种值,分别对应 IP 、ARP 、RARP 。
 ③ CRC 校验码:对帧进行相关的校验工作。

源地址和目的地址是指网卡的硬件地址(也叫 MAC 地址),长度是 48 位,是在网卡出厂时固化的。

  • 帧的解包:提取出定长帧头和定长帧尾,剩下的就是有效载荷。
  • 帧的封装:给数据添加上定长帧头和定长帧尾。
  • 帧的分用:根据帧的类型字段,把有效载荷交付给上层的某个具体协议。

以太网帧中的数据长度规定,最小是 46 字节,最大是 1500 字节。

ARP 请求/应答和 RARP 请求/应答,由于其长度只有 28 字节,不足 46 字节,所以需要在后面补上 18 字节的填充字段 PAD 。

3. MAC 地址

MAC 地址用来标识数据链路层中相连的节点。

长度为 6 个字节 48 位,一般用十六进制数字加上冒号的形式来表示。例如:52:54:00:56:6a:47 。

在网卡出厂时就确定了,不能修改。MAC 地址通常是唯一的(虚拟机中的 MAC 地址不是真实的 MAC 地址。也有些网卡支持用户配置 MAC 地址)。

使用ifconfig命令,可以查看 MAC 地址:
在这里插入图片描述

4.对比理解 MAC 地址和 IP 地址

  • IP 地址描述的是路途总体的起点和终点。
  • MAC 地址描述的是路途上的每一个区间的起点和终点。

因此在路由转发时,源 MAC 地址和目的 MAC 地址一直在变化,因为每经过一个路由器,就要重新解包和封装(因为路由表在网络层,要向上交付)。而源 IP 地址和目的 IP 地址一直不变(但实际上,从子网中的主机向外访问服务器时,目的 IP 地址一直不变,而源 IP 地址有可能变;服务器响应回给子网中的主机时,源 IP 地址一直不变,而目的 IP 地址有可能变。因为 NAT 技术)。

5. MTU

MTU 是不同的数据链路层对应的物理层所产生的限制。

以太网帧中的数据长度最大是 1500 字节,这个值称为以太网的 MTU(Maximum Transmission Unit,最大传输单元)。

不同的数据链路层标准的 MTU 是不同的。

使用ifconfig命令,可以查看 MTU:
在这里插入图片描述

6. MTU 对 IP 协议的影响

若 IP 数据包的长度大于 MTU ,则需要先在网络层对数据包进行分片,再向下交付给数据链路层。

  • 在本端或路由器的网络层中,将较大的 IP 数据包进行分片,并给每个分片数据包的包头设置标识、更多分片和片偏移字段。
  • 到达对端的网络层时,再将这些分片数据包按顺序组装到一起,然后再向上交付给传输层。
  • 一旦这些分片数据包中的任意一个丢失,对端网络层的组装就会失败。
    若本端传输层是 TCP ,就会进行超时重传;若本端传输层是 UDP ,丢了就是真的丢了。

除了主机会对较大的 IP 数据包进行分片以外,路由器也可能会对经过它的 IP 数据包进行分片,因为路由器的 MTU 可能比主机的 MTU 要小。

7. MTU 对 UDP 协议的影响

  • UDP 的一个报文,是受制于 MTU 的。
    用 1500 字节的 MTU ,减去 20 字节的 IP 报头和 8 字节的 UDP 报头,就是 1472 字节的 UDP 数据。这也就意味着,如果其中的 UDP 携带的数据超过了 1472 字节,就会在网络层进行分片。

  • 分片会导致丢包概率的增加。若多个分片 IP 数据包中有任意一个丢包了,接收端的网络层都会组装失败,相当于一个原始 IP 数据包整体丢失了。

  • 而且 UDP 不保证传输的可靠性,丢包了也不会超时重传。

8. MTU 对于 TCP 协议的影响

  • TCP 的一个报文也不能无限大,还是受制于 MTU 。TCP 的单个报文的最大数据长度,称为 MSS(Maximum Segment Size,最大报文段长度)。

  • TCP 通信双方在建立连接的过程中,会进行 MSS 协商。
    双方在发送 SYN 的时候,会在 TCP 报头的选项中写入自己能支持的 MSS 值。然后双方得知对方的 MSS 值之后,会选择较小的作为最终 MSS 。

  • 最理想的情况下,MSS 的值正好是 IP 数据包在 IP 层不会被分片处理的最大长度。

MSS 和 MTU 的关系:
在这里插入图片描述

二、ARP 协议

1.基本理解

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

ARP 协议跟 MAC 协议一样,同属于数据链路层,但是 ARP 是 MAC 的上层协议。

MAC 的上层协议不一定就直接是网络层的协议,也有可能是同属于数据链路层的协议,但位于 MAC 的上层。比如 ARP 协议。

在这里插入图片描述
MAC 帧在 MAC 帧层解包后,根据 MAC 帧的类型字段,若是 ARP 请求/应答,则会把数据向上交付给 ARP 层,之后就不再向上交付。
换言之,ARP 协议是数据链路层底层自动完成的一个协议。

一般会不断向上交付的,是用户数据。而向上交付到 ARP 层的,更多的是属于管理数据。

  • 在同一个子网中,一个节点是能直接发数据给下一个节点的。
    要给同一个子网中的下一个节点发数据,前提是必须得先知道它的 MAC 地址(因为数据包需要被封装成 MAC 帧才能发送出去)。
  • 一个节点要转发数据给目的节点,由于只知道目的节点的 IP 地址,不知道对应的 MAC 地址,所以一个节点在转发数据前,必须先通过 ARP 协议,根据目的 IP 地址来获得对应的目的 MAC 地址。

这就意味着数据在路由过程中的每一跳,可能都需要通过 ARP 协议,根据下一跳的 IP 地址来获取对应的 MAC 地址。

ARP 协议属于一种局域网通信协议,因此一个节点不能跨网段向另一个节点发起 ARP 请求。

2. ARP 的格式

在这里插入图片描述

说明:
 ① 硬件类型:表示链路层的网络类型,1 为以太网。
 ② 协议类型:表示要转换的地址类型,0x0800 为 IP 地址。
 ③ 硬件地址长度:对于以太网,是 6 字节。
 ④ 协议地址长度:对于 IP 地址,是 4 字节。
 ⑤ op:为 1 表示 ARP 请求;为 2 表示 ARP 应答。

注意到源 MAC 地址和目的 MAC 地址,在以太网首部和 ARP 请求/应答中各出现一次,对于链路层为以太网的情况可能是多余的,但如果链路层是其它类型的网络则有可能是必要的。

3. ARP 协议的工作流程

在这里插入图片描述
下面以一个具体的例子,来讲解 ARP 请求和应答:

路由器 D 要将数据转发给同一子网中的主机 B ,前提是必须得先知道主机 B 的 MAC 地址(因为数据包需要被封装成 MAC 帧才能发送出去)。但此时路由器 D 只知道主机 B 的 IP 地址,不知道主机 B 的 MAC 地址,所以路由器 D 会在 ARP 层构建一个 ARP 请求

  • 前四个字段分别填上 1 ,0x0800 ,6 ,4 。
  • op 填 1 ,表示这个 ARP 是请求。
  • 发送端以太网地址和发送端 IP 地址,对应填的就是路由器 D 的 MAC 地址和 IP 地址。
  • 目的以太网地址和目的 IP 地址,对应填的就是主机 B 的 MAC 地址和 IP 地址(因为路由器 D 不知道主机 B 的 MAC 地址,所以填的是全 1 ,表示在局域网中广播)。

ARP 请求构建完成后,将它向下交付给 MAC 帧层,封装成 MAC 帧。

将 ARP 请求封装成 MAC 帧的过程:

  • 以太网目的地址和源地址,对应填的就是主机 B 的 MAC 地址和路由器 D 的 MAC 地址(因为路由器 D 不知道主机 B 的 MAC 地址,所以填的是全 1 ,表示在局域网中广播)。
  • 类型填 0806 ,表示 ARP 请求/应答。
  • 由于 ARP 请求的长度只有 28 字节,不足 46 字节(MAC 帧规定的最小数据长度),所以需要在后面补上 18 字节的填充字段 PAD 。

MAC 帧封装完成后,路由器 D 就会把这个 MAC 帧以广播的方式发送到局域网中。

该局域网中的每台主机收到这个 MAC 帧后,先分析帧的目的地址字段,发现是全 1(局域网广播),于是都会在 MAC 帧层对它进行解包。通过分析,得知帧类型字段是 0806(表示 ARP 请求/应答),于是就会把 MAC 帧的数据向上交付给 ARP 层。ARP 层收到后,先分析 op 字段,得知是 1 ,就会将它判定为 ARP 请求,然后再将其中的目的 IP 地址字段与自身的 IP 地址进行比对,只有主机 B 发现它们是相等的,其余的主机发现它们是不相等的,于是其余的主机都在 ARP 层丢弃掉这个 ARP 请求,只有主机 B 会在 ARP 层对这个 ARP 请求进行应答。

主机 B 会在 ARP 层构建一个 ARP 应答

  • 前四个字段分别填上 1 ,0x0800 ,6 ,4 。
  • op 填 2 ,表示这个 ARP 是应答。
  • 发送端以太网地址和发送端 IP 地址,对应填的就是主机 B 的 MAC 地址和 IP 地址。
  • 目的以太网地址和目的 IP 地址,对应填的就是路由器 D 的 MAC 地址和 IP 地址(因为路由器 D 发来的 ARP 请求中有路由器 D 的 MAC 地址和 IP 地址,所以主机 B 是知道的)。

ARP 应答构建完成后,将它向下交付给 MAC 帧层,封装成 MAC 帧。

将 ARP 应答封装成 MAC 帧的过程:

  • 以太网目的地址和源地址,对应填的就是路由器 D 的 MAC 地址和主机 B 的 MAC 地址。
  • 类型填 0806 ,表示 ARP 请求/应答。
  • 由于 ARP 应答的长度只有 28 字节,不足 46 字节(MAC 帧规定的最小数据长度),所以需要在后面补上 18 字节的填充字段 PAD 。

MAC 帧封装完成后,主机 B 就会把这个 MAC 帧发送到局域网中。

该局域网中的每台主机收到这个 MAC 帧后,先将其中的以太网目的地址字段与自身的 MAC 地址进行比对,只有路由器 D 发现它们是相等的,其余的主机发现它们是不相等的,于是其余的主机都在 MAC 帧层丢弃掉这个 MAC 帧,只有路由器 D 会在 MAC 帧层对这个 MAC 帧进行解包。通过分析,得知帧类型字段是 0806(表示 ARP 请求/应答),于是就会把 MAC 帧的数据向上交付给 ARP 层。ARP 层收到后,先分析 op 字段,得知是 2 ,就会将它判定为 ARP 应答,于是就会提取出其中的发送端以太网地址和发送端 IP 地址字段,此时路由器 D 就拿到了主机 B 的 MAC 地址。

路由器 D 通过给主机 B 发送 ARP 请求并接收到来自主机 B 的 ARP 应答,拿到了主机 B 的 MAC 地址,满足了给同一子网中的主机 B 转发数据的前提。

于是,路由器 D 就可以将 IP 数据包封装成 MAC 帧转发给主机 B 了。

局域网中的任一台主机,地位是对等的,我可能给你发数据,你也可能给我发数据,意味着我可能想知道你的 MAC 地址,你也可能想知道我的 MAC 地址。所以,一台主机可能向别人发起 ARP 请求,也可能被别人发起 ARP 请求,即一台主机既有可能收到 ARP 请求,也有可能收到 ARP 应答,所以当 ARP 层收到一个 ARP 时,需要先看 op 字段,才能决定接下来应该采取哪种行为:如果 op 是 1 ,表示这个是 ARP 请求,接下来需要构建 ARP 应答来进行响应;如果 op 是 2 ,表示这个是 ARP 应答,接下来要提取其中的发送端以太网地址和发送端 IP 地址字段,将发送给目标主机的数据包封装成 MAC 帧,填上其中的目的 MAC 地址字段,发送到局域网中。


实际上,每次向目的主机转发数据时,并不是都要通过发起 ARP 请求和收到 ARP 应答来获取目的主机的 MAC 地址。

每台主机都会维护一张 ARP 缓存表(系统会缓存 IP 地址和 MAC 地址的映射关系)。缓存表中的表项有过期时间(一般是 20 分钟左右),如果在这个时间段内没有再次使用某个表项,则该表项失效,下次还要通过发起 ARP 请求和收到 ARP 应答来获取目的主机的 MAC 地址。

使用arp -a命令,可以查看 ARP 缓存表:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值