2. TCP/IP通信基础:OSI模型与IEC104的映射关系、TCP端口号2404、连接建立与关闭机制
各位好,我是老张。今天咱们聊聊TCP/IP通信基础,这部分是理解IEC104协议怎么在网络上跑起来的关键。说白了,IEC104就是个应用层协议,它得依赖底层的TCP/IP来干活。我刚开始接触这个的时候,也绕了不少弯路,今天把核心点给大家掰扯清楚。
2.1 OSI模型与IEC104的映射关系
先说说OSI七层模型。很多教材把七层模型讲得特别复杂,其实你记住一句话就行:每一层只关心自己该干的事,把剩下的活交给下一层。IEC104协议主要工作在应用层(第7层),但它也涉及传输层和网络层。
我画了一张图,帮大家直观理解这个映射关系:
从这张图可以看得很清楚: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建立连接的过程,我习惯用"打电话"来类比:
- 第一次握手(SYN):子站说"喂,主站在吗?我想说话"
- 第二次握手(SYN+ACK):主站说"在呢,你说吧,我也准备好了"
- 第三次握手(ACK):子站说"好的,那我开始说了"
在IEC104里,这个过程对应的是启动数据传输(STARTDT)。连接建立后,子站和主站才能开始交换遥测、遥信数据。
注意:TCP连接建立后,IEC104还需要一个应用层的"激活"过程。也就是说,TCP三次握手只是"电话接通了",IEC104的STARTDT才是"确认对方是电力系统的人"。我在现场遇到过TCP连接正常,但数据就是传不过来的情况,后来发现是STARTDT没发。
2.3.2 四次挥手(连接关闭)
关闭连接的过程,我称之为"礼貌告别":
- 第一次挥手(FIN):一方说"我说完了,准备挂电话"
- 第二次挥手(ACK):另一方说"知道了,我还在说"
- 第三次挥手(FIN):另一方说"我也说完了,挂吧"
- 第四次挥手(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