Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Network
各位进来讨论一下lwip 常时间停留FIN_WAIT_1状态的bug
发布于 2020-05-07 10:13:05 浏览:3323
订阅该版
最近在测试rt thread 3.1.3 + lwip2.0.3版本的程序,硬件是STM32F429 + LAN8720,即正点原子的阿波罗开发板。 故障现象:应用程序编写一个tcp服务器的程序,在电脑端启动一个tcp客户端向服务器发送数据,服务器接收到后返回数据,经过几天的测试,通信的稳定性不错了,就是通信速度还待优化提升一下。 ![tcp测试.jpg](/uploads/202005/07/094606spm4v8hn7pnkhhns.jpg) 这时拔下网线,在msh接口,执行命令tcpserver --stop 关闭开发板上的服务器程序连接。再输入netstate 查看lwip链接的状态,发现链接并不能马上关闭,如下图,链接处于FIN_WAIT_1状态,要过很长的时间才能关闭释放。经过查看lwip的源程序,tcp.c程序中的981行 tcp_slowtmr函数完成了tcp连接的超时释放处理,函数处理FIN_WAIT_1状态的链接,根据tcp连接关闭的4次握手操作,服务器(开发板)发送FIN_WAIT_1后,等待客户端(电脑)应答ACK进而转入FIN_WAIT_2,由于网线断开,服务器(开发板)程序收到不ack而处于FIN_WAIT_1状态。tcp_slowtmr函数中处理这个状态的超时是按照tcp数据重发逻辑进行的,即采用超时后指数级时间退让再进行下一次数据发送,这个时间总的算下来,可达10多个分钟或更久。 ![dfef.jpg](/uploads/202005/07/095040rqq26rxrn2kprpxx.jpg) ![20170519213345831.png](/uploads/202005/07/095501lspl3z3i73l3i3fm.png) 经过查看lwip网站,此问题已经相关开发者在去年就提出过,bug的网址:[http://savannah.nongnu.org/bugs/?func=detailitem&item_id=56161#comment3](http://savannah.nongnu.org/bugs/?func=detailitem&item_id=56161#comment3) ![tcpbuf.jpg](/uploads/202005/07/100647uklk0jkexylejj3x.jpg) 开发者提出的修改建议并没有得到lwip作者的赞同,原因是作者认为这样修改会违背tcpip协议的标准,但是这种bug确实在实际应用中容易出现,并且不能允许这个tcp连接长时间不释放而无法建立新的连接。 我个人建议采用讨论中修改办法,即在 tcp_slowtmr函数中增加对FIN_WAIT_1状态的超时处理。如下图标示的修改方法。 ![modify.jpg](/uploads/202005/07/101132dbnp29buiihd9zbu.jpg) 请各位进来讨论一下,看看有没有更好的办法能解决此问题?
查看更多
5
个回答
默认排序
按发布时间排序
fovery
2021-04-11
Simple yet extraordinary
遇到了同样的问题,我是tcp server,有很多从设备,当直接断电从设备后,应用层没有心跳包后,我主动close掉socket,但socket仍然处于FIN_WAIT_1状态,并占用TCP PCB。 当从设备再次上电后,会发现没有足够的TCP PCB可用。 我的更改方案: ## 方案1 将tcp_slowtmr()中这条语句更改: ```c /* Check if this PCB has stayed too long in FIN-WAIT-2 */ if (pcb->state == FIN_WAIT_2) { ``` 更改为: ` if (pcb->state == FIN_WAIT_2 || pcb->state == FIN_WAIT_1) {` ## 方案2 直接将lwipopts.h的宏定义TCP_MAXRTX值12改小为4,这样拔掉网线后重发4次就会自动删除掉PCB,此时用户应用层的recv()会接收到返回-1的事件,用户再close掉已删除了PCB的socket。 ` #define TCP_MAXRTX 12` 更改为: ` #define TCP_MAXRTX 4` 推荐用方案2,因为这样不改动lwip内部,仅改动了配置参数,并且也符合TCPIP协议的规范。
sync
2020-05-11
这家伙很懒,什么也没写!
好帖,只是能力有限,帮顶下了
aozima
2020-05-11
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
把这个超时改得很短也能尽可能的避免这个问题。
fhqmcu
认证专家
2020-05-11
个人博客:https://blog.csdn.net/fhqlongteng
>好帖,只是能力有限,帮顶下了 谢谢,你可以记下这个问题及解决办法,以后要开发以太网也会遇到这样的问题。
whj467467222
认证专家
2020-05-11
开源,分享,交流,共同进步
好帖,只是能力有限,先收藏了。
撰写答案
登录
注册新账号
关注者
0
被浏览
3.3k
关于作者
fhqmcu
个人博客:https://blog.csdn.net/fhqlongteng
提问
16
回答
60
被采纳
1
关注TA
发私信
相关问题
1
lwip1.4.1连接经常会断开无法连接上,可以ping通
2
LPC1768:RTT+LWIP+webserver用IE刷网页出现硬件中断错误(已经解决)
3
求一些LWIP开发的经验,目前ping一直不稳定。
4
stm32f207+dp83848无法ping通
5
RTT下的LWIP传递机制
6
rtt内lwip的socket是否是线程安全?
7
Lwip+enc28j60无法ping通
8
坑爹的rtconfig.h lwip关掉了checksum
9
花了一个晚上,把RT2.0的LWIP、网卡驱动、文件系统整合起来了,发现一点小问题
10
lwip例程中udp发送时如何指定源端口发送到指定目的地端口
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
2
RT-Thread EtherKit开源以太网硬件正式发布
3
如何在master上的BSP中添加配置yml文件
4
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
5
RT-Thread 发布 EtherKit开源以太网硬件!
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
MicroPython
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
16
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
6
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部