Lwip学习笔记之UDP

Lwip学习笔记之UDP

Lwip严格按照协议的分层进行管理,每一个层之间传送数据都须要进行上下文交换。lwIP所使用的过程模型是:把因此协议封装到一个单一的过程当中,从而与操做系统内核分开。应用程序可能也驻留在lwIP处理过程当中,或者在单独的过程当中。 TCP/IP栈和应用程序之间的通讯能够经过函数调用实现,也能够经过更为抽象的API。web

关于邮箱

Lwip的消息传递采用了邮箱的机制,邮箱有两种操做:邮寄和提取,邮寄操做不会阻塞进程;邮寄到邮箱的消息由操做系统模拟层排入队列知道另外一个进程来提取他们。网络

关于缓冲

包缓冲pbufs

Pbuf在Lwip中表示一包,Pbuf能在一张列表中被链接到一块儿,造成一个pbuf链,Pbuf具有三种类型,Pbuf Ram,Pbuf Rom,Pbuf Pool,一个Pbuf链能够包含多种类型的pbuf。
三种类型不一样的使用,pbuf_pool主要被网络设备驱动程序使用,当引用程序发送位于北应用程序管理的存储区的数据时,Pbuf_ROM被使用。在pbuf被移交到TCP/IP栈后,数据不能修改,所以命名为Pbuf_ROM。session

Pbuf的内部结构

Pbuf的内部结构以下图所示:svg

变量名 做用
Next 指向下一个Pbuf的指针
Payload Pbuf数据的起始位置
Len 数据内容的长度
Tot_len 随后全部Pbuf中的len中的值的总和??
Flag 代表pbuf类型
Ref 参考计数

pbuf的操纵

Pbuf_alloc()完成分配一个pbuf的任务。
Pbuf_ref()增长参考计数
Pbuf_free()完成释放分配,他首先减小pbuf的参考计数,若是参考计数达到0则表示pbuf已经被释放。函数

ip处理

Lwip仅仅实现最基本的IP功能,能够发送、接收和转接包,但不能发送或接收分割的IP包,也不能处理带IP选项的包,不符合条件的包会被丢弃。若是接收的包是主机指定的包,则由protocol域来决定传给哪一个高层协议。接收包由ip_input()函数来处理。
发送的包由ip_output()处理,它使用ip_route()寻找适当的网络接口来上传包。当时发送包的网络接口被肯定,包被传递到ip_output_if()函数。
ICMP,TCP和UDP都是比IP协议高一层的协议,当IP协议收到包且地址符合后,将会把包传递上层协议进行处理。若是IP协议收到的包与IP地址不一致,则会转发。转发由Ip_forward()完成。学习

UDP处理

每个UDP话路(session)的状态都保存在一个PCB结构中,UDP PCBs保存在一个链表中,当UDP datagram到达,则搜索该链表并进行匹配。
UDP的输入输出如图所示:
这里写图片描述操作系统