让我们从一些重要的术语开始。在本章中,我们会发现将运行链路层(即第2层)协议的任何设备称为**节点(node)**是很方便的。节点包括主机、路由器、交换机和WiFi接入点(在第7章中讨论)。我们还将沿着通信路径连接相邻节点的通信信道称为**链路(links)**。为了将数据报从源主机传输到目的主机,必须将其移动到端到端路径中的每条链路上。例如,在图6.1底部所示的公司网络中,考虑从其中一台无线主机向其中一台服务器发送数据报。该数据报实际上将通过六条链路:发送主机和WiFi接入点之间的WiFi链路、接入点和链路层交换机之间的以太网链路、链路层交换机和路由器之间的链路、两台路由器之间的链路、路由器和链路层交换机之间的以太网链路,最后是交换机和服务器之间的以太网链路。在给定的链路上,发送节点将**数据报(datagram)**封装在**链路层帧(link-layer frame)**中,并将该帧发送到链路中。<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12377925/1637831238222-4d6dc350-19e4-485c-929b-272f408e9777.png#clientId=u04a5f26f-49fd-4&from=paste&height=788&id=ub16024e9&margin=%5Bobject%20Object%5D&name=image.png&originHeight=788&originWidth=673&originalType=binary&ratio=1&size=186087&status=done&style=none&taskId=u643e124a-7b3d-4179-863f-21efdaaadf1&width=673)<br />**Figure 6.1 ♦ Six link-layer hops between wireless host and server**<br />**图6.1♦无线主机和服务器之间的6个链路层跳数**<br />为了进一步深入了解链路层及其与网络层的关系,让我们考虑一个传输类比。假设有一家旅行社正在为一位从新泽西州普林斯顿到瑞士洛桑的游客计划一次旅行。旅行社决定,对游客来说,最方便的方式是从普林斯顿乘坐豪华轿车到肯尼迪机场,然后从肯尼迪机场乘坐飞机到日内瓦机场,最后从日内瓦机场乘坐火车到洛桑火车站。一旦旅行社预订了三个座位,普林斯顿豪华轿车公司就有责任把游客从普林斯顿送到肯尼迪机场;航空公司有责任把游客从肯尼迪机场送到日内瓦;瑞士火车公司有责任把游客从日内瓦送到洛桑。这三段行程中的每一段都是在两个“相邻”地点之间“直达”的。请注意,这三个运输部门由不同的公司管理,使用完全不同的运输方式(豪华轿车、飞机和火车)。虽然交通方式不同,但它们都提供将乘客从一个地点运送到邻近地点的基本服务。**在这个交通类比中,游客是数据报,每个交通段是链路,交通方式是链路层协议,旅行社是路由协议。**
6.1.1 链路层提供的服务 The Services Provided by the Link Layer
尽管任何链路层的基本服务都是通过单个通信链路将数据报从一个节点移动到相邻节点,但是所提供服务的细节可能因链路层协议不同而不同。链路层协议可能提供的服务包括:
- 组帧(Framing)。几乎所有链路层协议在通过链路传输之前都将每个网络层数据报封装在链路层帧中。帧由插入网络层数据报的数据字段和多个报头字段组成。帧的结构由链路层协议指定。当我们在本章的后半部分研究特定的链路层协议时,我们将看到几种不同的帧格式。
- 链接接入(Link access)。介质接入控制(medium access control,MAC)协议规定了帧在链路上传输的规则。对于链路一端只有一个发送器,链路另一端只有一个接收器的点对点链路,MAC协议很简单(或者根本不存在)-只要链路空闲,发送器就可以发送帧。更有趣的情况是多个节点共享一条广播链路,即所谓的多路接入问题(multiple access problem)。这里,MAC协议用于协调多个节点的帧传输。
- 可靠交付(Reliable delivery)。当链路层协议提供可靠的传送服务时,它保证在链路上无差错地移动每个网络层数据报。回想一下,某些传输层协议(例如TCP)也提供可靠的传输服务。与传输层可靠传送服务类似,链路层可靠传送服务可以通过确认和重传来实现(参见第3.4节)。链路层可靠传送服务通常用于容易出现高错误率的链路,例如无线链路,其目标是在发生错误的链路上本地纠正错误,而不是通过传输层或应用层协议强制数据的端到端重传。但是,对于误码率较低的链路(包括光纤、同轴电缆和许多双绞线铜缆链路),链路层可靠传输可能被认为是不必要的开销。因此,许多有线链路层协议不提供可靠的传输服务。
- 错误检测和纠正(Error detection and correction)。当帧作为1传输时,接收节点中的链路层硬件可能会错误地判定帧中的位为0,反之亦然。这样的误码是由信号衰减和电磁噪声引起的。由于不需要转发有错误的数据报,因此许多链路层协议提供了检测此类比特错误的机制。这是通过让发送节点在帧中包括检错比特,并让接收节点执行错误校验(error check)来实现的。回想一下第3章和第4章,Internet的传输层和网络层还提供有限形式的错误检测-Internet校验和(checksum)。链路层中的错误检测通常更复杂,并且在硬件中实现。纠错(Error correction)类似于错误检测,不同之处在于接收器不仅检测帧中何时发生比特错误,而且还准确地确定错误发生在帧中的哪个位置(然后纠正这些错误)。
6.1.2 链路层在哪里实现? Where Is the Link Layer Implemented?
在深入研究链路层之前,让我们先考虑链路层在哪里实现的问题来结束本简介。主机的链路层是在硬件中实现还是在软件中实现?它是在单独的卡或芯片上实现的,它如何与主机的其余硬件和操作系统组件连接?
图6.2显示了典型的主机架构。以太网功能可以集成到主板芯片组中,也可以通过低成本的专用以太网芯片实现。在大多数情况下,链路层在称为网络适配器(network adapter)(有时也称为网络接口控制器(network interface controller,NIC))的芯片上实现。网络适配器实现了许多链路层服务,包括组帧、链路接入、错误检测等。因此,链路层控制器的大部分功能都是在硬件中实现的。例如,英特尔的802.11系列适配器[英特尔2020]实现了我们将在第6.5节学习的以太网协议;Atheros AR5006[Atheros 2020]控制器实现了我们将在第7章学习的802.11 WiFi协议。
Figure 6.2 ♦ Network adapter: Its relationship to other host components and to protocol stack functionality
图6.2.♦网络适配器:它与其他主机组件和协议栈功能的关系
在发送端,控制器获取由协议栈的较高层创建并存储在主机内存中的数据报,将该数据报封装在链路层帧中(填充该帧的各个字段),然后按照链路访问协议将该帧传输到通信链路中。在接收端,控制器接收整个帧,并提取网络层数据报。如果链路层执行错误检测,则由发送控制器设置帧头中的错误检测位,并由接收控制器执行错误检测。
图6.2显示,虽然大部分链路层在硬件中实现,但部分链路层在主机CPU上运行的软件中实现。链路层的软件组件实现更高级别的链路层功能,例如组装链路层地址信息和激活控制器硬件。在接收端,链路层软件响应控制器中断(例如,由于接收到一个或多个帧),处理错误情况并将数据报向上传递到网络层。因此,链路层是硬件和软件的组合,即协议栈中软件与硬件相遇的位置。[英特尔2020]从软件编程的角度提供了XL710控制器的可读性概述(以及详细说明)。