TCP/IP详解02-链路层
在 TCP/IP 协议族中, 链路层主要有三个目的:
- (1)为 IP 模块发送和接收 IP 数据报;
- (2)为 ARP 模块发送 ARP 请求和接收 ARP 应答;
- (3)为 RARP 发送 RARP 请求和接收 RARP 应答。
硬件: 以太网,令牌环网,FDDI(光纤分布式数据接口),RS-232串行线路等。
在本章中,我们将详细讨论以太网链路层协议(就是平时我们用的网卡),两个串行接口链路层协议( SLIP和PPP(就是adsl宽带)), 以及大多数实现都包含的环回( loopback)驱动程序。对 MTU(最大传输单元)进行了介绍, 这个概念在本书的后面章节中将多次遇到。我们还讨论了如何为串行线路选择 MTU。
1. 以太网和IEEE 802封装
联系linux里面的ifconfig -a命令,这个命令通常会得到如下的结果:
[lincoln@bj-develop-01 ~]$ ifconfig -a
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.4.1.62 netmask 255.255.255.0 broadcast 10.4.1.255
ether 52:54:00:cc:68:e3 txqueuelen 1000 (Ethernet)
RX packets 1082420957 bytes 934073951363 (869.9 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 726327520 bytes 1481350364607 (1.3 TiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 0 (Local Loopback)
RX packets 48717213 bytes 2817829144 (2.6 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 48717213 bytes 2817829144 (2.6 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
其中,eth0就是以太网接口,而lo则是loopback接口。这也说明这个主机在网络链路层上至少支持loopback协议和以太网协议。
以太网(Ether-net)的定是指数字设备公司( Digital Equipment Corp.)、英特尔公司(Intel Corp.)和Xerox公司在1982年联合公布的一个标准,这个标准里面使用了一种称作CSMA/CD的接入方法。而IEEE802提供的标准集802.3(还有一部分定义到了802.2中)也提供了一个CSMA/CD的标准。这两个标准稍有不同,TCP/IP协议对这种情况的处理方式如下:
- 以太网的IP数据报封装在RFC894中定义,而IEEE802网络的IP数据报封装在RFC1042中定义。
- 一台主机一定要能发送和接收RFC894定义的数据报。
- 一台主机可以接收RFC894和RFC1042的封装格式的混合数据报。
- 一台主机也许能够发送RFC1042数据报。如果主机能同时发送两种类型的分组数据,那么发送的分组必须是可以设置的,而且默认条件下必须是RFC 894分组。
可见,RFC1042在TCP/IP里面处于一个配角的地位。
1.1 IEEE 802.2/802.3(RFC 1042)和以太网的封装格式(RFC 894)
图中每个方框下面的数字是它们的字节长度。 两种帧格式都采用48 bit(6字节)的目的地址和源地址( 802.3允许使用16 bit的地址,但一般是48 bit地址)。这就是我们在本书中所称的硬件地址(也就是MAC地址)。
接下来的2个字节在两种帧格式中互不相同。在 802 标准定义的帧格式中, 长度字段是指它后续数据的字节长度,但不包括 CRC检验码。 以太网的类型字段定义了后续数据的类型。 在802标准定义的帧格式中, 类型字段则由后续的子网接入协议( Sub-network Access Protocol,SNAP)的首部给出。
在以太网帧格式中,类型字段之后就是数据;而在 802 帧格式中,跟随在后面的是 3字节的 802.2 LLC 和5字节的 802.2 SNAP。目的服务访问点( Destination Service Access Point, DSAP)和源服务访问点( Source Service Access Point, SSAP)的值都设为0xaa。Ctrl 字段的值设为3。随后的3个字节org code都置为0。再接下来的2个字节类型字段和以太网帧格式一样。
CRC 字段用于帧内后续字节差错的循环冗余码检验(检验和)(它也被称为FCS或帧检验序列)[下文有详细介绍]。
802.3标准定义的帧和以太网的帧都有最小长度要求。 802.3规定数据部分必须至少为 38字节,而对于以太网,则要求最少要有 46字节。 为了保证这一点, 必须在不足的空间插入填充 (pad)字节。
1.2 CRC 循环校验法
在发送端, 先把数据划分为组, 假定每组K个比特(K位), 同时假定待传送的一组数据M=101001(K=6), 我们在M的后面再添加供差错检测用的N位冗余码一起发送.
N位冗余码求解方法:
- 首先,用二进制的模2运算[一种特殊的运算: 00得1, 11得1, 01得0, 10得0, 但不进位/退位]进行2^N乘M的运算, 这相当于在M后面添加N个0;
- 然后, 用得到的(K+N)位的数除以事先选定好的长度为(N+1)位的除数P, 得出商为Q且余数是R, 余数R比除数P少1位, 即R是N位;
- 最后,使用R替换N个0, 即得到要发送的数据.
示例:
假设现在K=6, M=101001, 设N=3, 除数P=1101, 则被除数为(2\^N)*M = 101001000, 模2运算的结果为: 商110101, 余数R=001, 因此最终得到需要发送的数据位101001001
接收端校验:
接收端对收到的每一帧进行CRC校验如下:
- (1)若得出的余数R=0, 则判定这个帧没有差错, 接受accept;
- (2)若得出的余数R!=0, 则判定这个帧有差错, 丢弃abandon.
注意:这种检测方法并不能确定究竟是哪一个/几个比特出了差错, 但是只要经过严格的挑选, 并使用位数足够多的除数P, 那么出现检测不到的差错的概率就很小了;因此仅用循环冗余校验CRC差错检验技术只能做到”无差错接受”.
2. 串行接口链路层协议( SLIP和PPP)
这一部分详情参见教材。
2.1 SLIP:串行线路IP
全称:Serial Line IP,是一种在串行线路上对IP数据报进行封装的简单形式,适用于家庭中每台计算机几乎都有的RS-232串行端口和高速调节器接入Internet。
2.2 压缩的SLIP
由于串行线路速率低,而且通信经常是交互式的,因此SLIP线路上有许多小的tcp分组进行交换。为了传送1个字节的数据,需要20个字节的ip首部和20个字节的tcp首部!
CSLIP一般能把上面的40个字节压缩到3或5个字节,它能在CSLIP每一端维持多达16个tcp连接,并知道连接中某些字段一般是不变的。
2.3 PPP:点对点协议
ppp(点对点协议)是从SLIP的替代品,修改了SLIP协议中的所有缺陷。
3. 环回(loopback)接口
大多数的产品都支持环回接口( Loopback Interface),以允许运行在同一台主机上的客户程序和服务器程序通过 TCP/IP 进行通信。 A类网络号127就是为环回接口预留的。根据惯例,大多数系统把 IP 地址 127.0.0.1 分配给这个接口,并命名为 localhost。一个传给环回接口的 IP 数据报不能在任何网络上出现。
我们想象,一旦传输层检测到目的端地址是环回地址时,应该可以省略部分传输层和所有网络层的逻辑操作。但是大多数的产品还是照样完成传输层和网络层的所有过程,只是当 IP数据报离开网络层时把它返回给自己。
对于环回接口,有如下三点值得注意:
- 1) 传给环回地址(一般是127.0.0.1)的任何数据均作为IP输入。
- 2) 传给广播地址或多播地址的数据报复制一份传给环回接口, 然后送到以太网上。 这是因为广播传送和多播传送的定义包含主机本身。
- 3) 任何传给该主机IP地址的数据均送到环回接口。
看上去用传输层和 IP层的方法来处理环回数据似乎效率不高,但它简化了设计。
- 环回接口可以被看作是网络层下面的另一个链路层。网络层把一份数据报传送给环回接口,就像传给其他链路层一样,只不过环回接口把它返回到 IP的输入队列中。
- 另一个隐含的意思是送给主机本身 IP地址的 IP 数据报一般不出现在相应的网络上。例如,在一个以太网上,分组一般不被传出去然后读回来。由于一台主机必须处理发送给自己的IP数据报,因此图2-4所示的过程是最为简单的处理办法。
4. 最大传输单元 MTU 和路径MTU
以太网和 802.3对数据帧的长度都有一个限制,其最大值分别是 1500 和 149字节。链路层的这个特性称作 MTU,最大传输单元。如果 I P层有一个数据报要传, 而且数据的长度比链路层的 MTU 还大,那么 IP 层就需要进行分片( fragmentation),把数据报分成若干片,这样每一片都小于 MTU。
点到点的链路层(如SLIP和PPP)的MTU**并非指的是网络媒体的物理特性。相反,它是一个逻辑限制**,目的是为交互使用提供足够快的响应时间。
当在同一个网络上的两台主机互相进行通信时,该网络的 MTU 是非常重要的。 但是如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的 MTU。重要的不是两台主机所在网络的 MTU的值,重要的是两台通信主机路径中的最小 MTU。它被称作路径 MTU。
两台主机之间的路径 MTU不一定是个常数。它取决于当时所选择的路由。而选路不一定是对称的(从A到B的路由可能与从B到A的路由不同),因此路径MTU在两个方向上不一定是一致的。