GD32F470+lwip 丢包问题分析及解决

        最近在用GD32和管理机之间用TCP协议开发一个功能,功能都没问题,后面跑大量发包时候的连续测试时,总是会出现偶发性的,大概几分钟到数十分钟的一次丢包。尽管在应用层做了超时机制,一旦超时就会重新建立socket链接并重新发包,但是这样做太丑陋了,而且断开重连延时太大了,还是想彻底搞清楚这个个问题。所以先抓包吧。

管理机使用TCP dump抓包,要加-v选项,不然后面无法从通信流程上看到问题所在(最开始没加,以为是其它问题,愣是分析了半天也没想出所以然)。注意:cksum 0x5295 (incorrect -> 0x0026)的字样不是说我校验和没对,而是校验和的计算是放在了mac控制器硬件计算,而tcpdump抓包的时候,处于mac计算之前,所以这时候检验和不对是正常的,这个功能叫做offload,可以关闭的。

然后在GD32中打开lwip的debug选项,也进行了抓包

抓完包之后,进行分析,由于篇幅有限就不放全部的抓包日志了,跟大家讲下这中间发生了什么。

先看管理机tcpdump日志,我的程序会发送数据位25字节大小的报文,GD32收到并执行操作后返回12字节的报文,就是一来一回这样收发。

可以看到前面25,12,25,12,交替的报文收发是正常的,但是突然就有这么一个包,嘿,发不出去了,所以一直在重发,重发很多次也收不到ack。直到什么时候才发出去呢?直到我应用程序关闭了链接,在TCP协议关闭前最后一次发送缓冲区的剩余内容时,他发出去了,并且收到了GD32的ack。

再来看看GD32的抓包,简而言之,除了那个管理机一直重发发不出去的包,前后所有的包,GD32都收到了。

后来我进行了多次试验,实验结果均是如此。一开始我还没有注意校验和这个字段,光分析TCP协议去了,什么nolelay啊,什么快速重传,以及很多配置都用过了,均失败了。后来吧tcpdump的-v选项打开,偶然间看到发这个重传的包的校验和是0xffff,卧槽这个可太敏感了,不是什么0x1234,也不是0x9876,偏偏是这个十六位检验值的边界!所以大胆假设,只有校验和恰好是0xffff的才会丢包。再做做实验,真的每次都是这个0xffff的包发不出去!

于是,我查阅手册,把GD32的MAC控制器的硬件校验给关掉,再把LWIP的软件校验给打开。

就不再丢包了,并且再次遇到0xffff校验和的包,也能够被收到了:

所以,我的结论就是:GD32的MAC控制器的硬件校验存在bug,只要遇到校验和0xffff的包,就把他丢掉。解决办法:关闭硬件校验,使用LWIP的软件校验

这也解释了为什么我关闭了socket链接,反而能够将缓冲区的包发出去了,因为关闭连接之后发的包,flag字段不一样,也就导致校验和不是0xffff,所以能够被GD32接收。

同时后来我查约到了另一个网友的帖子:GD32F407ZET6+LAN8720,DMA以太网移植LWIP协议栈,UDP通信ping测试每65535包丢一包 - GD32 MCU - 电子工程世界-论坛 (eeworld.com.cn)

每65535丢一个包,这不就是uint16的范围吗?估计原因和我这个一样,遇到0xffff了。所以啊,估计GD32的不止一款芯片的MAC控制器有问题,大家开发这个的时候注意别踩坑!

后面问了代理商的技术支持,暂未回复

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/19572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT系列教程(6) 几种标准对话框

几种标准对话框 本文介绍几种标准对话框,都是Qt封装好的,我们先创建一个界面,添加几个按钮,然后分别在几个按钮的回调函数里添加创建不同对话框的逻辑 颜色对话框 颜色对话框用来选择颜色,创建后会显示各种颜色和透明…

GPT-4o:人工智能的新里程碑

GPT-4o,作为OpenAI最新推出的人工智能技术,无疑在人工智能领域掀起了新一轮的浪潮。这款新型的语言模型不仅继承了GPT系列的核心优势,更在多个方面实现了突破性的进展。以下,我们将从版本间的对比分析、GPT-4o的技术能力以及个人整…

html中table的替代方案

使用插件,2个功能强大的table插件 DataTables | Javascript table library 专门的table处理插件,下载时可以配置是否支持bootstrap和jquery ui等。参数众多。表格组件 table - Layui 文档 国内的插件,只支持jquery,配合默认的layu…

ABB码垛机器人IRB260通讯板维修

ABB码垛机器人在现代制造业中发挥着重要作用,而机器人通讯板维修对于确保机器人的正常运行至关重要。 通讯板是ABB码垛机器人与控制系统之间进行数据传输的桥梁。它负责接收控制系统的指令,并将机器人的运行数据反馈给控制系统。如果通讯板出现故障&…

Qos基础

一、Qos概述 Qos是一个框架,解决服务质量,尽力而为模型,集成服务以及区分服务模型,流量分类与标识。 使用Qos是带宽不够。 每个接口有硬件队列和软件队列(队列排满了就不会再排)。 企业宽带一般都是上行和下…

模糊C均值(FCM)算法更新公式推导

模糊C均值(FCM)算法更新公式推导 目标函数 FCM的目标函数为: J m ∑ i 1 n ∑ j 1 k u i j m ∥ x i − c j ∥ 2 J_m \sum_{i1}^n \sum_{j1}^k u_{ij}^m \|x_i - c_j\|^2 Jm​i1∑n​j1∑k​uijm​∥xi​−cj​∥2 其中: …

7个Python爬虫入门小案例

大家好,随着互联网的快速发展,数据成为了新时代的石油。Python作为一种高效、易学的编程语言,在数据采集领域有着广泛的应用。本文将详细讲解Python爬虫的原理、常用库以及实战案例,帮助读者掌握爬虫技能。 一、爬虫原理 爬虫&a…

WHAT - 用户登录系列(二)- 单点登录 SSO

目录 一、认证机制1.1 基于会话的认证(Session-based Authentication)1. 介绍2. 基本流程 1.2 JSON Web Tokens (JWT)1. 介绍2. jwt 组成3. 基本流程4. 阻止列表5. 刷新令牌 二、单点登录:SSO2.1 单系统登录2.2 SSO 介绍2.3 SSO 登录2.4 SSO …

使用jquery.mousewheel-3.0.6.pack.js时报错

基于1.12.4版本的jquery.min.js,在使用jquery.mousewheel-3.0.6.pack.js时报错了: 可以如下解决: addEventListener事件里要加上{ passive: false },这样就可以在使用鼠标滚轮放大缩小图片时,就不会报上述的错误了。 …

解决docker容器: bash: ping: command not found, 并制作镜像

一. 出现原因 从 dockerhub 拉下来的镜像都是最轻量级的, 不会安装各种工具, 所以使用 ping, vim 等命令, 会出现 command not found 二. 解决方式 2.1 安装工具包 进入到一个正在运行的容器内部, 执行命令: apt-get update 之后会发现, 容器正在更新软件包, 不过最终会由…

水工建筑物荷载设计规范的技术关键点

遵循《水工建筑物荷载设计规范》的指引,水工建筑所承载的荷载依据其作用的时间变异性特征,可划分为永久作用荷载、可变作用荷载以及偶然作用荷载三个主要类别。 一、荷载分类及其特点 永久作用荷载:涉及建筑物自身的结构重量,以及…

主线程等待所有线程结束之后再执行

如何让主线程等待所有线程结束之后再执行 1、Future的机制,使用Future.get()阻塞等待结果(Future,FutureTask) 2、CountDownLatch同步工具类,此类的作用就是一个线程等待所有线程结束之后再执行 3、CompletableFuture …

音视频开发—FFmpeg播放YUV文件,YUV转换为JPEG操作

文章目录 1.使用命令行播放YUV数据1.1命令解析1.2参数说明 2.使用C语言实现将YUV数据转为JPEG图片格式2.1需求分析2.2读取YUV源文件2.3将YUV数据封装为AVFrame2.4将NV12 转换为YUV420平面格式2.5初始化MJPEG编码器2.6将YUV420P编码为JPEG2.7将编码数据写入图片文件2.8完整代码 …

App自动化测试_Python+Appium使用手册

一、Appium的介绍 Appium是一款开源的自动化测试工具,支持模拟器和真机上的原生应用、混合应用、Web应用;基于Selenium二次开发,Appium支持Selenium WebDriver支持的所有语言(java、 Object-C 、 JavaScript 、p hp、 Python等&am…

故障诊断 | 基于 KAN、KAN卷积的轴承故障诊断模型

研究背景: 轴承是机械设备中常见的关键部件之一,其工作状态直接影响设备的性能和可靠性。因此,轴承故障的早期诊断对于设备的正常运行和维护具有重要意义。近年来,基于振动信号的轴承故障诊断成为了研究的热点之一。KAN: Kolmogorov-Arnold Network 是一种有效的处理方法。…

ax.set_xticks(range(len(years))) 将 x 轴刻度设置为数据集的索引范围

在 ax.set_xticks() 方法中,我们传递了一个参数,该参数是一个列表,用于指定 x 轴刻度的位置。在这个列表中,我们使用了 range(len(years)),其中 len(years) 是年份列表的长度。range() 函数会生成一个从 0 到 len(year…

C语言贪心算法——解硬币

题目:有1元,5元,10元,100元,500元的硬币各从c1枚, c5枚,c10枚,c50枚,c100枚, c500枚,现在要用这些硬币支付A元, 最少需要多少枚硬币 输入:第一行有…

安装flask:后端框架的学习之旅

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、创建虚拟环境 1. 引入虚拟环境的概念 2. 创建Flask虚拟环境 三、安装Flask…

CSRF跨站请求伪造漏洞

CSRF跨站请求伪造漏洞 1.CSRF漏洞概述2.防御CSRF攻击3.CSRF防御绕过CSRF令牌未绑定到用户会话自定义标头令牌绕过绕过Referer检查关键词绕过 4.利用示例使用HTML标签进行GET表单 GET 请求表单POST请求通过 iframe 发送表单 POST 请求Ajax POST 请求 5.CSRF BP 验证方法6.CSRF测…

HTTP协议介绍与TCP协议的区别

1、HTTP介绍 HTTP(超文本传输协议,Hypertext Transfer Protocol)是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式。HTTP 是基于TCP/IP 进行数据的通信,通常使用端口 80/8080。HTT…