lwIP(TCP/IP)小知识

来源:互联网 发布:阿里云ssh连接不上 编辑:程序博客网 时间:2024/06/01 08:51
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不会死。