LWIP,tcp数据包发送结束后悔多发6个字节0数据
本帖最后由 阴世幽泉 于 2021-1-27 17:53 编辑使用lwip碰到这样一个情况:f429平台,使用freertos+lwip,netconn_write发送数据到服务器,服务器收到数据返回应答数据包,设备端能正常接收,可是客户端会马上再发送6个字节00数据,而我程序上并没有发送这样的数据包,另外我查看了并没有启用keepalive,请教下有谁知道这个问题大概是哪里引起的,还有就是如果启用keepalive功能,lwip是发送空数据包还是其它数据?
抓包数据如下:
08 62 66 82 0D AD 02 00 00 33 00 44 08 00 45 00 00 28 08 E1 00 00 FF 06 31 5E C0 A8 00 16 C0 A8 00 2A C0 07 04 CE 00 04 6E 88 B0 1F 6D EF 50 10 06 F0 D5 E2 00 00 00 00 00 00 00 00
不太清楚你这个怎么回事,不行移植我这个搞下
LwIP网络教程开始更新,使用MDK的RTE环境开发,配套RTX5和FreeRTOS两个版本,更新至第7章(2020-05-03)
http://www.armbbs.cn/forum.php?mod=viewthread&tid=95874&fromuid=58
(出处: 硬汉嵌入式论坛)
eric2013 发表于 2021-1-28 00:03
不太清楚你这个怎么回事,不行移植我这个搞下
LwIP网络教程开始更新,使用MDK的RTE环境开发,配套RTX5和 ...
我这个工程没有直接使用硬汉哥的rte环境,而是用了cubemx生成,不过lwip我替换成最新版本,现在是没有头绪可能出现的问题点 TCPIP数据包有长度要求,不足的话会补足。 regbbs 发表于 2021-1-28 09:12
TCPIP数据包有长度要求,不足的话会补足。
根据楼主的描述是后面再发的0,感觉不合理。 regbbs 发表于 2021-1-28 09:12
TCPIP数据包有长度要求,不足的话会补足。
一包数据已经收发完整了,然后不知道怎么就再发了6字节0的数据,我建立了几个connect,都有这个情况,所以怀疑应该是哪里不小心开启了,但是就是不知道哪里 eric2013 发表于 2021-1-28 09:41
根据楼主的描述是后面再发的0,感觉不合理。
硬汉哥,这个是我的lwip配置文件,您看下是不是这里有隐患
#ifndef __LWIPOPTS_H__
#define __LWIPOPTS_H__
#include "cmsis_os.h"
#define SYS_LIGHTWEIGHT_PROT 1 /* 平台锁,保护关键区域内缓存的分配与释放 */
#define NO_SYS 0 /* NO_SYS==1:不使用操作系统 */
#define NO_SYS_NO_TIMERS 0
#define MEM_ALIGNMENT 4 /* 使用4字节对齐模式 */
#define MEM_SIZE (30*1024) /* heap内存的大小,如果在应用中有大量数据发送的话这个值最好设置大一点 */
#define MEMP_NUM_PBUF 50 /* memp结构的pbuf数量,如果应用从ROM或者静态存储区发送大量数据时,这个值应该设置大一点 */
#define MEMP_NUM_UDP_PCB 6 /* UDP协议控制块(PCB)数量.每个活动的UDP"连接"需要一个PCB. */
#define MEMP_NUM_TCP_PCB 10 /* 同时建立激活的TCP数量 */
#define MEMP_NUM_TCP_PCB_LISTEN 6 /* 能够监听的TCP连接数量 */
#define MEMP_NUM_TCP_SEG 12 /* 最多同时在队列中的TCP段数量 */
#define MEMP_NUM_SYS_TIMEOUT 10 /* 能够同时激活的timeout个数 */
#define PBUF_POOL_SIZE 16 /* pbuf内存池个数 */
#define PBUF_POOL_BUFSIZE 512 /* 每个pbuf内存池大小 */
//#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN)
#define LWIP_TCP 1 /* 为1是使用TCP */
#define TCP_TTL 255 /* 生存时间 */
#define TCP_QUEUE_OOSEQ 0 /* 当TCP的数据段超出队列时的控制位,当设备的内存过小的时候此项应为0 */
#define TCP_MSS (1500 - 40) /* 最大TCP分段 TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */
#define TCP_SND_BUF (4*TCP_MSS) /* TCP发送缓冲区大小(bytes) */
#define TCP_SND_QUEUELEN (2* TCP_SND_BUF/TCP_MSS) /* TCP发送缓冲区大小(pbuf).这个值最小为(2 * TCP_SND_BUF/TCP_MSS) */
#define TCP_WND (2*TCP_MSS) /* TCP发送窗口 */
#define LWIP_ICMP 1 /* 使用ICMP协议 */
#define LWIP_DHCP 1 /* 当使用DHCP时此位应该为1 */
#define LWIP_UDP 1 /* 使用UDP服务 */
#define UDP_TTL 255 /* UDP数据包生存时间 */
#define LWIP_STATS 0 /**/
#define LWIP_PROVIDE_ERRNO 1 /**/
#define LWIP_NETIF_LINK_CALLBACK 1
#define CHECKSUM_BY_HARDWARE /* 定义CHECKSUM_BY_HARDWARE,使用硬件帧校验,STM32F746允许通过硬件识别和计算IP,UDP和ICMP的帧校验和 */
#ifdef CHECKSUM_BY_HARDWARE
/* CHECKSUM_GEN_IP==0: Generate checksums by hardware for outgoing IP packets.*//* 硬件生成IP数据包的帧校验和 */
#define CHECKSUM_GEN_IP 0
/* CHECKSUM_GEN_UDP==0: Generate checksums by hardware for outgoing UDP packets.*/
#define CHECKSUM_GEN_UDP 0
/* CHECKSUM_GEN_TCP==0: Generate checksums by hardware for outgoing TCP packets.*/
#define CHECKSUM_GEN_TCP 0
/* CHECKSUM_CHECK_IP==0: Check checksums by hardware for incoming IP packets.*/
#define CHECKSUM_CHECK_IP 0
/* CHECKSUM_CHECK_UDP==0: Check checksums by hardware for incoming UDP packets.*/
#define CHECKSUM_CHECK_UDP 0
/* CHECKSUM_CHECK_TCP==0: Check checksums by hardware for incoming TCP packets.*/
#define CHECKSUM_CHECK_TCP 0
/* CHECKSUM_CHECK_ICMP==0: Check checksums by hardware for incoming ICMP packets.*/
#define CHECKSUM_GEN_ICMP 0
#else
/* CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets.*/
#define CHECKSUM_GEN_IP 1
/* CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets.*/
#define CHECKSUM_GEN_UDP 1
/* CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets.*/
#define CHECKSUM_GEN_TCP 1
/* CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets.*/
#define CHECKSUM_CHECK_IP 1
/* CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets.*/
#define CHECKSUM_CHECK_UDP 1
/* CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets.*/
#define CHECKSUM_CHECK_TCP 1
/* CHECKSUM_CHECK_ICMP==1: Check checksums by hardware for incoming ICMP packets.*/
#define CHECKSUM_GEN_ICMP 1
#endif
#define LWIP_NETCONN 1/* LWIP_NETCONN==1:使能NETCON函数(要求使用api_lib.c) */
#define LWIP_SOCKET 1/*LWIP_SOCKET==1:使能Socket API(要求使用sockets.c)*/
//#define LWIP_COMPAT_MUTEX 0 /* 表示是否用信号量来替代互斥信号量 */
#define LWIP_SO_RCVTIMEO 1 /*通过定义LWIP_SO_RCVTIMEO使能netconn结构体中recv_timeout,使用recv_timeout可以避免阻塞线程*/
//#define LWIP_SO_SNDTIMEO 1
#define TCPIP_THREAD_NAME "tcpip_thread"
#define TCPIP_THREAD_STACKSIZE 1024
#define TCPIP_THREAD_PRIO osPriorityLow3
#define TCPIP_MBOX_SIZE 10
#define SLIPIF_THREAD_NAME "slipif_loop"
#define SLIPIF_THREAD_STACKSIZE 1024
#define SLIPIF_THREAD_PRIO osPriorityNormal
#define DEFAULT_THREAD_NAME "lwIP"
#define DEFAULT_THREAD_STACKSIZE 1024
#define DEFAULT_THREAD_PRIO osPriorityNormal
#define DEFAULT_RAW_RECVMBOX_SIZE 10
#define DEFAULT_UDP_RECVMBOX_SIZE 10
#define DEFAULT_TCP_RECVMBOX_SIZE 10
#define DEFAULT_ACCEPTMBOX_SIZE 10
//#define LWIP_DEBUG 1
#define ICMP_DEBUG LWIP_DBG_OFF //开启/关闭ICMPdebug
#endif /* __LWIPOPTS_H__ */
那就跟踪下发送的流程,尤其是移植文件的发送部分。lwip好些年没看了。 检查发送的时候pbuf是一个就包含了所有的数据还是被分成了两个,还有就是txdma的描述符,看看发送的数据包各部分数据是不是正常。 阴世幽泉 发表于 2021-1-28 14:07
硬汉哥,这个是我的lwip配置文件,您看下是不是这里有隐患
#ifndef __LWIPOPTS_H__
这个是我的配置:
/*
* Copyright (c) 2019 Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef LWIP_LWIPOPTS_H
#define LWIP_LWIPOPTS_H
/* Options managed by RTE */
#include "lwipopts_rte.h"
/* See "lwip/opt.h" for all available configuration options */
/*
------------------------------------
-------------- NO SYS --------------
------------------------------------
#define NO_SYS managed by RTE
#define LWIP_TIMERS managed by RTE
#define SYS_LIGHTWEIGHT_PROT managed by RTE
*/
/*
------------------------------------
---------- Memory options ----------
------------------------------------
*/
#define MEM_LIBC_MALLOC 0
#define MEMP_MEM_MALLOC 1
#define MEMP_MEM_INIT 0
#define MEM_ALIGNMENT 4
#define MEM_SIZE (36*1024)
#define MEMP_OVERFLOW_CHECK 0
#define MEMP_SANITY_CHECK 0
#define MEM_OVERFLOW_CHECK 0
#define MEM_SANITY_CHECK 0
/* ------------------------------------------------
---------- Internal Memory Pool Sizes ----------
------------------------------------------------
*/
#define MEMP_NUM_PBUF 10
#define MEMP_NUM_RAW_PCB 4
#define MEMP_NUM_UDP_PCB 6
#define MEMP_NUM_TCP_PCB 10
#define MEMP_NUM_TCP_PCB_LISTEN 6
#define MEMP_NUM_TCP_SEG 12
#define MEMP_NUM_REASSDATA 16
#define MEMP_NUM_FRAG_PBUF 15
#define MEMP_NUM_ARP_QUEUE 10
#define MEMP_NUM_IGMP_GROUP 8
#define MEMP_NUM_NETBUF 2
#define MEMP_NUM_NETCONN 4
#define MEMP_NUM_SELECT_CB 4
#define MEMP_NUM_TCPIP_MSG_API 8
#define MEMP_NUM_TCPIP_MSG_INPKT 8
#define MEMP_NUM_NETDB 1
#define MEMP_NUM_LOCALHOSTLIST 1
#define PBUF_POOL_SIZE 16
/*
---------------------------------
---------- ARP options ----------
---------------------------------
#define LWIP_ETHERNET managed by RTE
*/
#define LWIP_ARP 1
#define ARP_TABLE_SIZE 10
#define ETHARP_SUPPORT_VLAN 0
#define ETH_PAD_SIZE 2
#define ETHARP_SUPPORT_STATIC_ENTRIES 0
/*
--------------------------------
---------- IP options ----------
--------------------------------
#define LWIP_IPV4 managed by RTE
*/
#define IP_FORWARD 0
#define IP_REASSEMBLY 1
#define IP_FRAG 1
#define IP_OPTIONS_ALLOWED 1
#define IP_REASS_MAX_PBUFS 10
#define IP_DEFAULT_TTL 128
#define IP_SOF_BROADCAST 1
#define IP_SOF_BROADCAST_RECV 1
/*
----------------------------------
---------- ICMP options ----------
----------------------------------
*/
#define LWIP_ICMP 1
/*
---------------------------------
---------- RAW options ----------
---------------------------------
*/
#define LWIP_RAW 1
/*
----------------------------------
---------- DHCP options ----------
----------------------------------
*/
#define LWIP_DHCP 0
#define LWIP_DHCP_CHECK_LINK_UP 0
#define LWIP_DHCP_BOOTP_FILE 0
#define LWIP_DHCP_GET_NTP_SRV 0
#define LWIP_DHCP_MAX_NTP_SERVERS 0
/*
------------------------------------
---------- AUTOIP options ----------
------------------------------------
*/
#define LWIP_AUTOIP 0
#define LWIP_DHCP_AUTOIP_COOP 0
#define LWIP_DHCP_AUTOIP_COOP_TRIES 9
/*
----------------------------------
---------- IGMP options ----------
----------------------------------
*/
#define LWIP_IGMP 1
/*
----------------------------------
---------- DNS options -----------
----------------------------------
*/
#define LWIP_DNS 0
#define DNS_TABLE_SIZE 4
#define DNS_MAX_NAME_LENGTH 256
/*
---------------------------------
---------- UDP options ----------
---------------------------------
*/
#define LWIP_UDP 1
#define LWIP_UDPLITE 0
/*
---------------------------------
---------- TCP options ----------
---------------------------------
*/
#define LWIP_TCP 1
#define TCP_QUEUE_OOSEQ 0
#define LWIP_TCP_SACK_OUT 0
#define LWIP_TCP_MAX_SACK_NUM 4
#define TCP_MSS 1460
#define TCP_OOSEQ_MAX_BYTES 0
#define TCP_OOSEQ_MAX_PBUFS 0
#define TCP_LISTEN_BACKLOG 1
#define TCP_DEFAULT_LISTEN_BACKLOG 0xff
#define LWIP_EVENT_API 0
#define LWIP_CALLBACK_API 1
#define LWIP_WND_SCALE 0
#define TCP_RCV_SCALE 0
#define LWIP_TCP_PCB_NUM_EXT_ARGS 0
#define LWIP_ALTCP 0
#define LWIP_ALTCP_TLS 0
#define TCP_WND (6 * TCP_MSS)
#define TCP_SND_BUF (6 * TCP_MSS)
/*TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least
as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. */
#define TCP_SND_QUEUELEN (2* TCP_SND_BUF/TCP_MSS)
/*
----------------------------------
---------- Pbuf options ----------
----------------------------------
*/
#define PBUF_LINK_ENCAPSULATION_HLEN 0
/*
------------------------------------------------
---------- Network Interfaces options ----------
------------------------------------------------
*/
#define LWIP_SINGLE_NETIF 0
#define LWIP_NETIF_HOSTNAME 0
#define LWIP_NETIF_API 0
#define LWIP_NETIF_STATUS_CALLBACK 1
#define LWIP_NETIF_EXT_STATUS_CALLBACK0
#define LWIP_NETIF_LINK_CALLBACK 1
#define LWIP_NETIF_REMOVE_CALLBACK 0
#define LWIP_NETIF_HWADDRHINT 1
/*
------------------------------------
---------- LOOPIF options ----------
------------------------------------
*/
#define LWIP_HAVE_LOOPIF 0
#define LWIP_LOOPIF_MULTICAST 0
#define LWIP_NETIF_LOOPBACK 0
#define LWIP_LOOPBACK_MAX_PBUFS 0
/*
------------------------------------
---------- Thread options ----------
------------------------------------
*/
#define TCPIP_THREAD_NAME "tcpip_thread"
#define TCPIP_THREAD_STACKSIZE 1024
#define TCPIP_THREAD_PRIO osPriorityNormal2
#define TCPIP_MBOX_SIZE 10
#define SLIPIF_THREAD_NAME "slipif_loop"
#define SLIPIF_THREAD_STACKSIZE 1024
#define SLIPIF_THREAD_PRIO osPriorityNormal2
#define DEFAULT_THREAD_NAME "lwIP"
#define DEFAULT_THREAD_STACKSIZE 1024
#define DEFAULT_THREAD_PRIO osPriorityNormal2
#define DEFAULT_RAW_RECVMBOX_SIZE 10
#define DEFAULT_UDP_RECVMBOX_SIZE 10
#define DEFAULT_TCP_RECVMBOX_SIZE 10
#define DEFAULT_ACCEPTMBOX_SIZE 10
/*
----------------------------------------------
---------- Sequential layer options ----------
----------------------------------------------
*/
#define LWIP_NETCONN 1
#define LWIP_TCPIP_TIMEOUT 0
#define LWIP_NETCONN_SEM_PER_THREAD 0
#define LWIP_NETCONN_FULLDUPLEX 0
/*
------------------------------------
---------- Socket options ----------
------------------------------------
*/
#define LWIP_SOCKET 0
#define LWIP_COMPAT_SOCKETS 1
#define LWIP_POSIX_SOCKETS_IO_NAMES 1
#define LWIP_TCP_KEEPALIVE 1
#define LWIP_SO_SNDTIMEO 0
#define LWIP_SO_RCVTIMEO 0
#define LWIP_SO_SNDRCVTIMEO_NONSTANDARD 0
#define LWIP_SO_RCVBUF 0
#define LWIP_SO_LINGER 0
#define SO_REUSE 0
#define SO_REUSE_RXTOALL 0
#define LWIP_SOCKET_SELECT 1
#define LWIP_SOCKET_POLL 1
/*
----------------------------------------
---------- Statistics options ----------
----------------------------------------
*/
#define LWIP_STATS 0
/*
---------------------------------------
---------- IPv6 options ---------------
---------------------------------------
#define LWIP_IPV6 managed by RTE
*/
#define LWIP_IPV6_FORWARD 0
#define LWIP_IPV6_FRAG 1
#define LWIP_IPV6_REASS 1
#define LWIP_IPV6_AUTOCONFIG 1
#define LWIP_ICMP6 1
#define LWIP_IPV6_MLD 0
#define MEMP_NUM_MLD6_GROUP 4
#define LWIP_ND6_NUM_NEIGHBORS 10
#define LWIP_ND6_NUM_DESTINATIONS 10
#define LWIP_ND6_NUM_PREFIXES 5
#define LWIP_ND6_NUM_ROUTERS 3
#define LWIP_ND6_ALLOW_RA_UPDATES 1
#define LWIP_ND6_TCP_REACHABILITY_HINTS 1
#define LWIP_IPV6_DHCP6 0
#define LWIP_IPV6_DHCP6_STATEFUL 0
#define LWIP_IPV6_DHCP6_STATELESS 1
#define LWIP_DHCP6_GET_NTP_SRV 0
#define LWIP_DHCP6_MAX_NTP_SERVERS 1
/*
--------------------------------------
---------- Checksum options ----------
--------------------------------------
*/
/*
The STM32H7xx allows computing and verifying the IP, UDP, TCP and ICMP checksums by hardware:
- To use this feature let the following define uncommented.
- To disable it and process by CPU comment thethe checksum.
*/
#define CHECKSUM_BY_HARDWARE
#ifdef CHECKSUM_BY_HARDWARE
/* CHECKSUM_GEN_IP==0: Generate checksums by hardware for outgoing IP packets.*/
#define CHECKSUM_GEN_IP 0
/* CHECKSUM_GEN_UDP==0: Generate checksums by hardware for outgoing UDP packets.*/
#define CHECKSUM_GEN_UDP 0
/* CHECKSUM_GEN_TCP==0: Generate checksums by hardware for outgoing TCP packets.*/
#define CHECKSUM_GEN_TCP 0
/* CHECKSUM_CHECK_IP==0: Check checksums by hardware for incoming IP packets.*/
#define CHECKSUM_CHECK_IP 0
/* CHECKSUM_CHECK_UDP==0: Check checksums by hardware for incoming UDP packets.*/
#define CHECKSUM_CHECK_UDP 0
/* CHECKSUM_CHECK_TCP==0: Check checksums by hardware for incoming TCP packets.*/
#define CHECKSUM_CHECK_TCP 0
/* CHECKSUM_GEN_ICMP==1: Check checksums by hardware for outgoing ICMP packets.*/
/* Hardware TCP/UDP checksum insertion not supported when packet is an IPv4 fragment*/
#define CHECKSUM_GEN_ICMP 1
/* CHECKSUM_CHECK_ICMP==0: Check checksums by hardware for incoming ICMP packets.*/
#define CHECKSUM_CHECK_ICMP 0
#else
/* CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets.*/
#define CHECKSUM_GEN_IP 1
/* CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets.*/
#define CHECKSUM_GEN_UDP 1
/* CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets.*/
#define CHECKSUM_GEN_TCP 1
/* CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets.*/
#define CHECKSUM_CHECK_IP 1
/* CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets.*/
#define CHECKSUM_CHECK_UDP 1
/* CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets.*/
#define CHECKSUM_CHECK_TCP 1
/* CHECKSUM_GEN_ICMP==1: Check checksums by hardware for outgoing ICMP packets.*/
#define CHECKSUM_GEN_ICMP 1
/* CHECKSUM_CHECK_ICMP==1: Check checksums by hardware for incoming ICMP packets.*/
#define CHECKSUM_CHECK_ICMP 1
#endif
/*
--------------------------------------
---------- IP ------------------------
--------------------------------------
*/
/* Static IP address */
#define IP_ADDR0 192
#define IP_ADDR1 168
#define IP_ADDR2 0
#define IP_ADDR3 210
/* NET mask*/
#define NETMASK_ADDR0 255
#define NETMASK_ADDR1 255
#define NETMASK_ADDR2 255
#define NETMASK_ADDR3 0
/* Gateway address */
#define GW_ADDR0 192
#define GW_ADDR1 168
#define GW_ADDR2 0
#define GW_ADDR3 1
#endif /* LWIP_LWIPOPTS_H */
regbbs 发表于 2021-1-28 17:14
检查发送的时候pbuf是一个就包含了所有的数据还是被分成了两个,还有就是txdma的描述符,看看发送的数据包 ...
嗯,只能这样逐步查看了 eric2013 发表于 2021-1-29 08:11
这个是我的配置:
最近再研究了这个数据包发现,在ip层首部那边数据包长度一项,大小是40,这个长度正好是ip和tcp头部总和,也就是说tcp数据域是空的,多出来的6个0是以太网发送时发现小于最少46字节以太网帧,强制增加的,所以这个数据包不是应用层发送出去的,是tcp层发出来的,目前还没搞清楚为何会发这样的数据包,究竟作用是什么,不知道是不是和窗口大小查询有关 regbbs 发表于 2021-1-28 09:12
TCPIP数据包有长度要求,不足的话会补足。
确实是为了满足最小数据包增加的6个字节,tcp数据就是空数据,那这种数据包是什么作用,哪里可以控制这种包发送
页:
[1]