您的位置:首页 > 理论基础 > 计算机网络

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不会死。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: