两种不同的MAC帧格式 常用的以太网MAC帧格式有两种标准,一种是DIX Ethernet V2标准,另一种是IEEE的802.3标准。如下图所示,为便于理解,图中假定网络层使用的是IP协议。实际上使用其他的协议也是可以的。
现在MAC帧最常用的是以太网V2的格式,它较为简单,由5个字段组成。前两个字段分别为6字节长的目的地址和源地址字段。第三个字段是2字节的类型宇段,用来标志上一层使用的是什么协议,以便把收到的MAC帧的数据上交给上一层的这个协议。施乐公司负责管理这个类型字段的代码分配。例如,当类型字段的值是0x0800时,就表示上层使用的是IP数据报。若类型字段的值为0x8137,则表示该帧是由Novell IPX发过来的。第四个字段是数据字段,但它的正式名称是MAC客户数据宇段,其长度在46到1500字节之间。最后一个字段是4字节的帧检验序列FCS。 当数据字段的长度小于46字节时,MAC子层就会在数据字段的后面加入一个整数字节的填充字段,以保证以太网的MAC帧长不小于64字节。我们应当注意到,MAC帧的首部并没有指出数据字段的长度是多少。在有填充字段的情况下,接收端的MAC子层在剥去首部和尾部后就将数据字段和填充字段一起交给上层协议。 然而IEEE 802.3标准规定的MAC帧则较为复杂。它和以太网V2的MAC帧的区别是: (1)第三个字段是长度/类型字段。根据长度/类型字段的数值大小,这个字段可以表示MAC帧的数据字段长度(请注意:不是整个MAC帧的长度),也可以等同于以太网V2的类型字段。具体地讲: 若长度/类型字段的数值小于MAC帧的数据字段的最大值1500(字节),这个字段就表示MAC帧的数据字段长度。 若长度/类型字段的数值大于0x0600(相当于十进制的1536),那么这个数值就不可能表示以太网有效的数据字段长度,因而这个字段就表示类型。 当长度/类型字段表示类型时,802.3的MAC帧和以太网V2的MAC帧一样。当长度/类型字段表示长度时,MAC帧就必须装入802.2标准定义的LLC子层的LLC帧。 从图中可看出,在传输媒体上实际传送的要比MAC帧还多8个字节。这是因为当一个站在刚开始接收MAC帧时,由于尚未与到达的比特流达成同步,因此MAC帧的最前面的若干个比特就无法接收,结果使整个的MAC成为无用的帧。为了达到比特同步,从MAC子层向下传到物理层时还要在帧的前面插入8字节(由硬件生成),它由两个字段构成。第一个字段共7个字节,称为前同步码(1和0交替的码)。前同步码的作用是使接收端在接收MAC帧时能够迅速实现比特同步。第二个字段是帧开始定界符,定义为10101011,表示在这后面的信息就是MAC帧了。在MAC子层的FCS的检验范围不包括前同步码和帧开始定界符。顺便指出,在广域网点对点通讯中使用同步传输的HDLC规程时则不需要用前同步码,因为在同步传输时收发双方的比特同步总是一直保持着的。 802.3标准规定凡出现下列情况之一的即为无效的MAC帧: (1)MAC客户数据字段的长度与长度字段的值不一致; (2)帧的长度不是整数个字节; (3)用收到的帧检验序列FCS查出有差错; (4)收到的帧的MAC客户数据字段的长度不在46—1500字节之间。考虑到MAC帧首部的长度是18字节,可以得出有效的MAC帧长度为64~1518字节之间。 对于检查出的无效MAC帧就简单地丢弃。以太网不负责重传丢弃的帧。 当MAC客户数据字段的长度小于46字节时,则应加以填充(内容不限)。这样,整个MAC帧(包含14字节首部和4字节尾部)的最小长度是64字节,或512bit。 MAC子层的标准还规定了帧间最小间隔为9.6us,相当于96bit的发送时间。这就是说,一个站在检测到总线开始空闲后,还要等待9.6us才能发送数据。这样做是为了使刚刚收到数据帧的站的接收缓存来得及清理,做好接收下一帧的准备。 1)IP分组格式分析
IP数据报的格式能够说明IP协议都具有什么功能。在TCP/IP的标准中,各种数据格式常常以32bit(即4字节)为单位来描述。下图是IP数据报的完整格式。
一个IP数据报由首部和数据两部分组成。首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。首部各字段的意义如下: (1) IP数据报首部的固定部分中的各字段 a) 版本 占4bit,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。以前的3个版本目前已不使用。 (2) 首部长度 占4bit 可表示的最大数值是15个单位(一个单位为4字节),因此IP的首部长度的最大值是60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后一个填充字段加以填充。因此数据部分永远在4字节的整数倍时开始,这样在实现IP协议时较为方便。最常用的首部长度值就是20字节,即不使用任何选项。 (3) 服务类型 占8bit,用来获得更好的服务,其意义见图的上面部分所示。 a) 前三个比特表示优先级,它可使数据报具有8个优先级中的一个。 b) 第4个比特是D比特,表示要求有更低的时延。 c) 第5个比特是T比特,表示要求有更高的吞吐量。 d) 第6个比特是R比特,表示要求有更高的可靠性(即在数据报传送的过程中,被路由器丢弃的概率要更小些)。 e) 第7个比特是C比特,是新增加的,表示要求选择代价更小的路由。 f) 最后一个比特目前尚未使用。 (4) 总长度 总长度指首部和数据之和的长度,单位为字节。总长度字段为16bit,因此数据报的最大长度为65 535字节(即64KB)。在IP层下面的每一种数据链路层都有其自己的帧格式,其中包括帧格式中的数据宇段的最大长度MTU。当一个IP数据报封装成链路层帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层的MTU值.虽然使用尽可能长的数据报会使传输效率提高,但由于以太网的普遍应用,所以实际上 使用的数据报长度很少有超过1500字节的,而有时数据报长度还被限制在576字节。当数据报长度超过网络所容许的最大传送单元MTU时,就必须将过长的数据报进行分片后才能在网络上传送(见后面的“片偏移”字段)。这时,数据报首部中的“总长度”字段不是指未分片前的数据报长度,而是指分片后每片的首部长度与数据长度的总和。 (5) 标识(identification) 占16bit,它是一个计数器,用来产生数据报的标识。但这里的“标识”并没有序号的意思,因为IP是五连接服务,数据报不存在按序接收的问题。当IP协议发送数据报时,它就将这个计数器的当前值复制到标识字段中。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报片的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。 (6) 标志(flag) 占3bit目前只有前两个比特有意义。 a) 标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片’的数据报。MF=0表示这已是若干数据报片中的最后一个。 b) 标志字段中间的一位记为DF(Don'tFragment),意思是“不能分片”。只有当DF=0时才允许分片。 (7) 片偏移 较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对于用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64bit)的整数倍。 [例]一数据报的数据部分为3800字节长(使用固定首部),需要分片为长度不超 过1420字节的数据报片。因固定首部长度为20字节,因此每个数据报片的数据部分长度不能超过1400字节。于是分为3个数据报片,其数据部分的长度分别为1400,1400和1000字节。原始数据报首部被复制为各数据报片的首部,但必须修改有关字段的值。可能的分片按总长,标识,MF,DF,片偏移顺序排列如下: 原始数据报: 3820,12345,0,0,0 分片1: 1420,12345,1,0,0 分片2: 1420,12345,1,0,175 分片3: 1020,12345,0,0,350 标识字段的值是任意给定的。具有相同标识的数据报片在目的站就可无误地重装成原来的数据报。 现在假定数据报片2经过某个网络时还要再进行分片,即划分为数据报片2-1(携带数据800字节)和数据报片2-2(携带数据600字节)。那么这两个数据报片的总长度、标识、MF、DF和片偏移分别为:820,12345,1,0,175;620,12345,1,0,275。 (8) 生存时间 生存时间字段记为TTL(Time To Live),即数据报在网络中的寿命,其单位为秒。生存时间的建议值是32秒。但也可设定为3~4秒,甚至255秒。 例:tracert命令的分析,利用TTL检测网络节点 (9) 协议 占8bit,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。 (10)首部检验和 此字段只检验数据报的首部,不包括数据部分。这是因为数据报每经过一个结点,结点处理机都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。如将数据部分一起检验,计算的工作量就太大了。 (11)源地址 占4字节。 (12)目的地址 占4字节。 (13)可变部分:取决于需要。