目录
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 ) 。


数据包在以太网物理介质上传播之前必须封装头部和尾部信息, 封装后的数据包称为数据
帧, 数据帧中封装的信息决定了数据如何传输。以太网上传输的数据帧有两种格式, 选择
哪种格式由TCP/IP 协议簇中的网络层决定。
以太网上使用两种标准帧格式。第一种是世纪80 年代初提出的DIX v2 格式, 即Ethernet
II 帧格式。Ethernet II 后来被IEEE802 标准接纳, 并写进了IEEE 802.3x-1997 的3.2.6 节。
第二种是1983 年提出的IEEE 802.3 格式。这两种格式的主要区别在于Ethernet II 格式中包
含一个Type 字段, 标识以太帧处理完成之后将被发送到哪个上层协议进行处理, IEEE
802.3格式中, 同样的位置是长度(length)字段。
不同的Type 字段值可以用来区别这两种帧的类型, 当Type 字段值小于等于1500 ( 或者十
六进制的0x05DC) 时, 帧使用的是IEEE 802.3 格式。当Type 字段值大于等于1536 ( 或者
十六进制的0x0600)时, 帧使用的是Ethernet II 格式。以太网中大多数的数据帧使用的是
Ethernet II 格式。

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

| DMAC | 6字节 | 目的MAC地址,IPV4为6字节,该字段确定帧的接收者。 |
| SMAC | 6字节 | 源MAC地址,IPV4为6字节,该字段标识发送帧的工作站。 |
| Type | 2字节 | 协议类型。取值表示了数据字段包含的高层协议。下表列出了链路直接封装的协议。 |
| Data | 变长 | 数据字段的最小长度必须为46字节以保证帧长至少为64字节,这意味着传输一字节信息也必须使用46字节的数据字段。 如果填入该字段的信息少于46字节,该字段的其余部分也必须进行填充。数据字段的最大长度为1500字节。 |
| CRC | 4字节 | 用于帧内后续字节差错的循环冗余检验(也称为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 字段来说,不同的取值代表数据字段封装的不同上层协议,具体如下:
| 0x0800 | Internet Protocol (IP) [RFC894] |
| 0x0801 | X.75 Internet |
| 0x0805 | X.25 Level 3 |
| 0x0806 | Address Resolution Protocol (ARP)[RFC7042] |
| 0x0808 | Frame Relay ARP [RFC1701] |
| 0x8000 | IS-IS |
| 0x8035 | Reverse Address Resolution Protocol (RARP) [RFC903] |
| 0x8137 | Novell NetWare IPX/SPX (old) |
| 0x8138 | Novell, Inc. |
| 0x8100 | IEEE Std 802.1Q - Customer VLAN Tag Type |
| 0x814C | SNMP over Ethernet [RFC1089] |
| 0x86DD | IP Protocol version 6 (IPv6) [RFC7042] |
| 0x8808 | IEEE Std 802.3 - Ethernet Passive Optical Network (EPON) [RFC7042] |
| 0x880B | Point-to-Point Protocol (PPP) [RFC7042] |
| 0x880C | General Switch Management Protocol (GSMP) |
| 0x8847 | MPLS (multiprotocol label switching) label stack - unicast [RFC 3032] |
| 0x8848 | MPLS (multiprotocol label switching) label stack - multicast [RFC 3032] |
| 0x8863 | PPP over Ethernet (PPPoE) Discovery Stage [RFC2516] |
| 0x8864 | PPP over Ethernet (PPPoE) Session Stage [RFC2516] |
| 0x888E | IEEE Std 802.1X - Port-based network access control |
| 0x88A8 | IEEE Std 802.1Q - Service VLAN tag identifier (S-Tag) |
| 0x88B7 | IEEE Std 802 - OUI Extended Ethertype |
| 0x88C7 | IEEE Std 802.11 - Pre-Authentication (802.11i) |
| 0x88CC | IEEE Std 802.1AB - Link Layer Discovery Protocol (LLDP) |
| 0x88E5 | IEEE Std 802.1AE - Media Access Control Security |
| 0x88F5 | IEEE Std 802.1Q - Multiple VLAN Registration Protocol (MVRP) |
| 0x88F6 | IEEE Std 802.1Q - Multiple Multicast Registration Protocol (MMRP) |
这个以太网V2的前导域为8B,而IEEE802.3的前导域为7B,将空余出来的一个字节用作帧起始分解符,它的位模式为10101011,这样做的目的就是为了和IEEE802.4和IEEE802.5兼容。
还有的就是IEEE802.3帧规定的第三个字段是“长度/类型域”。当这个字段值大于1536时,表示类型,这个就是和V2以太网一样的标准了;当这个字段值小于1500时,才表示“长度”,这时,接收方无法确定对接收到的帧做如何处理,必须通过在数据部分增加一个小的LLC头部,用它来提供帧类型的
1.在以太网V2的MAC帧中,其首部并没有一个帧长度(或数据长度)的字段,那么MAC子层如何知道从接收到的以太网帧中取出多少字节的数据交给上一层的协议?
D: 这是因为以太网采用曼彻斯特编码,曼彻斯特编码的一个重要特点是:在曼彻斯特的每一个码元的正中间一定有一次电压的转化(从高到低或者从低到高)。当发送方把一个以太网帧发送完毕后,就不再发送其他码元(帧之间有着一定的间隔),这样发送方适配器上的电压就不再变化,于是接收方就可以很容易地找到以太网帧的结束位置,这个位置上往前数4B(效验和),就能确定数据字段的结束位置。
2.当数据字段不足46B时候,必须通过填充字段来扩充数据字段的长度,使其满足最小长度64B的要求,那么接收端的MAC子层在从接收到的帧中剥去首部和尾部后把数据字段交给上一层协议后,上一层协议如何识别有效的数据字段的长度?
D: 上一层协议要识别数据帧的数据字段的有效长度,一般是通过上层协议的类似“总长度”字段推断出来的。例如,如果上层协议使用的是IP协议的时候,其IP头中就有一个“总长度字段”,因此“总长度”字段加上填充字段,应当等于MAC帧中数据字段的长度。例如,当IP数据包的总长度为42B时,填充字段共有4B,当MAC帧将46B的数据交给IP层时,IP层就把其中的4B的填充字段丢弃。
| 标准 | 描述 |
|---|---|
| IEEE 802.3 | Carrier sense multiple access with collision detection (CSMA/CD) access method and physical layer specifications |
| IEEE 802.3ae | Media Access Control (MAC) Parameters, Physical Layers, and Management parameters for 10Gb/s Operation |
| RFC 894 | A Standard for the Transmission of IP Datagrams over Ethernet Networks |
| RFC 1042 | A Standard for the Transmission of IP Datagrams over IEEE 802 Networks |


| DMAC | 6 | 目的MAC地址 |
| SMAC | 6 | 源MAC地址 |
| Length | 2 | 指后续数据的字节长度,但不包括CRC检验码 |
| DSAP | 1 | 目的服务访问点 |
| SSAP | 1 | 源服务访问点 |
| Data | 44~1498 | 负载 |
| CRC | 4 | 用于帧内后续字节差错的循环冗余检验(也称为FCS或帧检验序列) |
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 帧。

| 标准 | 描述 |
|---|---|
| IEEE 802.3 | Carrier sense multiple access with collision detection (CSMA/CD) access method and physical layer specifications |
| IEEE 802.3ae | Media Access Control (MAC) Parameters, Physical Layers, and Management parameters for 10Gb/s Operation |
| RFC 894 | A Standard for the Transmission of IP Datagrams over Ethernet Networks |
| RFC 1042 | A Standard for the Transmission of IP Datagrams over IEEE 802 Networks |
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
这个问题在这里已经有了答案: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
我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:
我想将我的MacSnowLeopardruby从1.8.7升级到1.9.1版本,有人知道轻松且最好的升级方法吗?因为我读了一些论坛/帖子/博客/讨论说覆盖苹果发布的ruby不好将Rails从版本2.2.2升级到2.3.8的最佳方法是什么?因为我找到的所有信息都仅适用于豹/老虎,而且很少有关于雪豹的复杂文章。他们还说覆盖apple提供的rails不好吗。谁能帮帮我?谢谢。 最佳答案 DanBenjamin有一些greatinstructionsforcompilingandinstallingRuby,RubyGemsandRai
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
我最近决定从我的系统中卸载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版本,并且我希望我的系统上只有一个版本。 最佳答案
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
路由有如下代码: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个字符串为所有资源设置默认格式,每行不带“默认值”散列?谢谢。
我刚刚按照thebootsygempage上的安装说明进行操作在我保存并查看帖子内容之前,一切看起来都不错。这是输出在View中的样子:HeaderSubhead:似乎没有呈现任何html格式,因为它被引号或类似的东西转义了-其他人有这个问题吗?我没有在github页面或SO上看到任何问题来指出我正确的方向。除了遵循gem安装说明之外,我还没有做任何事情,但也许我错过了什么或者只是犯了一个愚蠢的错误。如果你还有什么想知道的,请尽管问。干杯 最佳答案 你需要有这样的东西,转义html: 关
有没有一种简单的方法可以将给定的整数格式化为具有固定长度和前导零的字符串?#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的