2. TCP/IP通信基础:OSI模型与IEC104的映射关系、TCP端口号2404、连接建立与关闭机制

各位好,我是老张。今天咱们聊聊TCP/IP通信基础,这部分是理解IEC104协议怎么在网络上跑起来的关键。说白了,IEC104就是个应用层协议,它得依赖底层的TCP/IP来干活。我刚开始接触这个的时候,也绕了不少弯路,今天把核心点给大家掰扯清楚。

2.1 OSI模型与IEC104的映射关系

先说说OSI七层模型。很多教材把七层模型讲得特别复杂,其实你记住一句话就行:每一层只关心自己该干的事,把剩下的活交给下一层。IEC104协议主要工作在应用层(第7层),但它也涉及传输层和网络层。

我画了一张图,帮大家直观理解这个映射关系:

OSI模型与IEC104协议栈映射关系 OSI七层模型 7. 应用层 6. 表示层 5. 会话层 4. 传输层 3. 网络层 2. 数据链路层 1. 物理层 IEC104协议栈 IEC104应用层 APCI(应用协议控制信息)+ ASDU(应用服务数据单元) TCP传输层 端口号:2404(IEC104专用) IP网络层 IP地址 + 路由选择 网络接口层(以太网) ← IEC104报文封装在这里 ← 记住这个端口号 ← 网络层负责寻址

从这张图可以看得很清楚:IEC104的应用层报文(APCI+ASDU)直接封装在TCP报文段里,跳过了OSI的表示层和会话层。为什么?因为IEC104自己把表示和会话的功能都包了,不需要再分层。我在项目里见过有人非要在中间加一层SSL,结果把协议搞乱了,后来全改回来了。

核心要点:IEC104 = 应用层(APCI+ASDU) + 传输层(TCP) + 网络层(IP) + 链路层(以太网)。实际应用中,你只需要关心应用层和传输层,下面两层交给操作系统和网卡去处理。

2.2 TCP端口号2404

说到端口号2404,这可是IEC104的"身份证"。IANA(互联网数字分配机构)专门给IEC104分配了这个端口。我习惯把它记成"24点04分",好记。

为什么是2404,不是别的?其实没有特别深奥的原因,就是当年标准制定者选了这个号。但你要记住:在电力系统里,2404就是IEC104的专属通道。防火墙、路由器、交换机,所有网络设备都得给这个端口开绿灯。

实战经验:我在某储能站调试时,发现主站和子站怎么也连不上。查了半天,原来是防火墙把2404端口给封了。运维人员说"我们只开了80和443",我说"电力协议不走HTTP,走2404"。所以,部署前一定要确认网络设备放行了TCP 2404端口

端口号的使用规则也很简单:

  • 服务端(主站):在2404端口上监听,等待客户端连接
  • 客户端(子站):主动连接主站的2404端口
  • 一个连接一个端口:每个TCP连接占用一个端口对,但服务端监听端口始终是2404

你想想看,如果每个子站都用不同的端口,那运维得多麻烦?统一用2404,管理起来就简单多了。

2.3 连接建立与关闭机制

这部分是TCP的经典内容,但IEC104在应用上有自己的讲究。咱们先看TCP的三次握手和四次挥手,再说IEC104怎么用。

2.3.1 三次握手(连接建立)

TCP建立连接的过程,我习惯用"打电话"来类比:

  1. 第一次握手(SYN):子站说"喂,主站在吗?我想说话"
  2. 第二次握手(SYN+ACK):主站说"在呢,你说吧,我也准备好了"
  3. 第三次握手(ACK):子站说"好的,那我开始说了"

在IEC104里,这个过程对应的是启动数据传输(STARTDT)。连接建立后,子站和主站才能开始交换遥测、遥信数据。

注意:TCP连接建立后,IEC104还需要一个应用层的"激活"过程。也就是说,TCP三次握手只是"电话接通了",IEC104的STARTDT才是"确认对方是电力系统的人"。我在现场遇到过TCP连接正常,但数据就是传不过来的情况,后来发现是STARTDT没发。

2.3.2 四次挥手(连接关闭)

关闭连接的过程,我称之为"礼貌告别":

  1. 第一次挥手(FIN):一方说"我说完了,准备挂电话"
  2. 第二次挥手(ACK):另一方说"知道了,我还在说"
  3. 第三次挥手(FIN):另一方说"我也说完了,挂吧"
  4. 第四次挥手(ACK):最初的一方说"好,挂了"

在IEC104里,关闭连接前通常先发停止数据传输(STOPDT),告诉对方"我要断开了,你做好准备"。这个顺序很重要,我见过有人直接拔网线或者强制关闭socket,结果对端一直处于半连接状态,资源泄漏了。

避坑指南:我曾经在调试一个储能站时,子站程序崩溃后没有正常关闭TCP连接。主站那边一直认为连接还在,等了30分钟超时后才释放。这30分钟里,子站的数据全部丢失了。所以,一定要在程序退出前主动关闭TCP连接,并且发送STOPDT

2.3.3 IEC104的保活机制

TCP本身有保活机制(Keep-Alive),但默认是2小时才发一次探测包。对于电力系统来说,这个时间太长了。所以IEC104自己搞了一套保活机制:

参数 默认值 说明
t0(连接超时) 30秒 建立连接的最大等待时间
t1(发送/接收超时) 15秒 等待对方确认的最长时间
t2(确认超时) 10秒 无数据时发送测试帧的间隔
t3(测试帧超时) 20秒 未收到任何帧时的最大等待时间

说白了,IEC104用测试帧(Test Frame)来检查连接是否还活着。如果超过t3时间没收到任何数据,就认为连接断了,主动重连。这个机制比TCP的Keep-Alive靠谱多了。

我的习惯:在实际项目中,我会把t1设成10秒,t2设成5秒,t3设成15秒。这样连接检测更灵敏,适合储能站这种对实时性要求高的场景。但别设得太短,否则网络抖动一下就会误判为断连。

2.4 小结

好了,这一章的内容就这些。总结一下:

  • OSI映射:IEC104工作在应用层,直接跑在TCP上,中间没有其他层
  • 端口2404:这是IEC104的专属端口,网络设备必须放行
  • 三次握手:建立TCP连接,然后发STARTDT激活应用层
  • 四次挥手:先发STOPDT,再关闭TCP连接,别直接拔网线
  • 保活机制:用测试帧代替TCP Keep-Alive,更灵敏更可靠

下一章咱们会深入IEC104的报文结构,看看APCI和ASDU到底长什么样。到时候我会拿一个真实的储能站报文来拆解,保证你看完就能上手抓包分析。


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