Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
搞死LWIP的方法
发布于 2010-04-18 03:29:08 浏览:7942
订阅该版
lwip的netconn有一个缺陷,它的tcp window和输入缓冲区没有直接联系,输入的数据是以pbuf的形式存放在conn->recvmbox里面的,这个mbox尺寸是10,这个size和缓冲区的大小无关,只是数据包的数量。 现在假设TCP_WND是1024,网络端快速发过来几十个1字节的数据包,这时候上面的mbox就会很快溢出,溢出的第一个包在pcb->refused_data里面会缓存一下,不过这个能力也很有限,等pcb->refused_data也存不下了这个pbuf就被直接丢弃了。这是在TCP_WND还没用完的情况下就丢包了。 更严重一点的情况,如果上面这种状况发生的同时lwip还在向上位机程序发数据的话,之前被丢弃的包很可能同时也是这些数据包的ACK,ACK丢了就会导致lwip向上位机重发这些数据,而上位机这边也在不停的重发(window没用完却丢包了必然会重发),然后两边就互不理睬各发各的。。。最后rst。断开。 这种情况有两个前提,一个是接受速度没那么快,这种情况我觉得还是比较容易发生的,比如一边收网络包一边发送到usart,波特率慢的时候网络接收就会很慢。 还有一个前提是上位机发来大量段数据包,且这些数据包总和x10 < TCP_WND。 目前还没想到很好的办法解决这个问题,加大mbox或者减小window只能稍微缓解一下,只要mbox的size
查看更多
6
个回答
默认排序
按发布时间排序
bernard
2010-04-18
这家伙很懒,什么也没写!
嗯,这个确实是个大问题。 修正下才是,mbox机制需要修改下,改成非mbox机制比较好。
mbbill
2010-04-18
这家伙很懒,什么也没写!
这样工作量有点大了 [s:191] [s:191] [s:191] 另外这个问题在优化lwip的时候也很可能发生,比如为了提高性能把TCP_BUF和TCP_WND定的比较大,这时候很可能就会发生这种现象,wireshark一抓全都是重发的包。
bernard
2010-04-18
这家伙很懒,什么也没写!
工作量可能还行,可以考虑把mbox更改成数据队列的方式。只是这样的话,那么lwip那边tcp线程确实会修改一些了。这个加上,系能是否会好些呢。 找个时间验证一把。
zyb
2012-08-04
这家伙很懒,什么也没写!
请教楼主,TCP接受的流程应该是这样吧:ethernetif -> recvmbox -> tcpip_thread() -> ip_input() -> tcp_input() -> tcp_process() -> tcp_receive(),在tcp_receive()里减少接收窗口pcb->rcv_wnd的值,不管用户程序有没有读取tcp数据,tcp_receive()都会执行,接收窗口都会改变。 而recvmbox是与tcpip_thread线程通信用的,10个mbox已经足够用了,因为线程间通信的速度相当的快,不管用户程序读不读tcp数据,tcpip_thread总会及时的读取mbox里的内容,那么这个mbox怎么可能会满掉?就算网络发来几百上千个大小为1的tcp包,tcpip_thread读取mbox的速度也会远大于ethernetif接收包的速度。所以我认为mbox不会满,只要mbox不会满,程序就会正常走到tcp_receive(),正确的改变接收窗口pcb->rcv_wnd的值。当接收窗口为0时,对方tcp拥塞控制不会再发来数据,直到用户程序读走数据,释放缓冲区,pcb->rcv_wnd变大后正常接收数据,不会有任何丢包情况吧?
zyb
2012-08-20
这家伙很懒,什么也没写!
楼主危言耸听,经过测试没有楼主所说的问题,楼主的代码估计有其它方面的问题。其实用脚指头想一下也不可能,lwip连很多TCP的细节都实现了,不可能连TCP最最基本的拥塞控制都不实现吧。
撰写答案
登录
注册新账号
关注者
0
被浏览
7.9k
关于作者
mbbill
这家伙很懒,什么也没写!
提问
3
回答
43
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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
开源共生 商业共赢 | RT-Thread 2024开发者大会议程正式发布!
2
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
3
RT-Thread EtherKit开源以太网硬件正式发布
4
如何在master上的BSP中添加配置yml文件
5
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
热门标签
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
19
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
6
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
5
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部