lwIP(TCP/IP)小知识
2009-06-22 10:55
274 查看
lwIP 概述
lwIP是瑞士计算机科学院(Swedish Institute of Computer Science)的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。Lwip既可以移植到操作系统上,又可以在无操作系统的情况下独立运行.
LwIP的特性如下:
(1) 支持多网络接口下的IP转发
(2) 支持ICMP协议
(3) 包括实验性扩展的的UDP(用户数据报协议)
(4) 包括阻塞控制,RTT估算和快速恢复和快速转发的TCP(传输控制协议)
(5) 提供专门的内部回调接口(Raw API)用于提高应用程序性能
(6) 可选择的Berkeley接口API(多线程情况下)
(7) 在最新的版本中支持ppp
(8) 新版本中增加了的IP fragment的支持.
(9) 支持DHCP协议,动态分配ip地址.
lwip 源码下载地址: http://savannah.nongnu.org/projects/lwip/
lwip 版本宏定义 ---LWIP_VERSION
src/include/lwip/init.h
/** X.x.x: Major version of the stack */
#define LWIP_VERSION_MAJOR 1U
/** x.X.x: Minor version of the stack */
#define LWIP_VERSION_MINOR 3U
/** x.x.X: Revision of the stack */
#define LWIP_VERSION_REVISION 2U
#define LWIP_VERSION (LWIP_VERSION_MAJOR << 24 | LWIP_VERSION_MINOR << 16 | \
LWIP_VERSION_REVISION << 8 | LWIP_VERSION_RC)
移植中碰到的问题总结
1)对齐问题
PBUF_LINK_HLEN 16
static u8_t ip_reassbitmap[MEM_ALIGN_SIZE(IP_REASS_BUFSIZE / (8 * 8))];
在调试的时候经常碰到内存访问错误的异常,最后查得原因是内存的起始地址不再4的倍数上,导致不能访问。因为内存申请时有字节数来的,有时要强制转换为某种结构。为了保证地址不错,PBUF_LINK_HLEN 定义为16,ip_reassbitmap的大小也变成4的倍数。因为它的大小不是4的倍数,就导致附近的内存分配起始不是4的倍数。这个解决办法由点不好,但是没有办法,我用 align 等声明没有作用。
2)大端小端问题
#define BYTE_ORDER LITTLE_ENDIAN //定义小端模式
3)LWIP配置问题
在LWIP中的'lwipopts.h' 头文件内配置,例如
#define NO_SYS 1
#define MEM_ALIGNMENT 4
//内存对齐
#define MEM_SIZE 8*1204
4)大包ping问题(早期版本)
原因是以太网络中,最大允许的包大小为1514字节,若用pc机ping –l 2000 ip地址 测试,pc会把ip包分解成多个发送,lwIP接受后会把他数据合成方在pbuf中,并直接发送出去,可惜程序中不会把包分解发送。导致发送网络不允许的包。这样不但pc接受不到包,而且lwIP也出现问题。
解决方法,在发送的地方,若包大于1514就不给发送。虽然解决不了大包ping不通问题,但至少lwIP不会死。
lwIP是瑞士计算机科学院(Swedish Institute of Computer Science)的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。Lwip既可以移植到操作系统上,又可以在无操作系统的情况下独立运行.
LwIP的特性如下:
(1) 支持多网络接口下的IP转发
(2) 支持ICMP协议
(3) 包括实验性扩展的的UDP(用户数据报协议)
(4) 包括阻塞控制,RTT估算和快速恢复和快速转发的TCP(传输控制协议)
(5) 提供专门的内部回调接口(Raw API)用于提高应用程序性能
(6) 可选择的Berkeley接口API(多线程情况下)
(7) 在最新的版本中支持ppp
(8) 新版本中增加了的IP fragment的支持.
(9) 支持DHCP协议,动态分配ip地址.
lwip 源码下载地址: http://savannah.nongnu.org/projects/lwip/
lwip 版本宏定义 ---LWIP_VERSION
src/include/lwip/init.h
/** X.x.x: Major version of the stack */
#define LWIP_VERSION_MAJOR 1U
/** x.X.x: Minor version of the stack */
#define LWIP_VERSION_MINOR 3U
/** x.x.X: Revision of the stack */
#define LWIP_VERSION_REVISION 2U
#define LWIP_VERSION (LWIP_VERSION_MAJOR << 24 | LWIP_VERSION_MINOR << 16 | \
LWIP_VERSION_REVISION << 8 | LWIP_VERSION_RC)
移植中碰到的问题总结
1)对齐问题
PBUF_LINK_HLEN 16
static u8_t ip_reassbitmap[MEM_ALIGN_SIZE(IP_REASS_BUFSIZE / (8 * 8))];
在调试的时候经常碰到内存访问错误的异常,最后查得原因是内存的起始地址不再4的倍数上,导致不能访问。因为内存申请时有字节数来的,有时要强制转换为某种结构。为了保证地址不错,PBUF_LINK_HLEN 定义为16,ip_reassbitmap的大小也变成4的倍数。因为它的大小不是4的倍数,就导致附近的内存分配起始不是4的倍数。这个解决办法由点不好,但是没有办法,我用 align 等声明没有作用。
2)大端小端问题
#define BYTE_ORDER LITTLE_ENDIAN //定义小端模式
3)LWIP配置问题
在LWIP中的'lwipopts.h' 头文件内配置,例如
#define NO_SYS 1
#define MEM_ALIGNMENT 4
//内存对齐
#define MEM_SIZE 8*1204
4)大包ping问题(早期版本)
原因是以太网络中,最大允许的包大小为1514字节,若用pc机ping –l 2000 ip地址 测试,pc会把ip包分解成多个发送,lwIP接受后会把他数据合成方在pbuf中,并直接发送出去,可惜程序中不会把包分解发送。导致发送网络不允许的包。这样不但pc接受不到包,而且lwIP也出现问题。
解决方法,在发送的地方,若包大于1514就不给发送。虽然解决不了大包ping不通问题,但至少lwIP不会死。
相关文章推荐
- TCP/IP基础知识
- TCP/IP 相关知识回忆总结
- TCP/IP相关知识复习与总结(https/网络程序性能分析)
- TCP/IP指南(卷1):TCP/IP概述与背景知识
- 网络编程知识(12)--ISO/OSI七层模型和TCP/IP四层网络模型
- tcp/ip基础知识
- lwIP(TCP/IP)协议栈移植
- TCP/IP基础知识
- lwIP(TCP/IP)协议栈移植(转)
- TCP-IP详解卷-基础知识
- Linux 小知识翻译 - 「TCP/IP」
- 图解TCP/IP笔记-网络基础知识
- TCP/IP 和 HTTP不了解?看完这篇文章,网络知识就全懂了
- http,socket,tcp/ip 网络传输与通讯知识总结
- LwIP 协议栈源码详解 ——TCP/IP 协议的实现(四:数据包 pbuf )
- TCP/IP (1)基本知识
- TCP/IP学习基础知识
- TCP/IP经典基础知识
- TCP/IP基础知识总结
- TCP/IP知识总结(TCP/IP协议族读书笔记二)