找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4208|回复: 4
打印 上一主题 下一主题
收起左侧

LwIP TCP/IP协议栈的设计与实现_中文译稿(共42页pdf下载)

[复制链接]
跳转到指定楼层
楼主
最近开发需要使用LwIP协议,搜集到了[瑞典]Adam Dunkels著的书籍,发现有中文翻译版,分享一波。

LwIP 是 TCP/IP 协议栈的一个实现。它的目的是减少内存使用率和代码大小,使 LwIP 适用于资源受限系统比如嵌入式系统。为了减少处理和内存需求,LwIP 使用不需要任何数据复制的经过裁剪的 API。
本文描述了 LwIP 的设计与实现。描述了在协议栈实现中以及像内存与缓冲管理这样的子系统中使用的算法和数据结构。本文还包括 LwIP 的参考手册以及使用 LwIP 的代码例子。


图 2 所示的pbuf 是一个被链接的 pbuf例子,在这个 pbuf 链中第一个 pbuf是 PBUF RAM 类型,第二个是 PBUF ROM 类型,这意味着它所拥有的数据存储在 pbuf子系统不能管理的存储区:

图 2  一个PBUF RAM类型的 pbuf链接了一个数据存储在外部存储区的PBUF ROM类型的pbuf

第三种 pbuf类型,PBUF POOL,图 3 所示,它由分配自固定大小的 pbufs池里的固定大小的 pbufs组成。一个 pbuf链可以由 pbufs 的不同类型组成。


这三种类型拥有不同的使用目的。PBUF POOL 主要用于网络设备驱动层,因为分配一个 pbuf 的操作可以快速完成,所以非常适合用于中断处理。PBUF ROM 类型的 pbufs 用于应用程序要发送的数据放置在应用程序管理的存储区的情况。在 pbuf已经移交给 TCP/IP 协议栈后,这些数据是不能被编辑修改的,因此这种 pbuf 类型主要用于数据被放置在 ROM 中的情况(因此名字是 PBUF ROM)。为 PBUF ROM 类型的pbuf 数据预置的包头存储在一个 PBUF RAM 类型的 pbuf中,这个 pbuf 被链接到这个 PBUF ROM 类型的pbuf 前面,如图 2 所示。
PBUF RAM类型的pbuf还用于应用程序发送的数据被动态生成的情况。在这种情况下。
pbuf 系统不仅为应用数据分配内存,还要给为这些数据预置的包头分配内存,见图 1。pbuf系统不可能预先知道为这些数据预置什么样的包头,因而考虑最坏的情况。包头大小在编译时是可配置的。其实,收到的 pbufs是 PBUF POOL 类型,发送出的 pbufs是 PBUF ROM 或 PBUF RAM类型。

pbuf 的内部结构参见图 1 到图3。pbuf结构包括两个指针,两个长度字段,一个标志字段和一个引用计数(reference count)。next 字段是一个指向 pbuf 链中下一个 pbuf 的指针。payload 指针指向 pbuf 中数据的开始位置。len 字段包含 pbuf中数据内容的长度。tot_len 字段包含当前 pbuf 的长度与在这个 pbuf 链中随后的所有 pbufs 的 len 字段之和。换句话说,tot_len 字段是 len 字段与 pbuf 链中随后一个 pbuf 的 tot_len 字段的和。flags 字段标识 pbuf的类型,ref字段包含一个引用计数。next 和payload 字段是本地指针,它们占用的字节数与所使用的处理器架构有关。两个长度字段为 16 位无符号整形,flags 和 ref 字段是 4 位宽。pbuf 结构的实际大小与所使用的处理器架构下的指针大小及最小对齐方式有关。在 32 位指针及 4 字节对齐的架构里,pbuf 的大小为 16 个字节长,在 16 位指针及 1 字节对齐的架构里,pbuf 为9 个字节长。 pbuf 模块提供了操作 pbufs 的函数。分配一个 pbuf 使用 pbuf_alloc()函数,该函数能够分配上面描述的三种类型中的任一类型 pbufs。pbuf_ref()函数增加引用计数。回收 pbuf 使用pbuf_free()函数,该函数首先要减少 pbuf 索引计数(reference count)。如果引用计数已经减为 0,这个 pbuf 被回收。pbuf_realloc()函数可以收缩 pbuf 大小,以恰好够用的内存封装数据。pbuf_header()函数调整 payload 指针和长度字段以便为 pbuf 中的数据预置包头。pbuf_chain()与 pbuf_dechain()函数用于链接 pbufs。

6.2 内存管理
内存管理模块支撑的 pbuf 机制很简单。它负责处理内存连续区域的分配和回收以及收缩已分配内存块的大小。内存管理模块使用系统内存的一部分作为自己的专用区域,这确保了网络系统不会使用系统中所有可用内存,即使网络系统使用了所有自己的内存,也不会扰乱其它程序的操作。
在内部,内存管理模块通过在每一个内存分配块的顶部放置一个比较小的结构体来保存内存分配纪录。这个结构体拥有三个成员变量,两个指针一个标志,见图 4。next 与 prev分别指向内存的下一个和上一个分配块,used标志标示该内存块是否已被分配。

完整的pdf格式文档51黑下载地址(共42页):
LwIP协议栈的设计与实现_中文译稿.pdf (618.87 KB, 下载次数: 79)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:18591 发表于 2019-1-31 18:39 | 只看该作者
感謝!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

板凳
ID:320935 发表于 2019-2-14 12:51 | 只看该作者
感謝!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

地板
ID:328121 发表于 2019-2-15 08:34 | 只看该作者
谢谢分享!!!
回复

使用道具 举报

5#
ID:513219 发表于 2019-5-14 19:29 | 只看该作者
谢谢分享,。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表