我们在上一文中介绍了以太网5层模型,这一节我想学习一下以太网数据封装与解封的知识,了解以太网数据是如何传输的。
一、数据封装
当我们应用程序用TCP传输数据的时候,数据被送入协议栈中,然后逐个通过每一层,知道最后到物理层数据转换成比特流,送入网络。而再这个过程中,每一层都会对要发送的数据加一些首部信息。整个过程如下图。

如图可以看出,每一层数据是由上一层数据+本层首部信息组成的,其中每一层的数据
,称为本层的协议数据单元 ,即PDU.
应用
层数据在传输层添加TCP报头后得到的PDU被称为 Segment(数据段 ),图示为TCP段
传输层的数据(TCP段)传
给网络层,网络层添加IP报头得到的PDU被称为Packet(数据包); 图示为IP数据包
网络层
数据报(IP数据包)被传递到数据链路层,封装数据链路层报头得到的PDU被称为Frame(数据帧),图示为以太网帧。
最后,帧被转换为比特,通过网络介质传输。
这种协议栈逐层向下传递数据,并添加报头和报尾的过程称为封装。
二、数据格式
需要注意的是,这里所说的以太网帧,与我们常说的以太网是不一样的。下面我们就来介绍每一层数据的 首部信息 内容。
首先我们知道世界上有个协会叫作IEEE,即电子工程师协会,里面有个分会,叫作IEEE802委员会,是专门来制定局域网各种标准的。而802下面还有个分部,叫作802.3.就是我们经常提到的 IEEE802.3,这个部门制定的规范叫以太网规范,这个以太网规范中就定义了上面提到的“以太网首部”,这个以太网规范,实际只定义了数据链路层中的MAC层和物理层规范。(注意数据链路层包括MAC子层和LLC子层两个子层,而LLC子层是在IEEE802.2中规范的)。
1、以太网帧格式
以太网常用帧格式有两种,
一种是Ethernet II,另一种是IEEE 802.3 格式。这两种格式区别是:Ethernet II中包含一个Type字 段,。而IEEE 802.3格式中,此位置是长度字段。
其中Type字段描述了,以太网首部 后面所跟数据包的类型,例如Type为0x8000时为IP协议包,Type为8060时,后面为ARP协议包。以太网中多数数据帧使用的是
Ethernet II帧格式。
a、
Ethernet II帧格式

b、
IEEE 802.3
帧格式

前导码:
Ethernet II是由
8个8‘b10101010构成,
IEEE802.3由7个
8‘b10101010+1个字节SFD..
目的地址:目的设备的MAC物理地址。
源 地址 :发送设备的MAC物理地址。
类型(
Ethernet II)
:
以太网首部 后面所跟数据包的类型,例如Type为0x8000时为IP协议包,Type为8060时,后面为ARP协议包。
长度(
IEEE802.3
):当长度小于1500时,说明该帧为
IEEE802.3帧格式,大于1500时,说明该帧为
Ethernet II帧格式。
数据:数据长度最小为46字节,不足46字节时,填充至46字节。因为最小帧长度是64字节,所以,46+6+6+2+4=64。(不算前导码)
FCS: 就是CRC校验值
以太网首部就是:

2、IP数据包格式
IP数据包格式如下图。IP首部,如图也表示出来了。

1) 版本号 4位:表示IP协议的版本号,如目前广泛使用的是IPv4,还有其他版本的IP协议,如IPv6。通信两端协议必须一致。一般的值为0100(IPv4),0110(IPv6)。
2) 首部长度:占 4 位,可表示的最大十进制数值是 15。请注意,这个字段所表示数的单位是 32位字 ( 1 个 32位字长是 4 字节 ),因此,当 IP 的首部长度为 1111 时 (即十进制的 15),首部长度就达到 60字节。当 IP 分组的首部长度不是 4字节的整数倍时,必须利用最后的填充字段加以填充。因此数据部分永远在 4字节的整数倍开始,这样在实现 IP协议时较为方便。首部长度限制为 60字节的缺点是有时可能不够用。这样做的目的是希望用户尽量减少开销。最常用的首部长度就是 20 字节 (即首部长度为 0101),这时不使用任何选项。
2) 首部长度:占 4 位,可表示的最大十进制数值是 15。请注意,这个字段所表示数的单位是 32位字 ( 1 个 32位字长是 4 字节 ),因此,当 IP 的首部长度为 1111 时 (即十进制的 15),首部长度就达到 60字节。当 IP 分组的首部长度不是 4字节的整数倍时,必须利用最后的填充字段加以填充。因此数据部分永远在 4字节的整数倍开始,这样在实现 IP协议时较为方便。首部长度限制为 60字节的缺点是有时可能不够用。这样做的目的是希望用户尽量减少开销。最常用的首部长度就是 20 字节 (即首部长度为 0101),这时不使用任何选项。
3) 服务: 占
8 位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。
1998年
IETF把这个字段改名为区分服务
DS (DifferentiatedServices)。只有在使用区分服务时,这个字段才起作用。
4) 总长度:总长度指首都及数据之和的长度,单位为字节。因为总长度字段为
16位,所以数据报的最大长度为
216-1=65 535字节。
在
IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,即最大传送单元
MTU (Maximum Transfer Unit)。当一个数据报封装成链路层的帧时,此数据报的总长度
(即首部加上数据部分
)一定不能超过下面的数据链路层的
MTU值。
5) 标识符: 占
16位。
IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加
1,并将此值赋给标识字段。但这个“标识”并不是序号,因为
IP是无连接的服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的
MTU 而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
6) 标志:占
3 位,但目前只有
2位有意义。
标志字段中的最低位记为
MF (More Fragment)。
MF=1即表示后面“还有分片”的数据报。
MF=0表示这已是若干数据报片
中的最后一个。标志字段中间的一位记为 DF(Don't Fragment),意思是“不能分片”。只有当 DF=0时才允许分片。
7)片偏移:占 13位。较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以 8个字节为偏移单位。这就是说,每个分片的长度一定是 8字节 (64位 )的整数倍。\
8)生存时间:占
8位,生存时间字段常用的英文缩写是
TTL (Time To Live),其表明数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在因特网中兜围子,因而白白消耗网络资源。最初的设计是以秒作为
TTL的单位。每经过一个路由器时,就把
TTL减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的时间小于
1 秒,就把
TTL值减
1。当
TTL值为
0时,就丢弃这个数据报。
9) 协议:占
8 位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的
IP层知道应将数据部分上交给哪个处理过程。
比较常用的协议号:
1 ICMP 2 IGMP 6 TCP 17 UDP 88 IGRP 89 OSPF
1 ICMP 2 IGMP 6 TCP 17 UDP 88 IGRP 89 OSPF
10) 首部检验和:占 16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,都要重新计算一下首都检验和 (一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。
11) IP源地址: 32位IP地址
12) IP目的地址: 32位IP地址
3、TCP数据段格式
如图所示为TCP首部和TCP数据段格式

下面我们再介绍几个常见的数据格式
4、UDP数据段格式--传输层的

其中UDP首部如上图所示。
5、ARP数据包格式(摘自:来源:
http://blog.sina.com.cn/s/blog_9c5d29f70101dwgk.html)

(1)硬件类型字段指明了发送方想知道的硬件接口类型,以太网的值为1;
(2)协议类型字段指明了发送方提供的高层协议类型,IP为0800(16进制);
(3)硬件地址长度和协议长度指明了硬件地址和高层协议地址的长度,这样ARP报文就可以在任意硬件和任意协议的网络中使用;
(4)操作字段用来表示这个报文的类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4;
(5)发送方的硬件地址(0-3字节):源主机硬件地址的前3个字节;
(6)发送方的硬件地址(4-5字节):源主机硬件地址的后3个字节;
(7)发送方IP(0-1字节):源主机硬件地址的前2个字节;
(8)发送方IP(2-3字节):源主机硬件地址的后2个字节;
(9)目的硬件地址(0-1字节):目的主机硬件地址的前2个字节;
(10)目的硬件地址(2-5字节):目的主机硬件地址的后4个字节;
(11)目的IP(0-3字节):目的主机的IP地址。