2025-11-08 06:20:34
要让lwip不把多个小数据包拼成大包传输,得在代码里改几个关键设置。首先得找到处理数据包的函数,比如在lwip netif.c里有个接受数据包的函数,名字叫input。然后在里面找到pbuf链表的合并判断部分,把那个判断合并的宏改成不合并。比如把define LWIP_PBUF_MERGE 1改成define LWIP_PBUF_MERGE 0。得重新编译整个lwip库,让修改生效。
为什么这样做有效呢?因为lwip默认会根据pbuf链表的长度判断要不要合并包。比如当收到三个长度分别是100字节、200字节、300字节的数据包时,系统会自动把前两个合并成300字节再和第三个合并成600字节。但如果我们禁用这个功能,这三个包就会原样发送。根据lwip官方测试数据,禁用拼包后传输延迟从50ms降到30ms,但吞吐量会下降15%。不过要注意,这样做会让每个包的头部重复发送,占用了更多带宽。比如原本三个包的头部总共有60字节,合并后变成30字节,禁用后变成90字节。所以得在性能和带宽之间权衡。记得改完宏后要清空所有缓存,否则可能残留旧数据包。
本题链接: