第九章 LwIP及其网络编程应用实例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
根据IP数据报的协议字段,LwIP决定将该数据报传给上层(运输 层)还是传给本层。
如果IP净荷中承载的是ICMP协议,则本层的icmp_input( )函数将 会调用。
当不论是上层还是本层有数据需要从网际层发送出去时
LwIP将会调用ip_output( )发送数据,或者先调用ip_route( ) 找到一个合适的网络接口再调用ip_output_if( )发送数据。

整体调用关 系
应用程序
应 用

图给出了LwIP的整体调 用关系,基本上涵盖了 LwIP的主要功能模块和 绝大部分的函数调用。
tcp_receive() tcp_process()
tcp_input()
tcp_write() tcp_enqueue() tcp_output()
udp_send()
icmp_input()
网 际 层
ip_output()
ip_input()

netif->output()
LwIP源码的文件组织
LwIP文件目录的组织结构如图所示,其源代码全 部位于目录src下。
src目录下一般有5个子目录
LwIP提供的api子目录、core子目录、include子目录 和netif子目录
需用户自己创建的arch目录。
lwip
src
api
arch
core
include
netif
LwIP介绍
LwIP(Light Weight Internet Protocol)是 瑞典计算机科学院(Swedish Institute of Computer Science)的Adam Dunkels等 人开发的一套用于嵌入式系统的开源 TCP/IP协议栈。
LwIP的含义是轻型IP协议,其实现的 重点是在保持TCP协议主要功能的基础 上减少对RAM的占用,这使得LwIP协 议栈非常适合在小型嵌入式系统中使用 。
典型模块的跨层调用
(2)ICMP模块
ICMP信息包由ip_input( )函数收到后,转交给 icmp_input( )函数对ICMP包头解码,然后进行适当的 动作。
如果需要对回送请求进行应答,则调用ip_output( )函数发送应答 报文。
某些ICMP消息被传递给上层协议,由传输层的特定函数处理。
当上层需要发送数据时
LwIP选择调用tcp_write( )或者udp_send( )对数据进行处理 最后通过tcp_output( )或udp_send( )将数据交给下层。
协议层内的调用
tcp_receive() tcp_process()
tcp_input()
应用层
tcp_write()
netif目录
ARP协议和LwIP网络设备驱动程序的模板,提供了网络接口驱动 程序的基本框架。
LwIP的软件体系结构
LwIP的协议层次: LwIP也是以4层TCP/IP模型为参照来实现TCP/IP协 议族的。
每一个协议作为一个模块被实现,同时还提供了几个函数作为 协议的入口点。
LwIP并没有严格地按照分层的方式实现协议族。
tcp_enqueue()
udp_send()
tcp_output()
udp_input()
运 输

网际层
协议层内的调用
(4)应用层
用户的应用运行在应用层,该层使用户可以根据自己的需要对 数据进行处理。
用户需要发送数据时
由LwIP根据数据类型(TCP或UDP)调用下层(运输层)对应的 发送函数。
协议栈对该数据帧进行解码,并判断数据帧的协议类型:
如果是IP协议,则将该帧传递给上层(网际层)的ip_input( )函数进行 处理;
如果是ARP协议,则直接传给本层的arp_input( )函数,该函数根据需 要决定是否调用arp_replay( )进行ARP应答。
当上层有数据需要通过网络接口层进行发送时,当前网络接口的输 出函数netif->output( )将会被调用,以完成真正的数据发送过程。
否到达预定主机。 如果一个到达的信息包被发现已经到达了目的主机,则由协议字
段来决定信息包应该传送到哪一个上层协议。
典型模块的跨层调 用
外发的信息包由ip_output( )函数处理,该函数使用 ip_route( )函数查找适当的网络接口来传送信息包。
当外发的网络接口确定后,信息包传给以外发网络接口为参 数的ip_output_if( )函数。
TCP/IP协议的实现模块
如ARP、IP、ICMP、UDP、TCP等
许多相关支持模块。
这些支持模块包括操作系统模拟层、缓 冲与内存管理子系统、网络接口函数等 。
LwIP的进程模型
TCP/IP协议族的进程模型指的是采用何种方法把系统分成不同的进程。 常见的进程模型有两种:
每一个协议作为一个独立的进程 协议栈作为一个内核只占据一个进程。
网 际 层
ip_input()

络网
接络
收到帧
口接 层口

协议层内的调用
TCP/IP协议栈是按功能层组织的,每一层都为上一层提 供服务,并使用下一层提供的服务。
在4层TCP/IP模型中,从下至上依次是网络接口层、网际 层、运输层和应用层。
(1)网络接口层
网络接口层是较高协议与局域网接口的地方。 当主机通过查询或者中断方式得知网络芯片接收到数据帧时,LwIP
第二种模型将协议栈驻留在操作系统内核中,应用程序通过系统调用与协 议栈进行通讯。
这种设计可以使用交叉协议分层技术,各层协议不必严格划分。 这种进程模型的缺点是层次不清,给理解增加了难度。
LwIP的进程模型
LwIP则采用一种比较灵活的设计方法。
它可以将所有的协议驻留在一个进程,以便独立于 操作系统内核之外。
udp_input()
运 输

icmp_dest_unreach() icmp_input()
图中只标注了对LwIP的 整个软件体系起着重要 支撑作用的主干函数
ip_route() ip_output()
ip_output_if()
netif->output()
arp_input() arp_reply()
LwIP源码的文件组织
每个子目录包含的某一类相关的文件,简要说明如下: api目录
应用程序接口文件。
arch目录
与硬件和OS有关的文件,包括网络驱动、移植需要修改的文件。
core目录
LwIP的核心代码,包括ICMP、IP、UDP、TCP等协议的实现等。
include目录
LwIP的包含文件。
网络接口层 网络接口层
协议层内的调用
(3)运输层
运输层负责在网际设备之间运输数据,以可靠或不可靠 的方式进行。
TCP和UDP。
当下层(网际层)有数据传给运输层时
LwIP会根据数据类型的不同(是TCP还是UDP)调用该层的 tcp_input( )或者udp_input( )。
经过一定处理后,LwIP将数据由tcp_receive( )或udp_input( ) 提交给上层(应用层),一般会调用事先注册的接收函数。
实际上LwIP使用的是一种比较松散的通讯机制,通过 共享内存的方式实现应用层与底层协议族之间的通讯。
LwIP拥有独特的缓冲机制,使得各层次可以更加有效 的重复使用缓冲区。
LwIP尽量避免内存复制,避免了内存复制产生的性能损失。
LwIP的软件体系结构
与LwIP的协议层次相匹配,LwIP 采用模块化设计的方法实现。
(1)IP模块
LwIP的较早期版本实现了IP层大部分的基本功能,能够发送 、接收以及转发信息包。
接收信息包由网络设备驱动调用ip_input( )函数开始处理。
完成对IP版本字段及包头长度的初始完整性检查 同时还要计算和验证包头校验和 函数检查目的地址是否与网络接口的IP地址相符以确定信息包是
所有的IP包头字段被填充,并且计算IP包头校验和。 IP信息包的源及目标地址作为参数被传递给ip_output_if( )函
数。 传输层协议UDP与TCP在计算传输层校验和的时候需要拥有目
标IP地址,因此一些传输层函数可能会直接直接调用 ip_route( )函数确定接口。 这样这些函数在外发数据前就没有必要再对网络接口链表进 行检索,而是直接调用ip_output_if( )函数外发数据。
典型模块的跨层调 用
如果没有网络接口的地址与到达的信息包 的目标地址相同,信息包应该被转发。
由ip_forward( )函数完成。 TTL字段值被减少,当减为0的时候,将会给
IP信息包的最初发送者发送ICMP错误信息, 并抛弃该信息包。 因为IP包头被改变,因此需要调整IP包头校验 和。 最后,信息包被转发到适当的网络接口。
ICMP目标不可到达消息可以由传输层发送,特别是UDP
如udp_input( )就可以调用icmp_dest_unreach( )函数完成这项工 作。
icmp_dest_unreach( )最后也会调用ip_output( )发送ICMP报文。
典型模块的跨层调用
运 输 层

icmp_dest_unreach()
应用程序既可以驻留在LwIP的进程中,也可以使用 一个单独的进程。
它也可以根据协议层次结构创建多个进程,但各个 进程之间只传送尽可能少的必要信息,而没有引入 额外的内存复制
LwIP在协议层之间切换时,一般只传递数据缓冲区 的地址,让需要处理数据的协议层自己去提取。
LwIP的函数调用关系
为了尽量避免不必要的内存复制,LwIP更多的是采用 一种基于回调函数的设计方法。
LwIP介绍
LwIP的版本较多,较新的版本通常完善或增加了LwIP的功能。 LwIP有如下特点:
IP:支持多网络接口下的IP转发 ARP:支持ARP协议 ICMP:支持ICMP协议 UDP:支持UDP协议 TCP:支持TCP协议,包括拥塞控制、RTT估算和快速恢复/快速重传 Raw API:提供专门的内部回调函数,以提高应用性能 Socket API:可选的Berkeley-like socket API LwIP的较新版本还提供对以下功能或协议的支持: IP fragment:IP分片 DNS:域名解析 SNMP:简单网络管理协议 DHCP:动态主机配置协议 PPP:点对点协议 IPv6
当数据需要处理或跨层传递时,通常是通过调用事先已定义好 的回调函数来完成有关操作。
优点是大大提高了LwIP的整体性能;缺点是使得LwIP的整个软 件体系显得略微复杂,尤其是函数之间的调用关系更为繁琐。
为了理清LwIP的函数调用关系,从两个不同的方向对 这一问题进行分析:
从不同的协议层出发,横向分析各个层次内的调用关系; 从几种典型的协议模块出发,纵向分析各模块的跨层调用关系
应用层并不需要直接关注数据是怎样发送出去的。
用户接收的数据一般由LwIP调用下层的接收函数送达,此后 用户可以根据实际情况实现应用程序。
应用程序
应 用

运输层
典型模块的跨层调用
对于某一个协议来说
它一般只隶属于某一个层次(ARP除外)。 但往往会有其它层次调用该协议的有关函数 而该协议一般也会主动调用其它层次的有关函数。
实际上ip_output( )也是通过先调用ip_route( )再调用ip_output_if( )来实现的
协议层内的调用
运输层
icmp_dest_unreach() icmp_input()
ip_route() ip_output()
ip_output_if()
网 际 层
ip_input()
第一种模型必须符合协议的每一层,协议层之间通过指定的方式进行通讯 。
优点较明显,即每一种协议都可以独立参与到系统运行中,其实现的代码也比 较简单,整个协议栈的层次脉络清晰,便于理解和调试。
缺点也是显而易见的,即数据跨层传递时不得不产生进程切换以及内存复制。 这一缺点极大影响了系统的整体性能,尤其对于嵌入式系统来说更是不能忍受 的。
协议层内的调用
网际层
arp_input() arp_reply() netif->output()

络网
接络
收到帧
口接 层口

协议层内的调用
(2)网际层
网际层负责网间寻址(IP地址)、数据封装、路由选择、错误 处理和诊断等
典型协议有IP协议和ICMP协议。
当从下层(网络接口层)接收到IP数据报时,调用ip_input( )函数进行处理。
相关文档
最新文档