Files
netstack/tcpip/link
impact-eintr 5414cd9ce6 link'
2021-07-25 16:21:21 +08:00
..
2021-07-21 21:15:21 +08:00
2021-07-25 16:21:21 +08:00

链路层

链路层的介绍和基本实现

本节主要介绍链路层的基本实现,主要讲以太网网卡、虚拟网卡和 arp 协议。

链路层的目的

数据链路层属于计算机网络的底层,使用的信道主要有点对点信道和广播信道两种类型。 在 TCP/IP 协议族中,数据链路层主要有以下几个目的:

  1. 接收和发送链路层数据,提供 io 的能力。
  2. 为 IP 模块发送和接收数据
  3. 为 ARP 模块发送 ARP 请求和接收 ARP 应答
  4. 为 RARP 模块发送 RARP 请求和接收 RARP 应答 TCP/IP 支持多种不同的链路层协议,这取决于网络所使用的硬件。 数据链路层的协议数据单元—帧:将 IP 层(网络层)的数据报添加首部和尾部封装成帧。 数据链路层协议有许多种,都会解决三个基本问题,封装成帧,透明传输,差错检测。

以太网介绍

我们这章讲的是链路层,为何要讲以太网,那是因为以太网实在应用太广了,以至于我们在现实生活中看到的链路层协议的数据封装都是以太网协议封装的,所以要实现链路层数据的处理,我们必须要了解以太网。

以太网Ethernet是一种计算机局域网技术。IEEE 组织的 IEEE 802.3 标准制定了以太网的技术标准它规定了包括物理层的连线、电子信号和介质访问层协议的内容。以太网是目前应用最普遍的局域网技术取代了其他局域网标准如令牌环、FDDI 和 ARCNET。以太网协议是当今现有局域网采用的最通用的通信协议标准故可认为以太网就是局域网。

链路层的寻址

通信当然得知道发送者的地址和接受者的地址,这是最基础的。以太网规定,所有连入网络的设备,都必须具有“网卡”接口。然后数据包是从一块网卡,传输到另一块网卡的。网卡的地址,就是数据包的发送地址和接收地址,叫做 MAC 地址,也叫物理地址,这是最底层的地址。每块网卡出厂的时候,都有一个全世界独一无二的 MAC 地址,长度是 48 个二进制位,通常用 12 个十六进制数表示。有了这个地址,我们可以定位网卡和数据包的路径了。

MTU最大传输单元

MTU 表示在链路层最大的传输单元也就是链路层一帧数据的数据内容最大长度单位为字节MTU 是协议栈实现一个很重要的参数,请大家务必理解该参数。一般网卡默认 MTU 是 1500当你往网卡写入的内容超过 1518bytes就会报错后面我们可以写代码试试。

上面的图片是 linux 上链路层的实现,链路层的实现可以分为三层,真实的以太网卡,网卡驱动,网卡逻辑抽象。

真实的网卡我们不关心,因为那是硬件工程,我们只需要知道,它能接收和发送网络数据给网卡驱动就好了。网卡驱动我们也不关心,一般驱动都是网卡生产商就写好了,我们只需知道,它能接收协议栈的数据发送给网卡,接收网卡的数据发送给协议栈。网卡逻辑抽象表示,这个是我们关心的,我需要对真实的网卡进行抽象,

在系统中表示,也需要对抽象的网卡进行管理。

注意:后面系统中网卡的逻辑抽象我们都描述为网卡。

比如在 linux 上,当你敲下 ifconfig 命令,会输出类似如下内容:

eth0      Link encap:Ethernet  HWaddr 00:16:3e:08:a1:7a
          inet addr:172.18.153.158  Bcast:172.18.159.255  Mask:255.255.240.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:285941546 errors:0 dropped:0 overruns:0 frame:0
          TX packets:281609568 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:142994767953 (142.9 GB)  TX bytes:44791940275 (44.7 GB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:363350690 errors:0 dropped:0 overruns:0 frame:0
          TX packets:363350690 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:28099158493 (28.0 GB)  TX bytes:28099158493 (28.0 GB)

示例里显示了两个网卡,一个 eth0 以太网网卡,一个 lo 本地回环网卡。还可以看到两个网卡的信息,当我们要表示一个网卡的时候,需要具备几个属性:

  1. 网卡的名字、类型和 MAC 地址
  • eth0 Link encap:Ethernet HWaddr 00:16:3e:08:a1:7a
    • eth0是网卡名方便表示一个网卡网卡名在同个系统里不能重复
    • Link encap:Ethernet 表示该网卡类型为以太网网卡。
    • HWaddr 00:16:3e:08:a1:7a 表示 MAC 地址 00:16:3e:08:a1:7a是链路层寻址的地址。
  1. 网卡的 IP 地址及掩码
  • inet addr:172.18.153.158 Bcast:172.18.159.255 Mask:255.255.240.0
    • inet addr:172.18.153.158 表示该网卡的 ipv4 地址是 172.18.153.158。
    • Bcast:172.18.159.255 表示该网卡 ip 层的广播地址。
    • 255.255.240.0 该网卡的子网掩码。
  1. 网卡的状态和 MTU
  • UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    • UP BROADCAST RUNNING MULTICAST都是表示网卡的状态UP代表网卡开启状态
    • BROADCAST (支持广播) RUNNING代表网卡的网线被接上MULTICAST支持组播
    • MTU:1500 最大传输单元为 1500 字节。
    • Metric:1 接口度量值为 1接口度量值表示在这个路径上发送一个分组的成本。