第2章 链路层
2.1 引言
链路层主要有三个目的:
- 为IP模块发送和接收IP数据报。
- 为ARP模块发送ARP请求和接收ARP应答。
- 为RARP发送RARP请求和接收RARP应答。
将详细讨论:
- 以太网链路层协议。
- 两个串行接口链路层协议(SLIP 和 PPP)。
- 环回(loopback)驱动程序。
- 以太网和SLIP是本书中大多数例子使用的链路层。
2.2 以太网和IEEE802封装
以太网:它采用一种CSMA/CD(带冲突检测的载波监听多路接入机制),它的速率为10Mb/s,地址为48bit。
802.3针对整个CSMA/CD网络,802.4针对令牌总线网络,802.5针对令牌环网络;这三者的共同特性由802.2标准来定义,那就是802网络共有的逻辑链路控制(LLC)。(不幸的是,802(802.2和802.3)的封装格式与以太网的封装格式是不同)
以太网和IEEE 802的 RFC 要求每一台 Internet 主机都与一个 10Mb/s 的以太网电缆相连接。
- 必须能发送和接收采用 RFC 894(以太网) 封装格式的分组。
- 应该能接收与 RFC 894 混合的 RFC 1042(IEEE802) 封装格式的分组。
- 也许能够发送采用 RFC 1042 格式封装的分组。如果主机能同时发送两种类型的分组数据,那么发送的分组必须是可以设置的,而且默认条件下必须是RFC 894分组。
下面给出802.3和以太网封装格式:
(看完这个,表示懵逼了一会。802.3针对整个CSMA/CD网络了,为什么还会有以太网封装格式?答案很简单,802.3是以太网的标准封装格式。所以,我们可以将重心放在802.3封装格式上。)
2.3 尾部封装(过时)
RFC 893[Leffler and Karels 1984]描述了另一种用于以太网的封装格式,称作尾部封装(trailer encapsulation)。这是一个早期 BSD 系统在 DEC VAX 机上运行时的试验格式,它通过调整 IP数据报中字段的次序来提高性能。在以太网数据帧中,开始的那部分是变长的字段(IP首部和TCP首部)。把它们移到尾部(在 CRC 之前),这样当把数据复制到内核时,就可以把数据帧中的数据部分映射到一个硬件页面,节省内存到内存的复制过程。 TCP 数据报的长度是512字节的整数倍,正好可以用内核中的页表来处理。两台主机通过协商使用 ARP 扩展协议对数据帧进行尾部封装。这些数据帧需定义不同的以太网帧类型值。
现在,尾部封装已遭到反对。
2.4 SLIP:串行线路IP
SLIP的全称是Serial Line IP。SLIP适用于家庭中,因为每台计算机机会都会有RS-232串行端口和高速调制解调器接入Internet。
SLIP报文封装:
SLIP 协议定义的帧格式:
- IP数据报以一个称作 END(0xc0)的特殊字符结束。同时,为了防止数据报到来之前的线路噪声被当成数据报内容,大多数实现在数据报的开始处也传一个 END 字符(如果有线路噪声,那么 END 字符将结束这份错误的报文。这样当前的报文得以正确地传输,而前一个错误报文交给上层后,会发现其内容毫无意义而被丢弃)。
- 如果 IP 报文中某个字符为 END,那么就要连续传输两个字节 0xdb 和 0xdc 来取代它。0xdb 这个特殊字符被称作 SLIP 的 ESC 字符,但是它的值与 ASCII 码的 ESC 字符(0x1b)不同。
- 如果 IP 报文中某个字符为 SLIP 的 ESC 字符,那么就要连续传输两个字节 0xdb 和 0xdd 来
取代它。
SLIP协议的缺陷:
- 每一端必须知道对方的 IP 地址。没有办法把本端的 IP 地址通知给另一端。
- 数据帧中没有类型字段(类似于以太网中的类型字段)。如果一条串行线路用于 SLIP,那么它不能同时使用其他协议。
- SLIP 没有在数据帧中加上检验和(类似于以太网中的 CRC 字段)。如果 SLIP 传输的报文被线路噪声影响而发生错误,只能通过上层协议来发现(另一种方法是,新型的调制解调器可以检测并纠正错误报文)。这样,上层协议提供某种形式的 CRC 就显得很重要。
因此,随着调制解调器的速率和可靠性的提高,SLIP越来越流行。
2.5 压缩的SLIP
由于串行线路的速率比较低(19200b/s或更低),而且通信经常是交互式的,因此在SLIP线路上有许多小的TCP分组进行交换。为了传送1个字节的数据需要20个字节的IP首部和20个字节的TCP首部,总数超过40个字节。
认识到这些性能上的缺陷,人们提出一个被称作 CSLIP(即压缩SLIP) 的新协议,它在 RFC1144[Jacobson 1990a] 中被详细描述。CSLIP一般能把上面的40个字节压缩到3或5个字节,它能在CSLIP的每一端维持多达16个TCP连接,并且知道其中每个连接的首部中某些字段一般不会发生变化。对于那些发生变化的字段,大多数只是一些小的数字和改变。这些被压缩的首部大大缩短了交互响应时间。
2.6 PPP:点对点协议(支持IP等各种上层协议)
PPP,点对点协议修改了SLIP协议中的所有缺陷。
- 在串行链路上封装IP数据报的方法。PPP既支持数据为8位和无奇偶校验的异步模式,还支持面向比特的同步链接。
- 建立、配置及测试数据链路的链路控制协议(LCP)。它允许通信双方进行协商,以确定不同的选项。
- 针对不同网络层协议的网络控制协议(NCP)体系。当前RFC定义的网络层有IP、OSI网络层、DECnet以及AppleTalk。例如:IP NCP允许双方商定是否对报文首部进行压缩,类似于CSLIP(注:缩写词NCP也用来指TCP的前身)。
RFC 1548描述了报文封装的方法和链路控制协议。RFC 1332描述了针对IP的网络控制协议。
PPP 数据帧的格式看上去很像 ISO 的 HDLC(高层数据链路控制) 标准。
PPP数据帧格式:
- 每一帧都以标志字符 0x7e 开始和结束。紧接着是一个地址字节,值始终是 0xff,然后是一个值为 0x03 的控制字节;
- 协议字段;
- CRC循环冗余校验码。
由于标志字符的值是 0x7e,因此当该字符出现在信息字段中时, PPP 需要对它进行转义。
- 当遇到字符 0x7e 时,需连续传送两个字符:0x7d 和 0x5e,以实现标志字符的转义;
- 当遇到转义字符 0x7d 时,需连续传送两个字符:0x7d 和 0x5d,以实现转义字符的转义;
- 默认情况下,如果字符的值小于 0x20(比如,一个 ASCII 控制字符),一般都要进行转义。
PPP 比 SLIP 具有下面这些优点:
- PPP 支持在单根串行线路上运行多种协议,不只是 IP 协议;
- 每一帧都有循环冗余检验;
- 通信双方可以进行 IP 地址的动态协商(使用IP 网络控制协议);
- 与 CSLIP 类似,对 TCP 和 IP 报文首部进行压缩;
- 链路控制协议可以对多个数据链路选项进行设置。
这些优点付出的代价是在每一帧的首部增加3个字节,当建立链路时要发送几帧协商数据,以及更为复杂的实现。
PPP最终将会取代SLIP。
2.7 环回接口
大多数的产品都支持环回接口(Loopback Interface),以允许运行在同一台主机上的客户程序和服务器程序通过 TCP/IP 进行通信。 A类网络号 127 就是为环回接口预留的。根据惯例,大多数系统把 IP 地址 127.0.0.1 分配给这个接口,并命名为 localhost 。一个传给环回接口的 IP 数据报不能在任何网络上出现。
环回接口处理I P数据报的简单过程:
关键点:
- 传给环回地址(一般是 127.0.0.1)的任何数据均作为 IP 输入;
- 传给广播地址或多播地址的数据报复制一份传给环回接口,然后送到以太网上。这是因为广播传送和多播传送的定义包含主机本身;
- 任何传给该主机 IP 地址的数据均送到环回接口。
2.8 最大传输单元MTU
如果 IP 层有一个数据报要传,而且数据的长度比链路层的 MTU 还大,那么 IP 层就需要进行分片(fragmentation),把数据报分成若干片,这样每一片都小于 MTU 。
如图,几种常见的MTU:
正如我们看到的,所学的以太网和IEEE 802.3还有点对点的MTU都被列出。不难发现,MTU是指数据帧的数据部分的长度。
2.9 路径MTU
当在同一个网络上的两台主机互相进行通信时,该网络的 MTU是非常重要的。但是如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的 MTU。重要的不是两台主机所在网络的 MTU的值,重要的是两台通信主机路径中的最小 MTU。它被称作路径 MTU。
2.10 串行线路吞吐量计算
如果线路速率是9600 b/s,而一个字节有 8 bit,加上一个起始比特和一个停止比特,那么线路的速率就是960 B/s(字节/秒)。
2.11 小结
- 链路层协议。我们比较了以太网和 IEEE 802.2/802.3 的封装格式,以及 SLIP 和 PPP 的封装格式。由于 SLIP 和 PPP 经常用于低速的链路,二者都提供了压缩不常变化的公共字段的方法。这使交互性能得到提高。
- 大多数的实现都提供环回接口。访问这个接口可以通过特殊的环回地址,一般为 127.0.0.1 。也可以通过发送 IP 数据报给主机所拥有的任一 IP 地址。当环回数据回到上层的协议栈中时,它已经过传输层和 IP 层完整的处理过程。
- 我们描述了很多链路都具有的一个重要特性,MTU,相关的一个概念是路径 MTU。根据典型的串行线路 MTU,对 SLIP 和 CSLIP 链路的传输时延进行了计算。
练习
如果你的系统支持 netstat(1) 命令(参见 3.9 节),那么请用它确定系统上的接口及其 MTU 。netstat详解