【网络架构】
以太网帧格式
历史上以太网帧格式有五种:
1.Ethernet V1:这是最原始的一种格式,是由Xerox PARC提出的3Mbps CSMA/CD以太网标准的封装格式,后来在1980年由DEC,Intel和Xerox标准化形成Ethernet V1标准.
2.Ethernet V2(ARPA):由DEC,Intel和Xerox在1982年公布其标准,主要更改了Ethernet V1的电气特性和物理接口,在帧格式上并无变化;Ethernet V2出现后迅速取代Ethernet V1成为以太网事实标准;Ethernet V2帧头结构为6bytes的源地址+6bytes的目标地址+2Bytes的协议类型字段+数据。
3.RAW 802.3:这是1983年Novell发布其划时代的Netware/86网络套件时采用的私有以太网帧格式,该格式以当时尚未正式发布的802.3标准为基础;但是当两年以后IEEE正式发布802.3标准时情况发生了变化—IEEE在802.3帧头中又加入了802.2 LLC(Logical Link Control)头,这使得Novell的RAW 802.3格式跟正式的IEEE 802.3标准互不兼容.
4.802.3/802.2 LLC:这是IEEE 正式的802.3标准,它由Ethernet V2发展而来。它将Ethernet V2帧头的协议类型字段替换为帧长度字段(取值为0000-05dc;十进制的1500);并加入802.2 LLC头用以标志上层协议,LLC头中包含DSAP,SSAP以及Crontrol字段.
5.802.3/802.2 SNAP:这是IEEE为保证在802.2 LLC上支持更多的上层协议同时更好的支持IP协议而发布的标准,与802.3/802.2 LLC一样802.3/802.2 SNAP也带有LLC头,但是扩展了LLC属性,新添加了一个2Bytes的协议类型域(同时将SAP的值置为AA),从而使其可以标识更多的上层协议类型;另外添加了一个3Bytes的OUI字段用于代表不同的组织,RFC 1042定义了IP报文在802.2网络中的封装方法和ARP协议在802.2 SANP中的实现.
802.3以太网帧格式备注:
前导码(7字节)、帧起始定界符(1字节)、目的MAC地址(6字节)、源MAC地址(6字节)、类型/长度(2字节)、数据(46~1500字节)、帧校验序列(4字节)[MAC地址可以用2-6字节来表示,原则上是这样,实际都是6字节]
以太网帧格式总结
MAC地址厂商的查询的网址:
全部厂商列表:
[url]http://standards.ieee.org/regauth/oui/oui.txt[/url]
网页查询地址:
[url]http://standards.ieee.org/regauth/oui/index.shtml[/url]
在Search the public OUI listing . . .输入网卡MAC地址前三位即可,如00-0D-65
==>Start:
目前,有四种不同格式的以太网帧在使用,它们分别是:
●Ethernet II即DIX 2.0:Xerox与DEC、Intel在1982年制定的以太网标准帧格式。Cisco名称为:ARPA。
●Ethernet 802.3 raw:Novell在1983年公布的专用以太网标准帧格式。Cisco名称为:Novell-Ether。
●Ethernet 802.3 SAP:IEEE在1985年公布的Ethernet 802.3的SAP版本以太网帧格式。Cisco名称为:SAP。
●Ethernet 802.3 SNAP:IEEE在1985年公布的Ethernet 802.3的SNAP版本以太网帧格式。Cisco名称为:SNAP。
在每种格式的以太网帧的开始处都有比特(8字节)的前导字符,如图3所示。其中,前7个字节称为前同步码(Preamble),内容是16进制数0xAA,最后1字节为帧起始标志符0xAB,它标识着以太网帧的开始。前导字符的作用是使接收节点进行同步并做好接收数据帧的准备。
图一:
说明:所有范例中Send & Receive的数据都是通过ModbusTCP.exe软件发送与接收。
功能码 01
功能码01用于读取线圈的状态。
例:Modbus TCP通讯模式下,读取站号为2的从站Y0~Y5的状态。
Master→Slave的数据『0000 0000 0006 02 01 0500 0006』
数据 | 说明 | |||||||||
00 18 23 10 00 05 | 目标MAC地址,网卡的硬件地址。00:18:23表示台达 | 6字节 | Ethernet II | |||||||
00 1A A0 39 7E 4E | 源MAC地址,网卡的硬件地址。00:1A:A0表示DELL | 6字节 | ||||||||
08 00 | 协议类型:IP协议 | 2字节 | ||||||||
45 | Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 | Internet Protocol(IP) | |
4位首度,普通IP数据包字段的值是5 | 4位版本 | |||||||||
00 | 服务类型(TOS) | |||||||||
00 34 | Totol Length(IP数据包的长度) | |||||||||
07 C6 | Identification | |||||||||
40 00 | Fragment offset | |||||||||
80 | Time to Live(一个封包在网络上可以存活的时间) | |||||||||
06 | 协议类型:TCP | |||||||||
6E E0 | CRC校验码 | |||||||||
C0 | 192 | Source ID:192.168.1.105 | Transmission Control Protocol (TCP) | |||||||
A8 | 168 | |||||||||
01 | 1 | |||||||||
69 | 105 | |||||||||
C0 | 192 | Destination ID:192.168.1.100 | ||||||||
A8 | 168 | |||||||||
01 | 1 | |||||||||
100 | ||||||||||
04 4D | Source port:pt2-discover(1101) | |||||||||
01 F6 | Destination port:asa-ppl-proto(502) | |||||||||
37 05 D6 C0 | ||||||||||
00 53 F3 CB | ||||||||||
50 | ||||||||||
18 | ||||||||||
FD D6 | window size | |||||||||
AA CF | 校验码 | |||||||||
71CC | ||||||||||
00 00 | Transaction Idenfifier。 | 2字节 | Modbus/TCP协议 | |||||||
00 00 | Protocol Idenfifier。用来确定应用层协议是否为Modbus协议 | 2字节 | ||||||||
00 06 | 数据长度,从【Slave的通讯地址】开始计算。 | 2字节 | ||||||||
02 | Unit Idenfifier ,Slave的通讯地址。 | 1字节 | ||||||||
01 | 功能码。 | 1字节 | Modbus协议 | |||||||
05 00 | 欲读取的位装置起始地址。 | 最大字节数为148 | ||||||||
00 06 | 欲读取的位装置的个数(bits)。 |
数据 | 说明 |
0000 | Transaction Idenfifier。 |
0000 | Protocol Idenfifier。 |
0004 | 数据长度,从【Slave的通讯地址】开始计算。 |
02 | Slave的通讯地址。 |
01 | 功能码。 |
01 | 欲读取的位装置的数目(bytes),8bits为1byte。当读取位装置的数目不足1byte时,以1byte计算。 |
35 | 数据内容(Y5…Y0的状态)。 |
功能码02用于读取输入装置的状态。
例:Modbus TCP通讯模式下,读取站号为2的从站X2~X34的状态。
Master→Slave的数据『0000 0000 0006 02 02 0400 001B』
数据 | 说明 |
0000 | Transaction Idenfifier。 |
0000 | Protocol Idenfifier。 |
0006 | 数据长度,从【Slave的通讯地址】开始计算。 |
02 | Slave的通讯地址。 |
02 | 功能码。 |
0400 | 欲读取的位装置起始地址。 |
001B | 欲读取的位装置的个数(bits)。 |
数据 | 说明 |
0000 | Transaction Idenfifier。 |
0000 | Protocol Idenfifier。 |
0007 | 数据长度,从【Slave的通讯地址】开始计算。 |
02 | Slave的通讯地址。 |
02 | 功能码。 |
04 | 欲读取的位装置的数目(bytes),8bits为1byte。当读取位装置的数目不足1byte时,以1byte计算。 |
CD65 7D04 | 数据内容(X34…X2的状态)。 |
功能码 03
功能码03用于读取保持寄存器(字装置)内容。
PLC D0的MODBUS位址 H1000
例:Modbus TCP通讯模式下,读取站号为2的从站地址H’0000~H’0005的内容。
Master→Slave的数据『0000 0000 0006 02 03 0000 0006』
数据 | 说明 |
0000 | Transaction Idenfifier。 |
0000 | Protocol Idenfifier。 |
0006 | 数据长度,从【Slave的通讯地址】开始计算。 |
02 | Slave的通讯地址。 |
03 | 功能码。 |
0000 | 欲读取的字装置起始地址。 |
0006 | 欲读取的字装置的个数(words)。 |
数据 | 说明 |
0000 | Transaction Idenfifier。 |
0000 | Protocol Idenfifier。 |
000F | 数据长度,从【Slave的通讯地址】开始计算。 |
02 | Slave的通讯地址。 |
03 | 功能码。 |
0C | 欲读取的字装置的数目(bytes),1word为2bytes。 |
0031 | H’0000的数据内容。 |
0006 | H’0001的数据内容。 |
0808 | H’0002的数据内容。 |
0002 | H’0003的数据内容。 |
0300 | H’0004的数据内容。 |
0000 | H’0005的数据内容。 |
功能码05用于对位装置进行写单笔操作。
例1:Modbus TCP通讯模式下,设置站号为2的从站Y2=ON。
Master→Slave的数据『0000 0000 0006 02 05 0502 FF00』
数据 | 说明 |
0000 | Transaction Idenfifier。 |
0000 | Protocol Idenfifier。 |
0006 | 数据长度,从【Slave的通讯地址】开始计算。 |
02 | Slave的通讯地址。 |
05 | 功能码。 |
0502 | 欲写入的地址。 |
FF00 | 写入的控制数据为H’FF00。 |
数据 | 说明 |
0000 | Transaction Idenfifier。 |
0000 | Protocol Idenfifier。 |
0006 | 数据长度,从【Slave的通讯地址】开始计算。 |
02 | Slave的通讯地址。 |
05 | 功能码。 |
0502 | 欲写入的地址。 |
FF00 | 写入的控制数据为H’FF00。 |
Master→Slave的数据『0000 0000 0006 02 05 0502 0000』
数据 | 说明 |
0000 | Transaction Idenfifier。 |
0000 | Protocol Idenfifier。 |
00 06 | 数据长度,从【Slave的通讯地址】开始计算。 |
02 | Slave的通讯地址。 |
05 | 功能码。 |
05 02 | 欲写入的地址。 |
0000 | 写入的控制数据为H’0000。 |
数据 | 说明 |
0000 | Transaction Idenfifier。 |
0000 | Protocol Idenfifier。 |
0006 | 数据长度,从【Slave的通讯地址】开始计算。 |
02 | Slave的通讯地址。 |
05 | 功能码。 |
0502 | 欲写入的地址。 |
0000 | 写入的控制数据为H’FF00。 |
功能码06用于对寄存器(字装置)进行写单笔操作。
例1:Modbus TCP通讯模式下,设置站号为2的从站地址H’1601的内容为K4。
Master→Slave的数据『0000 0000 0006 02 06 1601 0004』
数据 | 说明 |
0000 | Transaction Idenfifier。 |
0000 | Protocol Idenfifier。 |
0006 | 数据长度,从【Slave的通讯地址】开始计算。 |
02 | Slave的通讯地址。 |
06 | 功能码。 |
1601 | 欲写入的地址。 |
0004 | 写入的控制数据为H’0004。 |
数据 | 说明 |
0000 | Transaction Idenfifier。 |
0000 | Protocol Idenfifier。 |
0006 | 数据长度,从【Slave的通讯地址】开始计算。 |
02 | Slave的通讯地址。 |
06 | 功能码。 |
1601 | 欲写入的地址。 |
0004 | 写入的控制数据为H’0004。 |
功能码15用于对位装置进行写多笔操作。
例1:Modbus TCP通讯模式下,设置站号为2的从站Y0~Y17的状态如下表所示。
Master→Slave的数据『0000 0000 0009 02 0F 000A 02 CD01』
数据 | 说明 |
0000 | Transaction Idenfifier。 |
0000 | Protocol Idenfifier。 |
0009 | 数据长度,从【Slave的通讯地址】开始计算。 |
02 | Slave的通讯地址。 |
0F | 功能码。 |
0500 | 欲写入的位装置的起始地址。 |
000A | 欲写入的位装置个数(bits)。 |
02 | 欲写入位装置的数目(bytes),8bits为1byte。当写入位装置的数目不足1byte时,以1byte计算。 |
CD01 | 欲写入的数据内容(Y11…Y0的状态)。 |
数据 | 说明 |
0000 | Transaction Idenfifier。 |
0000 | Protocol Idenfifier。 |
0006 | 数据长度,从【Slave的通讯地址】开始计算。 |
02 | Slave的通讯地址。 |
0F | 功能码。 |
0500 | 欲写入的位装置的起始地址。 |
000A | 欲写入的位装置个数(bits)。 |
功能码16用于对字装置进行写多笔操作。
例1:Modbus TCP通讯模式下,设置站号为2的从站地址H’1618=K500(01F4H);H’1619=K1000(03E8H);H’161A=K2000(07D0H)。
Master→Slave的数据『0000 0000 000B 02 10 1618 0003 06 01F4 03E8 07D0』
数据 | 说明 |
0000 | Transaction Idenfifier。 |
0000 | Protocol Idenfifier。 |
000B | 数据长度,从【Slave的通讯地址】开始计算。 |
02 | Slave的通讯地址。 |
10 | 功能码。 |
1618 | 欲写入的字装置起始地址。 |
0003 | 欲写入的字装置个数(words)。 |
06 | 欲写入字装置的数目(bytes),1word为2bytes。 |
01F4 | 写入的第一笔控制数据为H’01F4。 |
03E8 | 写入的第二笔控制数据为H’03E8。 |
07D0 | 写入的第二笔控制数据为H’07D0。 |
数据 | 说明 |
0000 | Transaction Idenfifier。 |
0000 | Protocol Idenfifier。 |
0006 | 数据长度,从【Slave的通讯地址】开始计算。 |
02 | Slave的通讯地址。 |
10 | 功能码。 |
1618 | 欲写入的字装置起始地址。 |
0003 | 欲写入的字装置个数(words)。 |