《分析LwIP.pdf》由会员分享,可在线阅读,更多相关《分析LwIP.pdf(28页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 LwIP 协议栈分析 2007-05-26 目录 1 简介.3 2 Architecture.3 3 数据结构.6 3.1 Pbuf.6 3.2 Netbuf.7 3.3 Netconn.8 3.4 udp_pcb.10 3.5 tcp_seg.10 3.6 tcp_pcb.11 3.7 tcp_pcb_listen.13 3.8 Mbox.13 3.8.1 tcpip_msg.14 3.8.2 api_msg.14 3.9 Socket.15 3.10 定时.16 4 API.17 4.1 TYPE 1.19 4.1.1 netconn_bind.20 4.1.2 netconn_list
2、en.20 4.1.3 netconn_close.20 4.2 TYPE 2.20 4.2.1 netconn_connect.21 4.3 TYPE 3.22 4.3.1 netconn_send.22 4.3.2 netconn_write.22 4.4 TYPE 4.23 4.4.1 netconn_accept.23 4.4.2 netconn_recv.23 4.5 Server.24 14.6 Client.24 5 流程.25 5.1 TCP.25 5.1.1 TCP Send.25 5.1.2 TCP Receive.26 5.2 UDP.27 6 主线程.27 21 简介简
3、介 lwIP 是瑞士计算机科学院(Swedish Institute of Computer Science)的 Adam Dunkels 等开发的一套用于嵌入式系统的开放源代码 TCP/IP 协议栈。Lwip 既可以移植到操作系统上,又可以在无操作系统的情况下独立运行.LwIP 的特性如下:?支持多网络接口下的 IP 转发?支持 ICMP 协议?包括实验性扩展的的 UDP(用户数据报协议)?包括阻塞控制,RTT 估算和快速恢复和快速转发的 TCP(传输控制协议)?提供专门的内部回调接口(Raw API)用于提高应用程序性能?可选择的 Berkeley 接口 API(多线程情况下)?在最新的版
4、本中支持 ppp?新版本中增加了的 IP fragment 的支持.?支持 DHCP 协议,动态分配 ip 地址.?支持 IPv6 2 Architecture 3 4 53 数据结构数据结构 3.1 Pbuf Pbuf Pbuf是lwIP包的内部表示,被设计为最小化栈的特殊需要。Pbufs类似于BSD实现中的mbufs。Pbuf结构支持为包内容动态分配内存和让包数据驻留在静态内存中。Pbufs能被一个称为pbuf链的链接到一个链表中,以至一个包能跨越多个pbufs。Pbufs 有三种类型:PBUF_RAM,PBUF_ROM 和 PBUF_POOL。图 1 表示 PBUF_RAM类型,包含有存
5、在内存中由 pbuf 子系统管理的包数据。图 2 显示了一个 pbuf 链表,第 1个是 PBUF_RAM 类型,第 2 个是 PBUF_ROM 类型,意味着它包含有不被 pubf 子系统管理的内存数据。图 3 描述了 PBUF_POOL,其包含有从固定大小 pbuf 池中分配来的 pbuf。一个 pbuf 链可以包含多个不同类型的 pbuf。这三种类型有不同的用处。PBUF_POOL类型主要由网络设备驱动使用,因为分配单个pbuf快速且适合中断句柄使用。PBUF_ROM类型由应用程序发送那些在应用程序内存空间中的 6数据时使用。这些数据不会在pbuf递交给TCP/IP栈后被修改,因此这个类型
6、主要用于当数据在ROM中时。PBUF_ROM中指向数据的头部被存在链表中其前一个PUBF_RAM类型的pbuf中,如图 2 所示。PBUF_RAM 类型也用于应用程序发送动态产生的数据。这情况下,pbuf 系统不仅为应用程序数据分配内存,也为将指向(prepend)数据的头部分配内存。如图 1 所示。Pbuf 系统不能预知哪种头部将指向(prepend)那些数据,只假定最坏的情况。头部的大小在编译时确定。本质上,进来的 pbuf 是 PBUF_POOL 类型,而出去的 pbuf 是 PBUF_ROM 或PBUF_RAM 类型。从图 1,图 2 可以看出pbuf的内部结构。Pbuf结构包含有两个
7、指针,两个长度字段,一个标志字段,和一个参考计数。Next字段指向统一链表中的下一个pbuf。有效载荷指针指向该pbuf中数据的起始点。Len字段包含有该pbuf数据内同的长度。Tot_len字段是当前pbuf和所有链表接下来中的len字段值的总和。简单说,tot_len字段是len字段及下一个pbuf中tot_len字段值的总和。Flags字段表示pbuf类型而ref字段包含一个参考计数。Next和payload字段是本地指针,其大小由处理器体系结构决定。两个长度字段是 16 位无符号整数,而flags和ref字段都是 4 比特大小。Pbuf的总大小决定于使用的处理器体系结构。在 32 位指
8、针和 4 字节校正的体系结构上,总大小是 16 字节,而在 16 位指针和 1 自己校正的体系结构上,总大小是 9 字节。Pbuf模块提供了操作pbuf的函数。Pbuf_alloc()可以分配前面提到的三种类型的pbuf。Pbuf_ref()增加引用计数,pbuf_free()释放分配的空间,它先减少引用计数,当引用计数为 0时就释放pbuf。Pbuf_realloc()收缩空间以使pbuf只占用刚好的空间保存数据。Pbuf_header()调整payload指针和长度字段,以使一个头部指向pbuf中的数据。Pbuf_chain()和pbuf_dechain()用于链表化pbuf。3.2 Ne
9、tbuf Netbuf 描述网络缓存的数据类型 7 3.3 Netconn Netconn 描述网络连接的数据类型 与socket一一对应 8 93.4 udp_pcb udp_pcb 3.5 tcp_seg tcp_seg 103.6 tcp_pcb tcp_pcb 11 12 3.7 tcp_pcb_listen tcp_pcb_listen 3.8 Mbox Mbox 133.8.1 tcpip_msg TCPIP_MSG_API 表示从 API(上层)来的包,包括 api_msg 中的 api_msg_type 所有类型的包;TCPIP_MSG_INPUT 表示从 IP(下层)来的包.
10、3.8.2 api_msg 143.9 Socket Socket 15 3.10 定时 定时 在tcp/ip协议中很多时候都要用到定时,定时的实现也是tcp/ip协议栈中一个重要的部分.lwip中定时事件的数据结构如下.struct sys_timeout struct sys_timeout*next;/指向下一个定时结构 u32_t time;/定时时间 sys_timeout_handler h;/定时时间到后执行的函数 void*arg;/定时时间到后执行函数的参数.;16struct sys_timeouts struct sys_timeout*next;struct sys_t
11、imeouts lwip_timeoutsLWIP_TASK_MAX;Lwip 中的定时事件表的结构如下图,每个和 tcp/ip 相关的任务的一系列定时事件组成一个单向链表.每个链表的起始指针存在 lwip_timeouts 的对应表项中.4 API 17 18?TYPE 1?BIND,LISTEN,CLOSE?TYPE 2?CONNECT?TYPE 3?SEND.WRITE?TYPE 4?ACCEPT,RECV 4.1 TYPE 1 TYPE 1 194.1.1 netconn_bind 4.1.2 netconn_listen 4.1.3 netconn_close 4.2 TYPE 2
12、TYPE 2 204.2.1 netconn_connect 在 lwip 实现中,应用层调用 connect 函数进行主动连接,在该函数内部实际上是生成一个消息发送给 tcpip_thread 线程,在此消息里包含了 conn-mbox 信号量句柄,然后,该函数阻塞等待在此信号量上。一旦底层完成三次握手,连接成功,就会触发 TCP 已连接事件TCP_EVENT_CONNECTED 回调 do_connect 释放此信号量,connect 随即退出阻塞。在应用层看来,connect 一直阻塞到连接成功,如果不成功就返回-1。connect 运行在用户线程,实际连接运行在 tcpip_threa
13、d 线程,通过消息回调,使两个不同线程的函数建立了同步关系,虽然 TCP 协议时延动态范围很大,达到秒级,但这种消息驱动机制能很好地适应变化。21 4.3 TYPE 3 TYPE 3 4.3.1 netconn_send 4.3.2 netconn_write 224.4 TYPE 4 TYPE 4 4.4.1 netconn_accept 4.4.2 netconn_recv 234.5 Server Server 4.6 Client Client 245 流程流程 5.1 TCP TCP 5.1.1 TCP Send 25 5.1.2 TCP Receive 26 5.2 UDP UDP 6 主线程主线程 tcpip_thread 是 LwIP 的主线程,整个 tcp/ip 协议栈都在同一个任务(tcpip_thread)中.27 28