logo头像

Always believe youself.

数据帧和数据包

数据帧

什么是数据帧?

所谓的“数据帧(Data frame)”,就是“数据链路层”的协议数据单元,它包括三部分:帧头、数据部分、帧尾。其中,帧头和帧尾包含一些必要的控制信息,比如同步信息、地址信息、差错控制信息等;数据部分则包含网络层传下来的数据,比如“IP数据包”等等。

在发送端,数据链路层把网络层传下来的数据封装成“帧”,然后发送到链路上去;在接收端,数据链路层把收到的帧中的数据提取出并交给网络层。不同的数据链路层协议对应着不同的数据帧,所以数据帧有多种,比如“PPP帧、MAC帧”等,其具体格式也不尽相同。

数据帧的格式(MAC帧的格式为例)

image

MAC帧的“帧头”

包括三个字段。前两个字段分别为6字节长的“目的地址字段”和“源地址字段”,目的地址字段,包含目的MAC地址信息;源地址字段,包含源MAC地址信息。第三个字段为2字节的类型字段,里面包含的信息用来标示上一层使用的是什么协议,以便接收端把收到的MAC帧的数据部分上交给上一层的这个协议。例如:当类型字段的值是0x0800时,就表示上层使用的是IP数据报;若类型字段的值为0x8137,则表示该帧是由Novell IPX 发过来的。

MAC帧的“数据部分”

只有一个字段,其长度在46到1500字节之间,包含的信息是网络层下来的数据。

MAC帧的“帧尾”

只有一个字段,为4字节长,包含的信息是“帧校验序列FCS”(用于判断所接收到的帧是否发生错误)。

数据包

什么是数据包?

包(Packet)是TCP/IP协议通信传输中的数据单位,一般也称“数据包”。

IP协议是工作在OSI参考模型的第三层(网络层),而TCP协议则是工作在OSI参考模型的第四层(传输层)上。

数据帧,工作在OSI参考模型的第二层(数据链路层)。上一层的数据内容由下一层来传输,所以在局域网中,“包”是包含在“帧”里的。

在网络通信中,单个消息被划分为多个数据块,这些数据块称为“包”,它包含发送者和接收者的地址信息。这些包然后沿着不同的路径,在一个或多个网络中传输,并且在目的地重新组合。

数据包的格式

数据包主要由“目的IP地址”、“源IP地址”、“净载数据”等部分构成,包括“包头”和“包体”。包头是固定长度,包体的长度不定,各字段长度固定,双方的“请求数据包”和“应答数据包”的包头结构是一致的,不同的是包体的定义。

扩展

OSI参考模型的各层传输的数据和控制信息具有多种格式,常用的信息格式包括帧、数据包、数据报、段、消息、元素和数据单元。

信息交换发生在对等OSI层之间,在源端机中每一层把控制信息附加到数据中,而目的机器的每一层则对接收到的信息进行分析,并从数据中移去控制信息,下面是各信息单元的说明:

  • 数据帧(Frame):是一种信息单位,它的起始点和目的点都是数据链路层。
  • 数据包(Packet):也是一种信息单位,它的起始和目的地是网络层。
  • 数据报(Datagram):通常是指起始点和目的地都使用无连接网络服务的的网络层的信息单元。
  • 段(Segment):通常是指起始点和目的地都是传输层的信息单元。
  • 消息(message):是指起始点和目的地都在网络层以上(经常在应用层)的信息单元。
  • 元素(cell)是一种固定长度的信息,它的起始点和目的地都是数据链路层。元素通常用于异步传输模式(ATM)和交换多兆位数据服务(SMDS)网络等交换环境。
  • 数据单元(data unit)指许多信息单元。常用的数据单元有服务数据单元(SDU)、协议数据单元(PDU)。SDU是在同一机器上的两层之间传送信息。PDU是发送机器上每层的信息发送到接收机器上的相应层(同等层间交流用的)。

Packet(数据包)封装的基本单元,它穿越网络层和数据链路层的分解面。通常一个Packet映射成一个Frame,但也有例外:即当数据链路层执行拆分或将几个Packet合成一个Frame的时候。

分层

OSI模型有7层,1~7层分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。OSI模型在逻辑上可分为两个部分:低层的1~4层关注的是原始数据的传输;高层的5~7层关注的是网络下的应用程序。 我们可以用一个形象一些的例子对数据包的概念加以说明:我们在邮局邮寄产品时,虽然产品本身带有自己的包装盒,但是在邮寄的时候只用产品原包装盒来包装显然是不行的。必须把内装产品的包装盒放到一个邮局指定的专用纸箱里,这样才能够邮寄。这里,产品包装盒相当于数据包,里面放着的产品相当于可用的数据,而专用纸箱就相当于帧,且一个帧中只有一个数据包。

体系结构上区分他们:

一般说来,数据链路层发出的数据包称为frame,地址是链路层的地址,如mac地址;网络层发出的数据包称为packet,地址是网络层地址,如ip地址;传输层发出的数据包称为segment/datagram,地址是传输层地址,如TCP的端口号。