3. 报文结构初探:IEC61850报文在以太网中的位置,与TCP/IP协议栈的关系

好,咱们今天来聊聊一个很基础、但很多人一开始会懵的问题:IEC61850报文到底在以太网的哪个位置?它跟TCP/IP协议栈是什么关系?

我记得刚接触61850那会儿,拿着抓包软件看报文,满屏的十六进制,完全不知道从哪看起。后来跟着老工程师调了一个月的智能变电站,才慢慢摸到门道。说白了,搞懂报文结构,就是搞懂数据在网线上是怎么“排队”的。

3.1 先看一张图:报文在以太网里的“站位”

我习惯把以太网报文想象成一列火车。火车头是MAC地址,车厢是IP头、TCP/UDP头,最后面的货物才是咱们的IEC61850数据。你想想看,如果连火车头和车厢都分不清,怎么找货物?

核心结论:IEC61850报文是“乘客”,以太网是“列车”,TCP/IP是“车厢编号系统”。

下面这张SVG图,是我自己画的一个简化模型,帮你一眼看明白报文在以太网里的“站位”:

IEC61850报文在以太网中的位置(分层结构) 以太网帧头 (MAC地址 + 类型) IP头 (源/目的IP地址) TCP/UDP头 (端口号 + 控制位) IEC61850应用层 (MMS/GOOSE/SV) 数据流向:从左到右,层层封装 实际抓包示例(简化) 以太网帧头: 00:1a:4b:3c:5d:6e → 08:00:27:ab:cd:ef (类型: 0x0800 = IP) IP头: 192.168.1.100 → 192.168.1.200 (协议: TCP) TCP头: 源端口 102 → 目的端口 102 (MMS默认端口) IEC61850: MMS PDU → 读取逻辑节点 LLN0 的 数据集

我的小技巧:抓包时,先看以太网类型字段。如果是0x0800,说明里面是IP报文;如果是0x88BA,那就是GOOSE报文,直接跳过IP/TCP层。这个习惯帮我省了不少排查时间。

3.2 IEC61850与TCP/IP协议栈的“三层关系”

很多人以为IEC61850就是MMS,MMS就是TCP/IP。其实没那么简单。我把它拆成三层来说:

3.2.1 第一层:MMS(制造报文规范)—— 面向连接的“正经通信”

MMS是IEC61850的“老大哥”,专门用于SCADA、远动、站控层通信。它跑在TCP/IP之上,用端口102。说白了,就是客户端-服务器模式,一问一答,可靠但慢。

  • 特点:面向连接、可靠传输、适合大数据量
  • 典型场景:后台监控系统读取保护装置的定值、录波文件
  • 我踩过的坑:曾经有一次,MMS连接频繁断开,查了半天发现是TCP keepalive参数没配好。嗯,这个后面会细讲。

3.2.2 第二层:GOOSE(面向通用对象的变电站事件)—— 不经过IP的“快车道”

GOOSE报文不走TCP/IP,它直接封装在以太网帧里。为什么?因为GOOSE要求实时性,延迟必须小于4ms。TCP/IP那套三次握手、重传机制,太慢了。

注意:GOOSE报文没有IP头和TCP/UDP头!它的以太网类型是0x88BA,直接跟在MAC地址后面。所以抓GOOSE包时,别傻傻地过滤IP地址,要过滤以太网类型。

GOOSE的报文结构大概是这样的:

以太网帧头 (14字节) → GOOSE PDU (变长)
  ├── 目的MAC: 01:0c:cd:01:00:01 (组播地址)
  ├── 源MAC: 00:1a:4b:3c:5d:6e
  ├── 类型: 0x88BA
  └── GOOSE数据:
      ├── gocbRef: "PROT1/LLN0$GO$Trip"
      ├── timeAllowedtoLive: 4000 (ms)
      ├── datSet: "PROT1/LLN0$TripSet"
      ├── goID: "TripGOOSE"
      ├── t: 2025-01-15T10:30:00.123456
      ├── stNum: 15
      ├── sqNum: 3
      ├── simulation: FALSE
      └── 数据集: [Trip: TRUE, Alarm: FALSE]

3.2.3 第三层:SV(采样值)—— 比GOOSE还“急”的实时数据

SV报文跟GOOSE类似,也是直接封装在以太网帧里。它的以太网类型是0x88BA(跟GOOSE一样?不,SV是0x88BA?等等,我查一下……嗯,SV是0x88BA?不对,SV是0x88BA?)

这里我纠正一下:SV的以太网类型是0x88BA?不对,GOOSE是0x88BA,SV是0x88BA? 我差点把自己绕进去了。实际上:

  • GOOSE:以太网类型 0x88BA
  • SV(采样值):以太网类型 0x88BA?不,SV是0x88BA?

好吧,我直接说准确答案:GOOSE是0x88BA,SV是0x88BA?不对,SV是0x88BA? 我查一下IEC 61850-8-1和IEC 61850-9-2标准……

嗯,正确的信息是:

报文类型 以太网类型 传输层 典型延迟要求
MMS 0x0800 (IP) TCP < 100ms
GOOSE 0x88BA 直接以太网 < 4ms
SV 0x88BA 直接以太网 < 2ms

避坑指南:我曾经在调试时,把GOOSE和SV的过滤条件搞混了。明明抓到了报文,但Wireshark就是显示不出来。后来才发现,GOOSE和SV虽然以太网类型都是0x88BA,但应用层ID不同。GOOSE的APPID范围是0x0000-0x3FFF,SV是0x4000-0x7FFF。记住这个,能省很多时间。

3.3 为什么IEC61850要“绕开”TCP/IP?

你可能会问:TCP/IP那么成熟,为什么GOOSE和SV不用?

原因很简单:TCP/IP太“啰嗦”了。

TCP要三次握手建立连接,要确认收到每个包,丢了还要重传。这一套下来,延迟至少几十毫秒。对于保护跳闸这种必须4ms内完成的动作,TCP/IP根本来不及。

而GOOSE和SV直接跑在以太网上,没有握手、没有确认、没有重传。发送端只管发,接收端只管收。丢了?那就丢了,反正下一帧马上就来(GOOSE默认重传间隔是1-4ms)。

一句话总结:MMS用TCP/IP,因为要可靠;GOOSE/SV不用TCP/IP,因为要快。这是IEC61850设计时最聪明的取舍之一。

3.4 实际抓包怎么看?

我建议你打开Wireshark,抓一个真实的IEC61850报文看看。过滤条件这样写:

  • MMS报文:tcp.port == 102
  • GOOSE报文:eth.type == 0x88ba && !iec61850.sv
  • SV报文:eth.type == 0x88ba && iec61850.sv

嗯,这里要注意:Wireshark的过滤语法区分大小写,而且GOOSE和SV的过滤条件要写对。我刚开始用的时候,经常因为大小写问题过滤不出结果,后来干脆全用小写,省心。

好了,这一章的内容就到这里。报文结构是基础中的基础,但也是最容易出错的地方。下一章咱们会深入拆解MMS报文的每一个字节,到时候你会看到,原来IEC61850的“灵魂”就藏在那些十六进制数字里。


公众号:蓝海资料掘金营,微信deep3321