jjzjj

详解以太网MAC帧格式

十二学 2023-05-26 原文

目录

一、引入

1. 前言

2. 网络通信协议

3. 终端之间的通信

二、帧格式

三、Ethernet Ⅱ 帧格式

1. 各字段说明

2. 两个问题

3. 抓包示意

4. 参考标准

四、IEEE 802.3 帧格式

1. 字段说明

2. 抓包示意

3. 参考标准


一、引入

1. 前言

20 世纪60 年代以来,计算机网络得到了飞速发展。各大厂商和标准组织为了在数据通信网
络领域占据主导地位,纷纷推出了各自的网络架构体系和标准,如IBM 公司的SNA 协议,
Novell 公司的IPX/SPX 协议,以及广泛流行的OSI 参考模型和TCP/IP协议。同时,各大厂
商根据这些协议生产出了不同的硬件和软件。标准组织和厂商的共同努力促进了网络技术
的快速发展和网络设备种类的迅速增长。
网络通信中, " 协议" 和" 标准" 这两个词汇常常可以混用。同时, 协议或标准本身又常
常具有层次的特点。一般地, 关注于逻辑数据关系的协议通常被称为上层协议, 而关注于
物理数据流的协议通常被称为底层协议。IEEE 802 就是一套用来管理物理数据流在局域网
中传输的标准, 包括在局域网中传输物理数据的802.3 以太网标准。除以太外, 还有一些用
来管理物理数据流在广域网中传输的标准, 如PPP ( Point-to- Poi nt Protocol ) , 高级数
据钅连路控制HDLC ( High-LeveI Data Link ControI ) 。

2. 网络通信协议

3. 终端之间的通信

 数据包在以太网物理介质上传播之前必须封装头部和尾部信息, 封装后的数据包称为数据
帧, 数据帧中封装的信息决定了数据如何传输。以太网上传输的数据帧有两种格式, 选择
哪种格式由TCP/IP 协议簇中的网络层决定。

二、帧格式

以太网上使用两种标准帧格式。第一种是世纪80 年代初提出的DIX v2 格式, 即Ethernet
II 帧格式。Ethernet II 后来被IEEE802 标准接纳, 并写进了IEEE 802.3x-1997 的3.2.6 节。

Ethernet Ⅱ 帧格式


第二种是1983 年提出的IEEE 802.3 格式。这两种格式的主要区别在于Ethernet II 格式中包
含一个Type 字段, 标识以太帧处理完成之后将被发送到哪个上层协议进行处理, IEEE
802.3格式中, 同样的位置是长度(length)字段。

IEEE  802.3 帧格式


不同的Type 字段值可以用来区别这两种帧的类型, 当Type 字段值小于等于1500 ( 或者十
六进制的0x05DC) 时, 帧使用的是IEEE 802.3 格式。当Type 字段值大于等于1536 ( 或者
十六进制的0x0600)时, 帧使用的是Ethernet II 格式。以太网中大多数的数据帧使用的是
Ethernet II 格式


以太帧中还包括源和目的MAC 地址分别代表发送者的MAC 和接收者的MAC , 此外还有
帧校验序列字段, 用于检验传输过程中帧的完整性。

以太网帧格式

三、Ethernet Ⅱ 帧格式

1. 各字段说明

DMAC6字节目的MAC地址,IPV4为6字节,该字段确定帧的接收者。
SMAC6字节源MAC地址,IPV4为6字节,该字段标识发送帧的工作站。
Type2字节协议类型。取值表示了数据字段包含的高层协议。下表列出了链路直接封装的协议。
Data变长

数据字段的最小长度必须为46字节以保证帧长至少为64字节,这意味着传输一字节信息也必须使用46字节的数据字段。

如果填入该字段的信息少于46字节,该字段的其余部分也必须进行填充。数据字段的最大长度为1500字节。

CRC4字节用于帧内后续字节差错的循环冗余检验(也称为FCS或帧检验序列)。这个字段只是提供检错功能,并不提供纠错功能。该效验和效验的范围为:目的地址,源地址,类型,数据等字段。CRC效验的生成多项式为:

G(x)=X(32)+X(26)+X(23)+X(22)+X(16)+X(12)+X(11)+X(10)+X(8)+X(7)+X(5)+X(4)+X(2)+X(1)+1

对于Type 字段来说,不同的取值代表数据字段封装的不同上层协议,具体如下:

0x0800Internet Protocol (IP) [RFC894]
0x0801X.75 Internet
0x0805X.25 Level 3
0x0806Address Resolution Protocol (ARP)[RFC7042]
0x0808Frame Relay ARP [RFC1701]
0x8000IS-IS
0x8035Reverse Address Resolution Protocol (RARP) [RFC903]
0x8137Novell NetWare IPX/SPX (old)
0x8138Novell, Inc.
0x8100IEEE Std 802.1Q - Customer VLAN Tag Type
0x814CSNMP over Ethernet [RFC1089]
0x86DDIP Protocol version 6 (IPv6) [RFC7042]
0x8808IEEE Std 802.3 - Ethernet Passive Optical Network (EPON) [RFC7042]
0x880BPoint-to-Point Protocol (PPP) [RFC7042]
0x880CGeneral Switch Management Protocol (GSMP)
0x8847MPLS (multiprotocol label switching) label stack - unicast [RFC 3032]
0x8848MPLS (multiprotocol label switching) label stack - multicast [RFC 3032]
0x8863PPP over Ethernet (PPPoE) Discovery Stage [RFC2516]
0x8864PPP over Ethernet (PPPoE) Session Stage [RFC2516]
0x888EIEEE Std 802.1X - Port-based network access control
0x88A8IEEE Std 802.1Q - Service VLAN tag identifier (S-Tag)
0x88B7IEEE Std 802 - OUI Extended Ethertype
0x88C7IEEE Std 802.11 - Pre-Authentication (802.11i)
0x88CCIEEE Std 802.1AB - Link Layer Discovery Protocol (LLDP)
0x88E5IEEE Std 802.1AE - Media Access Control Security
0x88F5IEEE Std 802.1Q - Multiple VLAN Registration Protocol (MVRP)
0x88F6IEEE Std 802.1Q - Multiple Multicast Registration Protocol (MMRP)

这个以太网V2的前导域为8B,而IEEE802.3的前导域为7B,将空余出来的一个字节用作帧起始分解符,它的位模式为10101011,这样做的目的就是为了和IEEE802.4和IEEE802.5兼容。

还有的就是IEEE802.3帧规定的第三个字段是“长度/类型域”。当这个字段值大于1536时,表示类型,这个就是和V2以太网一样的标准了;当这个字段值小于1500时,才表示“长度”,这时,接收方无法确定对接收到的帧做如何处理,必须通过在数据部分增加一个小的LLC头部,用它来提供帧类型的

2. 两个问题

1.在以太网V2的MAC帧中,其首部并没有一个帧长度(或数据长度)的字段,那么MAC子层如何知道从接收到的以太网帧中取出多少字节的数据交给上一层的协议?

D:  这是因为以太网采用曼彻斯特编码,曼彻斯特编码的一个重要特点是:在曼彻斯特的每一个码元的正中间一定有一次电压的转化(从高到低或者从低到高)。当发送方把一个以太网帧发送完毕后,就不再发送其他码元(帧之间有着一定的间隔),这样发送方适配器上的电压就不再变化,于是接收方就可以很容易地找到以太网帧的结束位置,这个位置上往前数4B(效验和),就能确定数据字段的结束位置。

2.当数据字段不足46B时候,必须通过填充字段来扩充数据字段的长度,使其满足最小长度64B的要求,那么接收端的MAC子层在从接收到的帧中剥去首部和尾部后把数据字段交给上一层协议后,上一层协议如何识别有效的数据字段的长度?

D: 上一层协议要识别数据帧的数据字段的有效长度,一般是通过上层协议的类似“总长度”字段推断出来的。例如,如果上层协议使用的是IP协议的时候,其IP头中就有一个“总长度字段”,因此“总长度”字段加上填充字段,应当等于MAC帧中数据字段的长度。例如,当IP数据包的总长度为42B时,填充字段共有4B,当MAC帧将46B的数据交给IP层时,IP层就把其中的4B的填充字段丢弃。

3. 抓包示意

抓包实例

4. 参考标准

标准描述
IEEE 802.3Carrier sense multiple access with collision detection (CSMA/CD) access method and physical layer specifications
IEEE 802.3aeMedia Access Control (MAC) Parameters, Physical Layers, and Management parameters for 10Gb/s Operation
RFC 894A Standard for the Transmission of IP Datagrams over Ethernet Networks
RFC 1042A Standard for the Transmission of IP Datagrams over IEEE 802 Networks

四、IEEE 802.3 帧格式

 

1. 字段说明

DMAC6目的MAC地址
SMAC6源MAC地址
Length2指后续数据的字节长度,但不包括CRC检验码
DSAP1目的服务访问点
SSAP1源服务访问点
Data44~1498负载
CRC4用于帧内后续字节差错的循环冗余检验(也称为FCS或帧检验序列)

IEEE  802.3 帧格式

IEEE802.3 帧格式类似于Ethernet II 帧, 只是Ethernet II 帧的Type 域被802.3 帧的Length
域取代, 并且占用了Data 字段的8 个字节作为LLC 和SNAP 字段。
Length 字段定义了Data 字段包含的字节数。
逻辑链路控制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取值为其它时,就是纯的IEEE 802.3 帧。

2. 抓包示意

3. 参考标准

标准描述
IEEE 802.3Carrier sense multiple access with collision detection (CSMA/CD) access method and physical layer specifications
IEEE 802.3aeMedia Access Control (MAC) Parameters, Physical Layers, and Management parameters for 10Gb/s Operation
RFC 894A Standard for the Transmission of IP Datagrams over Ethernet Networks
RFC 1042A Standard for the Transmission of IP Datagrams over IEEE 802 Networks

有关详解以太网MAC帧格式的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  3. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  4. ruby-on-rails - 如何在 mac os snow leopard 中升级 ruby​​ 和 rails - 2

    我想将我的MacSnowLeopardruby​​从1.8.7升级到1.9.1版本,有人知道轻松且最好的升级方法吗?因为我读了一些论坛/帖子/博客/讨论说覆盖苹果发布的ruby不好将Rails从版本2.2.2升级到2.3.8的最佳方法是什么?因为我找到的所有信息都仅适用于豹/老虎,而且很少有关于雪豹的复杂文章。他们还说覆盖apple提供的rails不好吗。谁能帮帮我?谢谢。 最佳答案 DanBenjamin有一些greatinstructionsforcompilingandinstallingRuby,RubyGemsandRai

  5. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  6. ruby - 在不使用 RVM 的情况下在 Mac 上卸载和升级 Ruby - 2

    我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案

  7. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  8. ruby-on-rails - 如何在 Rails 中设置路由的默认格式? - 2

    路由有如下代码:resources:orders,only:[:create],defaults:{format:'json'}resources:users,only:[:create,:update],defaults:{format:'json'}resources:delivery_types,only:[:index],defaults:{format:'json'}resources:time_corrections,only:[:index],defaults:{format:'json'}是否可以使用1个字符串为所有资源设置默认格式,每行不带“默认值”散列?谢谢。

  9. ruby-on-rails - Rails 4 WYSIWYG Bootsy 不显示格式 - 2

    我刚刚按照thebootsygempage上的安装说明进行操作在我保存并查看帖子内容之前,一切看起来都不错。这是输出在View中的样子:HeaderSubhead:似乎没有呈现任何html格式,因为它被引号或类似的东西转义了-其他人有这个问题吗?我没有在github页面或SO上看到任何问题来指出我正确的方向。除了遵循gem安装说明之外,我还没有做任何事情,但也许我错过了什么或者只是犯了一个愚蠢的错误。如果你还有什么想知道的,请尽管问。干杯 最佳答案 你需要有这样的东西,转义html: 关

  10. ruby - 在 Ruby 中将整数格式化为固定长度的字符串 - 2

    有没有一种简单的方法可以将给定的整数格式化为具有固定长度和前导零的字符串?#convertnumberstostringsoffixedlength3[1,12,123,1234].map{|e|???}=>["001","012","123","234"]我找到了解决方案,但也许还有更聪明的方法。format('%03d',e)[-3..-1] 最佳答案 如何使用%1000而不是进行字符串操作来获取最后三位数字?[1,12,123,1234].map{|e|format('%03d',e%1000)}更新:根据theTinMan的

随机推荐