以太网帧、IP数据包格式标准

1、以太网帧格式

  以太网常用帧格式有两种, 一种是Ethernet II,另一种是IEEE 802.3 格式。这两种格式区别是:Ethernet II中包含一个Type字段,描述了以太网首部后面所跟数据包的类型,标识以太帧处理完成之后将被发送到哪个上层协议进行处理;而IEEE 802.3格式中同样的位置是长度字段。 其中。以太网中大多数的数据帧使用的是 Ethernet II帧格式,而IEEE 802.3只支持IPX/SPX协议(争议)

a、Ethernet II帧格式
  

b、IEEE 802.3帧格式
  

  前导码(Preamble):Ethernet II是由 8个8bit (位) 10101010构成,共8Byte (字节)IEEE802.3由7个8bit(位) 10101010+1个8bit(位)帧起始符(SFD)10101011构成,共8Byte (字节)
  目的地址(DMAC):是目的MAC地址。DMAC字段长度为6个字节,标识帧的接收者。
  源地址(SMAC):是源MAC地址。SMAC字段长度为6个字节,标识帧的发送者。
  类型( Ethernet II): 用于标识以太网首部后面所跟数据包的类型,字段取值大于等于1536 (或者十六进制的0x0600),例如Type为0x0800时后面为IP协议包,Type为0x0806时后面为ARP协议包.
  长度( IEEE802.3 ):也称有效数据长度,字段取值小于等于1500(或者十六进制的0x05DC),定义了Data字段包含的字节数。抓包软件中看到的Length表示的是有效数据长度,并不包含填充(Pading)长度。
  数据部分(Payload):数据也叫有效载荷,这是网络层传递给数据链路层的帧,其长度为 46-1500 Bytes。以太网协议规定最小报文64字节6+6+2+数据+4=64(不算前导码)】,因此帧数据部分最小为46字节,不足46字节(如ARP和RARP包)时,由设备驱动程序(MAC子层)在数据字段后面填充(Pading)至46字节。   
  FCS: 数据校验字段,用于存储 CRC(循环冗余校验)结果的帧的帧尾。MAC发送侧(MAC_TX)创建每个帧时都将运行它。MAC接收侧(MAC_RX)接收到帧时,以从目的MAC到数据这部分内容作为输入数据进行 CRC 计算,计算结果与接收帧的FCS字段比较,结果相同表示帧有效,结果不同则将帧丢弃。(FCS错误主要发生在物理口与RJ45接口之间的链路上)

---------------------------------------------------------------------

  这里需要注意:因为802.3帧的LLC和SNAP字段占用的是Data字段的8个字节,因此实际上层数据承载最大就变成了1492字节。
  逻辑链路控制LLC(Logical Link Control):由目的服务访问点DSAP(Destination Service Access Point)、源服务访问点SSAP(Source Service Access Point)和Control字段组成。
  SNAP(Sub-network Access Protocol):由机构代码(Org Code)和类型(Type)字段组成。Org code三个字节都为0。Type字段的含义与Ethernet_II帧中的Type字段相同。
  IEEE802.3帧根据DSAP和SSAP字段的取值又可分为以下几类:
  1)当DSAP和SSAP都取特定值0xff时,802.3帧就变成了Netware- ETHERNET帧,用来承载NetWare类型的数据。
  2)当DSAP和SSAP都取特定值0xaa时,802.3帧就变成了ETHERNET_SNAP帧。ETHERNET_SNAP帧可以用于传输多种协议。
  3)DSAP和SSAP其他的取值均为纯IEEE802.3帧。

  以太网帧格式多达5种,事实上,今天的大多数TCP/IP应用都是用Ethernet V2帧格式,而交换机之间的BPDU数据包是IEEE802.3/LLC的帧,VLAN Trunk协议如802.1Q和Cisco的CDP等则是采用IEEE802.3/SNAP的帧。估计是设备间一些协议才用到802.3帧格式,是因为需要802.3帧携带一些控制信息。

---------------------------------------------------------------------

以太网首部是:
  

  据RFC894的说明,以太网封装的数据部分(Payload)的最大长度是1500Byte【称为以太网的最大传输单元(MTU),注意,MTU这个概念指数据帧中有效载荷的最大长度,不包括帧首部的长度】,在这个限制之下,最长的以太帧包括6字节的目的地址(DMAC)、6字节的源地址(SMAC)、2字节的以太类型(EtherType)、1500字节的数据(Payload)、4字节的校验(FCS),总共是1518字节。
  但是实际上我们抓包得到的最大帧是1514字节,为什么不是1518字节呢? 原因是当数据帧到达网卡时,在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和错,就丢弃此帧。如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交“设备驱动程序”做进一步处理。这时我们的抓包软件才能抓到数据, 因此,抓包软件抓到的是去掉前导码、帧开始分界符、FCS之外的数据,其最大值是6+6+2+1500=1514字节。

2,数据封装

   当我们应用程序用TCP传输数据的时候,数据被送入协议栈中,然后逐个通过每一层,直到最后到物理层将数据帧转换成比特流,送入网络。而在这个过程中,每一层都会对要发送的数据加一些首部信息。整个过程如下图,每层数据向下传输时都会进行封装,帧有效数据来源于上级网络层。

  

 

  如图可以看出,每一层数据是由上一层数据+本层首部信息组成的,其中每一层的数据 ,称为本层的协议数据单元   ,即PDU.
  应用层数据在传输层添加TCP报头后得到的PDU被称为 Segment(数据段 ),图示为TCP段
  传输层的数据(TCP段)传给网络层,网络层添加IP报头得到的PDU被称为Packet(数据包); 图示为IP数据包
  网络层数据报(IP数据包)被传递到数据链路层,封装数据链路层报头得到的PDU被称为Frame(数据帧),图示为以太网帧。
  最后,帧被转换为比特,通过网络介质传输。这种协议栈逐层向下传递数据,并添加报头和报尾的过程称为封装。

3,IP数据报格式

  IP数据报格式如下图
  

  TCP首部与TCP数据段格式
  

  UDP(也是传输层)数据段格式
  

  ARP数据包格式
  

  (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地址。

posted @ 2021-02-01 14:17  airoot  阅读(6392)  评论(5编辑  收藏  举报