最近看了赵欣大佬的通信原理探秘又结合在工作中遇到的问题,关注到了通讯中的KeepAlive定时器的设置,所以做了如下实验。
硬件:
1513PLC TCP客户端
PC TCP服务器
前提条件:禁用PLC侧KeepAlive
程序:
测试流程:
打开PC端网络调试助手,设置为TCP服务器,打开链接;
PC端打开WireShack软件,开启数据捕捉;
博途中打开Trace,设置观察数据;
博途在线 设置"TestDB".TCPtoPC.SedLEN为1000,即发送的数据长度为1000,置位"TestDB".TCPtoPC.CONNT,等待链接建立后,置位"TestDB".UDPtoPC.SedREQ开启发送;
发送过程中,拔掉PLC与PC链接的网线;
等待PLC侧出现Busy后,暂停trace;
WireShack捕获如图
PC端WireShack抓包如图
上图1处为插入网线后PC端接收到的第一条数据,随后PC端TCP服务器主动断开,2秒后PLC侧主动重连。在第一次建立连接到网线断开处,可看出共收到11条数据。
疑问:
1500的StackBuffer共8192个字节,如上,网线断开后共有19-11=8条数据存入了StackBuffer中,若仅计算数据长度,则在这个期间内共有8*1000=8000字节数据存入StackBuffer中,若根据StackBuffer处于OSI参考模型的第4层,数据压入到StackBuffer中时带有TCP头部信息,则每条数据实际长度为1000+20=1020字节,则在这期间共有8*1020=8160字节数据压入到StackBuffer中。虽然两者的结果均可导致第17次发送时,ShadowBuffer中的1000字节数据无法压入StackBuffer中,导致Busy常为1。
另外为何断开网线 重新插入后,PC端接收到的第一条数据长度是1460字节?ShadowBuffer满通讯正常后,发送长度为何不按发送端发送的长度发送,而是以最大长度发送?
又为何服务器端会主动复位连接?
PLC是否是固定在连接异常后2秒重连?