ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

021_数据长度码不一致造成的接收异常

021_数据长度码不一致造成的接收异常 021、数据长度码不一致造成的接收异常一个让人抓狂的"随机丢包"现场前年做的一个多节点采集系统,主站轮询八个从站,波特率不高,线缆也不长,按理说应该稳如老狗。结果现场调试时出现了一个极其诡异的现象:主站发查询帧,从站明明回了数据,主站串口中断里也能看到字节一个个进来,但协议层就是判定"帧不完整",直接丢弃。更邪门的是,丢帧不是每次都丢,同一台从站,连续发十次,大概丢两三次,而且丢的位置还不固定。当时第一反应是硬件问题——是不是线缆屏蔽没做好,或者终端电阻没匹配。折腾了一下午,示波器看了波形,眼图也还算干净,误码率测试仪打流也没问题。后来实在没辙,把收上来的原始字节流全部打印出来,逐帧对比,才发现问题所在:某些帧里,数据长度码字段的值,和实际后面跟的数据字节数对不上。接收方按照长度码去取数据,取着取着要么提前结束,要么越界等待,最终超时丢弃。这个坑的隐蔽之处在于:它不是物理层误码,不是波特率偏差,也不是干扰导致的位翻转。帧结构本身是"合法"的,校验和甚至都能算对,但长度码这个元信息撒了谎。接收方如果完全信任长度码,就会掉进陷阱。长度码到底在哪些地方会"说谎"数据长度码,在不同协议里有不同的叫法——有的叫长度字段,有的叫字节计数,有的叫载荷长度。它的本质是一个元数据,告诉接收方"后面还有多少个字节属于这一帧"。问题在于,这个值是由发送方填写的,而发送方填写的逻辑,往往和接收方理解的逻辑存在微妙的偏差。常见的几种不一致来源:第一种,发送方把长度码本身算进去了,接收方没算。比如发送方定义"长度码 = 帧头之后所有字节数,含长度
返回列表