第2章链路层
2.1 引言
在TCP/IP协议族中,链路层主要有三个目的:
1)为IP模块发送和接收IP数据报;
2)为ARP模块发送ARP请求和接收ARP应答;
3)为RARP发送RARP请求和接收RARP应答。
TCP/IP支持多种不同的链路层协议,这取决于网络所使用的硬件,
如以太网、令牌环网、F D D I(光纤分布式数据接口)及R S-2 3 2串行线路等。
我们将详细讨论以太网链路层协议,两个串行接口链路层协议( SLIP和PPP),
以及大多数实现都包含的环回( l o o p b a c k)驱动程序。
以太网和SLIP是本书中大多数例子使用的链路层。
对MTU(最大传输单元)进行了介绍,这个概念在本书的后面章节中将多次遇到。
2.2 以太网和IEEE 802封装
以太网这个术语一般是指数字设备公司( Digital Equipment Corp.)、
英特尔公司( I n t e l C o r p .)和X e r o x公司在1 9 8 2年联合公布的一个标准。
它是当今TCP/IP采用的主要的局域网技术。
它采用一种称作C S M A/ C D的媒体接入方法,其意思是带冲突检测的载波侦听多路接入。
它的速率为10 Mb/s,地址为48 bit。
几年后, IEEE(电子电气工程师协会) 802委员会公布了一个稍有不同的标准集,
其中802.3针对整个C S M A/ C D网络,802.4针对令牌总线网络, 802.5针对令牌环网络。
这三者的共同特性由802.2标准来定义,那就是802网络共有的逻辑链路控制( L L C)。
不幸的是,802.2和802.3定义了一个与以太网不同的帧格式。
文献[Stallings 1987]对所有的IEEE 802标准进行了详细的介绍。
802.3标准定义的帧和以太网的帧都有最小长度要求。
802.3规定数据部分必须至少为3 8字节,而对于以太网,则要求最少要有4 6字节。
为了保证这一点,必须在不足的空间插入填充(p a d)字节。
在开始观察线路上的分组时将遇到这种最小长度的情况。
我们在需要的时候将给出以太网的封装格式,因为这是最为常见的封装格式。
2.3 尾部封装
RFC 893[Leffler and Karels 1984]描述了另一种用于以太网的封装格式,称作尾部封装。
这是一个早期B S D系统在DEC VA X机上运行时的试验格式,它通过调整IP数据报中字段的次序来提高性能。
在以太网数据帧中,开始的那部分是变长的字段(IP首部和TCP首部)。
把它们移到尾部(在C R C之前)这样当把数据复制到内核时,
就可以把数据帧中的数据部分映射到一个硬件页面,节省内存到内存的复制过程。
TCP数据报的长度是5 1 2字节的整数倍,正好可以用内核中的页表来处理。
两台主机通过协商使用ARP扩展协议对数据帧进行尾部封装。
这些数据帧需定义不同的以太网帧类型值。现在,尾部封装已遭到反对,因此我们不对它举任何例子。
2.4 SLIP:串行线路IP
SLIP的全称是Serial Line IP。
它是一种在串行线路上对IP数据报进行封装的简单形式,在RFC 1055[Romkey 1988]中有详细描述。
SLIP适用于家庭中每台计算机几乎都有的R S - 2 3 2串行端口和高速调制解调器接入Internet。
下面的规则描述了SLIP协议定义的帧格式:
1) IP数据报以一个称作E N D(0 x c 0)的特殊字符结束。
同时,为了防止数据报到来之前的线路噪声被当成数据报内容,
大多数实现在数据报的开始处也传一个E N D字符(如果有线路噪声,那么E N D字符将结束这份错误的报文。
这样当前的报文得以正确地传输,而前一个错误报文交给上层后,会发现其内容毫无意义而被丢弃)。
2) 如果IP报文中某个字符为E N D,那么就要连续传输两个字节0 x d b和0 x d c来取代它。
0 x d b这个特殊字符被称作SLIP的E S C字符,但是它的值与A S C I I码的E S C字符(0 x 1 b)不同。
3) 如果IP报文中某个字符为SLIP的E S C字符,那么就要连续传输两个字节0 x d b和0 x d d来取代它。
SLIP仍然是一种广泛使用的协议。
SLIP的历史要追溯到1 9 8 4年,Rick Adams第一次在4.2 B S D系统中实现。
它本身的描述是一种非标准的协议,但是随着调制解调器的速率和可靠性的提高,SLIP越来越流行。
现在,它的许多产品可以公开获得,而且很多厂家都支持这种协议。
2.5 压缩的SLIP
由于串行线路的速率通常较低( 19200 b/s或更低),
而且通信经常是交互式的(如Te l n e t和R l o g i n,二者都使用TCP),
因此在SLIP线路上有许多小的TCP分组进行交换。
为了传送1个字节的数据需要2 0个字节的IP首部和2 0个字节的TCP首部,总数超过4 0个字节。
既然承认这些性能上的缺陷,于是人们提出一个被称作C SLIP(即压缩SLIP)的新协议,
它在RFC 1144[Jacobson 1990a]中被详细描述。C SLIP一般能把上面的4 0个字节压缩到3或5个字节。
它能在C SLIP的每一端维持多达1 6个TCP连接,并且知道其中每个连接的首部中的某些字段一般不会发生变化。
对于那些发生变化的字段,大多数只是一些小的数字和的改变。这些被压缩的首部大大地缩短了交互响应时间。
现在大多数的SLIP产品都支持C SLIP。
2.6 PPP:点对点协议
PPP,点对点协议修改了SLIP协议中的所有缺陷。
PPP包括以下三个部分:
1) 在串行链路上封装IP数据报的方法。
PPP既支持数据为8位和无奇偶检验的异步模式,还支持面向比特的同步链接。
2) 建立、配置及测试数据链路的链路控制协议( L C P:Link Control Protocol)。
它允许通信双方进行协商,以确定不同的选项。
3) 针对不同网络层协议的网络控制协议( N C P:Network Control Protocol)体系。
当前RFC定义的网络层有IP、O S I网络层、D E C n e t以及A p p l e Ta l k。
例如,IP NCP允许双方商定是否对报文首部进行压缩,类似于C SLIP。
RFC 1548[Simpson 1993]描述了报文封装的方法和链路控制协议。
RFC 1332[McGregor1 9 9 2 ]描述了针对IP的网络控制协议。
PPP数据帧的格式看上去很像I S O的H D L C(高层数据链路控制)标准。
尽管PPP比SLIP有更多的优点,但是现在的SLIP用户仍然比PPP用户多。
随着产品越来越多,产家也开始逐渐支持PPP,因此最终PPP应该取代SLIP。
2.7 环回接口
大多数的产品都支持环回接口( Loopback Interface),
以允许运行在同一台主机上的客户程序和服务器程序通过TCP/IP进行通信。
A类网络号1 2 7就是为环回接口预留的。
根据惯例,大多数系统把IP地址127.0.0.1分配给这个接口,并命名为l o c a l h o s t。
一个传给环回接口的IP数据报不能在任何网络上出现。
我一旦传输层检测到目的端地址是环回地址时,应该可以省略部分传输层和所有网络层的逻辑操作。
大多数的产品还是照样完成传输层和网络层的所有过程,只是当IP数据报离开网络层时把它返回给自己。
2.8 最大传输单元MTU
以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1 5 0 0和1 4 9 2字节。
链路层的这个特性称作MTU,最大传输单元。
不同类型的网络大多数都有一个上限。
如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,
那么IP层就需要进行分片,把数据报分成若干片,这样每一片都小于MTU。
2.9 路径MTU
当在同一个网络上的两台主机互相进行通信时,该网络的MTU是非常重要的。
但是如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的MTU。
重要的不是两台主机所在网络的MTU的值,重要的是两台通信主机路径中的最小MTU。
它被称作路径MTU。两台主机之间的路径MTU不一定是个常数。
它取决于当时所选择的路由。而选路不一定是对称的(从A到B的路由可能与从B到A的路由不同),
因此路径MTU在两个方向上不一定是一致的。
RFC 1191[Mogul and Deering 1990]描述了路径MTU的发现机制,即在任何时候确定路径MTU的方法。
t r a c e r o u t e程序也是用这个方法来确定到达目的节点的路径MTU。
在11.8节和2 4.2节,将介绍当产品支持路径MTU的发现方法时,U D P和TCP是如何进行操作的。
2.10 串行线路吞吐量计算
如果线路速率是9600 b/s,而一个字节有8 bit,加上一个起始比特和一个停止比特,
那么线路的速率就是960 B/s(字节/秒)。以这个速率传输一个1 0 2 4字节的分组需要1066 ms。
如果用SLIP链接运行一个交互式应用程序,同时还运行另一个应用程序如F T P发送或接收1 0 2 4字
节的数据,那么一般来说就必须等待一半的时间( 533 ms)才能把交互式应用程序的分组数据发送出去。
关于人的有关研究表明,交互响应时间
超过1 0 0~200 ms就被认为是不好的[Jacobson 1990a]。这是发送一份交互报文出去后,
直到接收到响应信息(通常是出现一个回显字符)为止的往返时间。
2.11 小结
本章讨论了Internet协议族中的最底层协议,链路层协议。
我们比较了以太网和IEEE802.2/ 802.3的封装格式,以及SLIP和PPP的封装格式。
由于SLIP和PPP经常用于低速的链路,二者都提供了压缩不常变化的公共字段的方法。
这使交互性能得到提高。大多数的实现都提供环回接口。
访问这个接口可以通过特殊的环回地址,一般为127.0.0.1。
也可以通过发送IP数据报给主机所拥有的任一IP地址。
当环回数据回到上层的协议栈中时,它已经过传输层和IP层完整的处理过程。
我们描述了很多链路都具有的一个重要特性, MTU,相关的一个概念是路径MTU。
根据典型的串行线路MTU,对SLIP和C SLIP链路的传输时延进行了计算。
本章的内容只覆盖了当今TCP/IP所采用的部分数据链路公共技术。
TCP/IP成功的原因之一是它几乎能在任何数据链路技术上运行。
习题
2.1 如果你的系统支持netstat命令,
那么请用它确定系统上的接口及其MTU。
windows->cmd->netstat /?