第二章 uIP协议栈分析
uip协议栈,下载
竭诚为您提供优质文档/双击可除uip协议栈,下载篇一:uip之udp应用笔记千兆网项目中,移植了uip到mcu中,采用udp通信方式,主要用来做一些控制协议的处理。
刚开始接手的时候,并没有做过网络方面的应用,而且对tcp/ip及udp通信又不太熟悉。
好在网上有一些文档,加上仔细阅读uip_process 代码,一边用抓包软件一边调试,总算把uip很好的应用了起来,而且还针对项目某些应用的特殊性,对uip源码进行了一些修改。
本文前半部分对uip源码的一些重要函数进行介绍,后半部分将对修改的部分做个记录,以备往后查阅。
本次使用的是uip-1.0,抓包软件用的wireshark1.6.7,这个软件真的很不错,居然支持gigevision,这点真的很意外。
一、一个完整的udp数据报文格式其实uip就是将你要发送到网络上的数据加上报头,好让它被成功发送到目的主机。
所以我们要先搞清楚一个完整的数据报文,才能搞清楚uip到底在做些什么。
ethernetheader:由目标mac和本机mac及type组成,共14byte,当目标mac全为ff时,表示是udp广播。
type=0x0800表示是ip。
在uip中,ethernetheader结构体定义如下:ipheader:0x45表示version=4,headerlength=20byte;0028表示ipheader+udpheader+userdata长度为40byte;6c14为包的id,每发一个包,这个id会自加1。
80的意义是timetolive,表示这个包的存活时间,路由每转发一次,就会对它自减1。
17表示通信协议类型为udp,4a0a为ipheader的校验码。
再后面就是源ip和目的ip地址了。
udpheader:0aaa表示srcport为2730;0f74表示dstprot为3956;14表示udpheader+userdata长度为20byte,c477表示udpheader的校验码,在一般的情况下,这个可以为0。
uIP协议栈在基于DSP以太网通信系统中的应用
岳世 为 尹 为 民
武汉 403) 3 0 3 ( 海军工程大学 电气与信息工程学院
摘
要
文章通过对 uP协议的简单分析介 绍 , 出了以太 网通信 系统整体硬 件平 台、 I 给 设计思路和软件 工作流程 。完
成 了 以太 网 控 制 器 硬 件 驱 动 的 开 发 和 嵌 入 式 uP 协 议 栈 的 移 植 , 给 出 了 面 向 D P 的 优 化 编 程 方 法 。 实 现 了 以 I 并 S
TMS 2 F 8 2 3 0 2 1 数字信பைடு நூலகம்处理器和 C 8 0 A以太网控制器为核心的局 域网络 D P端 的以太 网通信 。 S 90 S
关键词 uP S ; S 90 I ;D P C 8 0 A;以太 网 T 33 P 9 中 图分 类 号
Ap lc to fuI o o o t c p i a i n o P Pr t c lS a k Bas d o e n D S Et r tN e wo k Co m u c to ys e P he ne t r m ni a i n S t m
Ab t a t Th s a tceb s d o h r fa ay i n r d c i n o f t c s rc i ril a e n t e b i n l ssi t o u t f P s a k,g v s t e Et e n t e wo k c mmu ia i n e o u ie h h r e t r o n nc t o s s e h r wa e p a f r ,d sg e s a d s fwa ewo k f w.Th u h r a o y t m a d r lto m e in i a n o t r r l d o e a t o s c mp e e h a d r r e e e o me t h lt d t eh r wa ed i rd v lp n v
基于STM32的UIP协议栈移植通信
R A M,处 理速度快 。E N C 2 8 J 6 0以太 网模块将 S T M 3 2 微控制处理器发送 的数据加上物理层的 前导符和帧起始定界符 ,使得数据符合以太网
的格 式 ,避免 被 以太 网当作 垃圾 数 据丢 弃 ,从 而 实 现数 据 间 的交互 。以太 网接 口选 用 带有 网 络隔 离变 压 器功 能 的 H R 9 1 1 1 0 5 A实 现 。T F T
随着信息化和物联 网技术的不断更新 ,物 联网慢慢进人人们 的生活 ,这就需要 电子产品 可以接入网络 ,实现数据交互 ,目前多数采用 小型无线传感技术 网络来实现 ,如 Z I G B E E技
术 等 ,但是 它们 只适合 小 型 网络 ,不 适合 长 距
离 的传 输 。 以太 网是 一个 覆 盖 区域极 广 ,协 议
件 平 台输 人 数据 ,数据 传输 需 要对 硬 件平 台输
人的数据进行符合 T C P / I P协 议 的数 据 传 输 格
式把数据传输到以太网中。嵌入式系统与基于
T C P / I P以太 网协 议 栈搭 建 的控 制器 ,可 以使 控 制器 接 入 现有 的 以太 网 ,从 而实 现数 据 的长 距
基 金 项 目: 福 建 省 教 育 厅 A 类 项 目 ( J A1 2 3 7 7 )
作者简 介 :陈清华 ( 1 9 8 1 一 ),男,福 建漳州人 ,讲师 ;研 究方 向:电子信 息技 术。
7 4
《 福建师大福清分校学 报 》
2 0 1 5 年 9月
E N C 2 8 J 6 0是 带 有 行 业 标 准 串行 外 设 接 口 ( S e r i a l P e r i p h e r a l I n t e r f a c e ,S P I )的独 立 以 太
GPRS原理、协议、应用
MF009001 GPRS原理ISSUE1.0目录课程说明 (1)课程介绍 (1)课程目标 (1)相关资料 (1)第1章 GPRS概述 (1)1.1 GPRS的产生 (1)1.2 GPRS的发展 (1)1.3 GPRS与HSCSD业务的比较 (2)1.4 CSD与GPRS的比较 (3)1.4.1 电路交换的通信方式 (3)1.4.2 分组交换的通信方式 (4)第2章 GPRS基本功能和业务 (6)2.1 GPRS业务种类 (6)第3章 GPRS基本体系结构和传输机制 (8)3.1 GPRS接入接口和参考点 (8)3.2 网络互通 (8)3.3 逻辑体系结构 (8)3.3.2 主要网络实体 (10)3.3.3 主要网络接口 (12)3.4 高层功能 (14)3.4.1 网络接入控制功能 (14)3.4.2 分组路由和转发功能 (15)3.4.3 移动性管理功能 (17)3.4.4 逻辑链路管理功能 (17)3.4.5 无线资源管理功能 (18)3.4.6 网络管理功能 (18)3.5 功能分配 (19)3.6 GPRS数据传输平面 (20)3.7 GPRS信令平面 (21)3.7.1 MS与SGSN间信令平面 (21)3.7.2 SGSN与HLR间信令平面 (22)3.7.3 SGSN与MSC/VLR间信令平面 (22)3.7.4 SGSN与EIR间信令平面 (23)3.7.5 SGSN与SMS-GMSC、SMS-IWMSC间信令平面 (23)3.7.6 GPRS支持节点间信令平面 (24)3.7.7 GGSN与HLR间信令平面 (24)第4章移动性管理 (25)4.1 MM状态 (25)4.1.1 IDLE状态 (25)4.1.2 STANDBY状态 (25)4.1.3 READY状态 (26)4.2 MM状态功能 (26)4.2.1 MM状态迁移 (26)4.2.2 就绪定时器功能 (27)4.2.3 周期性路由区更新定时器功能 (28)4.2.4 用户可及定时器功能 (28)4.3 SGSN与MSC/VLR的交互 (29)4.3.1 SGSN-MSC/VLR关联的管理 (29)4.3.2组合RA/LA更新 (29)4.3.3 CS寻呼协调及网络操作模式 (30)4.4 MM规程 (31)4.4.1 GPRS附着功能 (31)4.4.2 GPRS分离规程 (33)4.4.3 清除功能 (36)4.5 安全性功能 (36)4.5.1 用户鉴权 (36)4.5.2 用户身份机密性 (37)4.5.3 用户数据和GMM/SM信令机密性 (37)4.5.4 用户身份检查 (38)4.6 位置管理功能 (38)4.6.1 小区更新规程 (39)4.6.2 路由区更新规程 (39)4.6.3组合RA/LA更新规程 (42)4.6.4 周期性路由区更新和位置区更新 (43)4.7 用户数据管理功能 (44)4.7.1 插入用户数据规程 (44)4.7.2 删除用户数据规程 (44)4.8 MS类标处理功能 (45)第5章无线资源管理功能 (46)第6章分组路由与传输功能 (48)6.1 PDP状态和状态转换 (48)6.2 会话管理规程 (49)6.2.1 静态地址与动态地址 (49)6.2.2 PDP上下文的激活规程 (50)6.2.3 PDP上下文的修改 (52)6.2.4 PDP上下文的去激活 (53)6.3 业务流程举例 (54)6.3.1 MS发起分组数据业务 (54)6.3.2 网络发起分组数据业务 (55)第7章用户数据传输 (57)7.1 传输模式 (57)7.1.1 GTP传输模式 (57)7.1.2 LLC传输模式 (57)7.1.3 RLC传输模式 (57)7.2 LLC功能 (57)7.2.1寻址 (58)7.2.2服务 (58)7.2.3功能 (58)7.3 SNDCP功能 (58)7.4 PPP功能 (60)7.5 Gb接口 (60)7.5.1物理层 (60)7.5.2 FR子层 (60)7.5.3 NS子层 (61)7.5.4 BSSGP层 (61)7.6 Abis接口 (62)7.6.1结构A (63)7.6.2结构B (64)7.6.3结构C (64)第8章信息存储 (66)8.1 HLR (66)8.2 SGSN (67)8.3 GGSN (69)8.4 MS (69)8.5 MSC/VLR (70)第9章编号 (71)9.1 IMSI (71)9.2 P-TMSI (72)9.3 NSAPI/TLLI (72)9.3.1 NSAPI (72)9.3.2 临时逻辑链路标志(TLLI) (72)9.4 PDP地址和类型 (73)9.5 TID (73)9.6 路由区识别 (73)9.7 小区标识 (74)9.8 GSN地址 (74)9.9 接入点名字 (74)第10章运营方面的问题 (75)10.1 计费信息 (75)10.2 计费功能 (75)10.2.1 分组型业务计费方式和电路型业务计费方式的区别 (75)10.2.2 计费基本功能 (76)10.2.3 话单类型 (76)10.2.4 话单传送接口 (77)10.3 网络服务质量(QoS) (77)10.3.1 优先级别 (78)10.3.2 延时级别 (78)10.3.3 可靠性级别 (78)10.3.4 峰值吞吐量级别 (78)10.3.5 平均吞吐量级别 (79)10.4 消息过滤功能 (80)10.5 兼容性问题 (80)第11章与GSM其它业务的交互 (81)11.1 与点对点短消息业务关系 (81)11.2 与电路交换业务的关系 (81)11.3 与补充业务的关系 (82)第12章 IP相关的基础知识 (83)12.1 NAT (83)12.2 FIREWALL (83)12.3 GRE (83)12.4 DNS (84)12.5 RADIUS (84)MF009001 GPRS原理ISSUE1.0 课程说明课程说明课程介绍本课程为华为传送网网络级网管T2100的一个整体介绍,主要阐述了网络级网管T2100兴起和发展的客观需求,华为传送网管的一体化解决方案。
UIP中文文档第二 uIP初始化函数
1. void uip_init(void)此函数用于在启动时初始化uIP的TCP/IP栈。
应用示例:example-mainloop-with-arp.c, and example-mainloop-without-arp.c.定义于uip.c的379行。
2. void uip_setipid(u16_t id)此函数用于启动时设置初始的ip_id.此函数定义于uip.c的181行。
1. void uip_init(void)代码分析1.void2.uip_init(void)3.{4.for(c = 0; c < UIP_LISTENPORTS; ++c) {5.uip_listenports[c] = 0;6.} //将uip_listenports数组全部清零7.for(c = 0; c < UIP_CONNS; ++c) {8.uip_conns[c].tcpstateflags = UIP_CLOSED;9.} //将所有连接的tcpstateflags状态标志设为关闭,表示此连接为关闭状态。
10.#if UIP_ACTIVE_OPENstport = 1024;12.#endif /* UIP_ACTIVE_OPEN */13.//上面的段不知什么意思。
14.#if UIP_UDP15.for(c = 0; c < UIP_UDP_CONNS; ++c) {16.uip_udp_conns[c].lport = 0;17.}18.#endif /* UIP_UDP *///如果定义了UIP_UDP则将uip_udp_conns的lport清零。
19.20.21./* IPv4 initialization. */22.#if UIP_FIXEDADDR == 023./* uip_hostaddr[0] = uip_hostaddr[1] = 0;*/24.#endif /* UIP_FIXEDADDR *///如果主机地址要为固定的,在上面这里赋值。
uip协议栈源码详解
uip协议栈源码详解UIP协议栈源码详解一、双方的基本信息本协议由以下双方达成:甲方:地址:联系人:电话:电子邮箱:乙方:地址:联系人:电话:电子邮箱:二、各方身份、权利、义务、履行方式、期限、违约责任甲方的身份为软件开发公司,提供UIP协议栈源码。
乙方的身份为客户,接受并使用UIP协议栈源码。
甲方的权利:1.拥有UIP协议栈源码的知识产权,并保留其一切权利。
2.未经乙方授权,不得向第三方提供UIP协议栈源码。
3.有权定期或不定期进行软件升级、修补、优化等操作。
甲方的义务:1.提供UIP协议栈源码,并确保其真实、准确、完整。
2.保证UIP协议栈源码的质量和稳定性。
3.协助乙方解决UIP协议栈源码相关的技术问题。
乙方的权利:1.使用UIP协议栈源码进行相关开发和生产。
2.在UIP协议栈源码使用期限内,享有后续升级、修补、优化等服务。
乙方的义务:1.支付相应的授权费用,并按照甲方的要求使用UIP协议栈源码。
2.在未获得甲方授权之前,不得将UIP协议栈源码提供给第三方。
3.遵守中国相关的法律法规,不得将UIP协议栈源码应用于违法、不良等活动。
期限:本协议的期限为一年,自签署之日起生效。
期满后,如有需要,可协商双方续签。
违约责任:1.如任何一方未能履行本协议的义务或条件,则视为违约,违约方需承担相应的违约责任。
2.如甲方未能提供UIP协议栈源码或提供的UIP协议栈源码存在严重质量问题,则乙方有权要求返还全部授权费用,并要求赔偿相关损失。
3.如乙方将UIP协议栈源码提供给第三方,或将UIP协议栈源码应用于违法、不良等活动,则视为违约,乙方需承担相应的违约责任。
三、需遵守中国的相关法律法规本协议各项条款均符合中国相关法律法规。
四、明确各方的权力和义务本协议明确了甲、乙双方在UIP协议栈源码授权使用方面的权力和义务。
五、明确法律效力和可执行性本协议是双方人民法院具有司法管辖权的有法律效力的法律文件,是双方在UIP协议栈源码授权使用方面的合法依据。
uip协议栈
uIP协议栈分析uIP特性uIP协议栈往掉了完整的TCP/IP中不常用的功能,简化了通讯流程,但保存了网络通讯必须使用的协议,设计重点放在了IP/TCP/ICMP/UDP/ARP这些网络层和传输层协议上,保证了其代码的通用性和结构的稳定性。
由于uIP协议栈专门为嵌进式系统而设计,因此还具有如下优越功能:(1)代码非常少,其协议栈代码不到6K,很方便阅读和移植。
(2)占用的内存数非常少,RAM占用仅几百字节。
(3)其硬件处理层、协议栈层和应用层共用一个全局缓存区,不存在数据的拷贝,且发送和接收都是依靠这个缓存区,极大的节省空间和时间。
(4)支持多个主动连接和被动连接并发。
(5)其源代码中提供一套实例程序:web服务器,web客户端,电子邮件发送程序(SMTP 客户端),Telnet服务器,DNS主机名解析程序等。
通用性强,移植起来基本不用修改就可以通过。
(6)对数据的处理采用轮循机制,不需要操纵系统的支持。
由于uIP对资源的需求少和移植轻易,大部分的8位微控制器都使用过uIP协议栈, 而且很多的著名的嵌进式产品和项目(如卫星,Cisco路由器,无线传感器网络)中都在使用uIP协议栈。
uIP架构uIP相当于一个代码库,通过一系列的函数实现与底层硬件和高层应用程序的通讯,对于整个系统来说它内部的协议组是透明的,从而增加了协议的通用性。
uIP协议栈与系统底层和高层应用之间的关系如图2-1所示。
从上图可以看出,uIP协议栈主要提供了三个函数供系统底层调用。
即uip_init(), uip_input() 和uip_periodic()。
其与应用程序的主要接口是UIP_APPCALL( )。
uip_init()是系统初始化时调用的,主要初始化协议栈的侦听端口和默认所有连接是封闭的。
当网卡驱动收到一个输进包时,将放进全局缓冲区uip_buf中,包的大小由全局变量uip_len约束。
同时将调用uip_input()函数,这个函数将会根据包首部的协议处理这个包和需要时调用应用程序。
osip协议栈
正文第一章SIP协议SIP协议是用于发起、控制和终结多媒体会话的信令协议。
它被IETF( )以rfc2543发表。
SIP是IETF致力于将电话服务带入IP网络众多协议的一个组成部分(它与SDP、RTP、RTCP、RTSP、RSVP、TRIP等众多协议构成SIP系统协议栈)。
其将要变成正在发展的IP电话——这个朝气蓬勃的电信工业——的标准之一。
正如同电子邮件协议一样,SIP将会变得越来越普及和大众化… …SIP独立与媒体传统电话使用一种媒体编码个师通讯(正如被我所熟知的时隙和PCM概念)。
现在,这种方式将被终结。
我们的电话可以以不同的质量保证和不同的编码方法连接电视、连接摄像机、连接其他电话进行通信。
SIP具有媒体协商等功能。
任何多媒体应用(例如:游戏、远程教学)都可以使用SIP来建立会话。
SIP独立于传输层SIP并不和任何的传输层紧密结合。
这一构思将使得SIP在第三代网络中受到最小的互操作影响。
无线电话的要求(例如漫游功能)同样被关心。
SIP完美的构思,使得其适合作为新蜂窝电话时代的信令协议。
SIP有很好的扩展性在rfc2543中定义了6种类型的事务(INVITE,BYE,CANCEL… …)。
这些事务被用于媒体协商、创建、修改和终结呼叫。
许多其它的服务已经提供这些方式(例如H.323系统),但SIP以其为扩展性为目的设计和事务模型重用(对于服务器是透明的,被用于使用新类型事务创建辅助服务)。
下面是可能的服务列表,其中的一些已经被实现。
短信,用于实时信息预定或通告,用于会议管理委托,用于呼叫转移等管理SIP和最终用户服务“SIP透明支持名字映射和重定向服务,提供ISDN和智能网络电话服务同样的一些功能。
这些特性也使得个人移动成为可能。
”参考阅读:rfc2543.txt(章节1.1)SIP服务器被用于定位用户和分发请求的用户定位信息。
这些途径,使得最终用户代理发起很少的请求,并能获得多种多样的服务。
基于NTP的uIP协议栈改进与实现
Ke o d :uP S c ;lc y crnzt n Ne ok TmeP ooo( P o a ae e ok hg i n rcs n y w r s l t k cok sn ho ia o ; t r i rtc l a i w NT )lcl ran t r ;ih t gpei o w mi i
协议上 , 系结构如图 1 体 所示 。
I H T、T 、 应用协议) I T PFP…(
方 法是移植 u 、w P l L l 等协议栈 , 以太 网控制 芯片 与以太 P 通过 网接 口互连 , 现网络 数据通信 u1 中,l 实 。 。其 uP协议栈 由于它 的开放 、 简单 、 于理解 和稳定 等特 点 , 易 在诸 如卫 星 、 i o Cs 路 c 由器 、 传感 器网络 等很多著 名 的嵌入式产 品和 项 目中 已 无线 经得到 了广泛 的应 用n 。然而 , 传统 uP l 协议栈 的时钟信号 是 由系统 定时器 产生 , 与计算机 和嵌 入式 设备进行 同步控 制 在 时, 一般只有 1- 1~s每天可 能误差达十几 秒或更 多 。如 04 0 , 何减小系统定时器带来的时钟误差 , 改进uP l协议栈的时钟精 度 , 当前应 该解决 的问题 。 是
摘
要: 传统 uP协议栈使 用系统定 时器作 为时钟 信号 , l 在面 向同步控 制时容 易引起服 务器端设备 的循环读取 。针 对这一 问题 ,
引) NT  ̄ P网络授 时协议和 估计误差 系数 k, 并通 过测试确 定误 差 系数 k。通 过定制 uP协议栈 中的 U  ̄ 文格 式 , l DP K 实现 了N P T
gn eig a d Ap l a o s2 1 ,7 3 )7 -9 ier n pi t n ,0 14 (6 :67 . n ci
oSIP协议栈(及eXoSIP、Ortp等)使用入门
一直没空仔细研究下oSIP,最近看到其版本已经到了3.x版本,看到网上的许多帮助说明手册都过于陈旧,且很多文档内容有点误人子弟的嫌疑~~Linux下oSIP的编译使用应该是很简单的,其Install说明文档里也介绍的比较清楚,本文主要就oSIP在Windows平台下VC6.0开发环境下的使用作出描述。
虽然oSIP的开发人员也说明了,oSIP只使用了标准C开发库,但许多人在Windows下使用oSIP时,第一步就被卡住了,得不到oSIP的LIB库和DLL库,也就没有办法将oSIP使用到自己的程序中去,所以第一步,我们将学习如何得到oSIP的静态和动态链接库,以便我们自己的程序能够使用它们来成功编译和执行我们的程序。
第一阶段:------------------------------------------------------先创建新工程,网上许多文档都介绍创建一个Win32动态链接库工程,我们这里也一样,创建一个空白的工程保存。
同样,将oSIP2版本3.0.1 src目录下的Osipparser2目录下的所有文件都拷到我们刚创建的工程的根目录下,在VC6上操作:Project-AddToProject-Files将所有的源程序和头文件都加入到工程内,保存工程。
这时,我们可以尝试编译一下工程,你会得到许多错误提示信息,其内容无非是找不到osipparser2/xxxxx.h头文件之类。
处理:在Linux下,我们一般是将头文件,lib库都拷到/usr/inclue;/usr/lib之类的目录下,c源程序里直接写#include <xxx.h>时,能直接去找到它们,在VC里,同样的,最简单的方法就是将oSIP2源码包中的Include目录下的 osipparser2目录直接拷到我们的Windows下默认包含目录即可,这个目录在VC6的Tool-Options-Directories里设置,(当然,如果你知道这一步,也可以不用拷贝文件,直接在这里把oSIP源码包所在目录加进来就可以了),默认如果装在C盘,目录则为 C:/Program Files/Microsoft Visual Studio/VC98/Include。
uip在单片机上的移植精讲
第一章基于单片机的网络编程概述随着网络技术的迅猛发展,Internet已经走进千家万户,越来越多的人拥有了随时随地上网的条件,享受着网络带来的方便快捷的生活。
同时,随着嵌入式控制技术的成熟,网络也逐步与之结合,深入到工业、楼宇、家居智能化等领域,实现远程数据采集、远程控制等功能。
网络化已经成为新一代嵌入式系统发展的一个重要趋势。
试想不久的将来,坐在办公室的电脑前就能查看和控制家里的门窗和灯的状态,甚至可以在下班时把家里配好汤料的电饭煲打开,到家就能闻到扑鼻而来的香味了。
盛行全球的Internet网络是基于TCP/IP协议族为基础组建的,TCP/IP是网络通讯系统互联的事实标准。
研究嵌入式系统的网络化,就要先从TCP/IP的概念入手。
1.1 TCP/IP的概念及分层结构TCP/IP协议是传输控制协议的简称,它实际上是一个协议族,包括许多相关协议。
其中最核心的协议是IP(网际协议)和TCP(传输控制协议),其它还包括ARP(地址解析协议)、RARP(逆地址解析协议)、ICMP(Internet控制报文协议)、UDP(用户数据报协议)、IGMP(Internet组管理协议)、DNS(域名系统)、TFTP(简单文件传送协议)、BOOTP(引导程序协议)、SNMP(简单网络管理协议)、Telnet(远程控制协议)、FTP(文件传送协议)、SMTP(简单邮件传送协议)等重要协议。
并且,随着网络技术的发展,还会不断有新的协议加入到TCP/IP协议族。
这些协议规范了不同的场景下的网络互连,实际应用中可以根据系统的需要使用其中的一些协议。
从TCP/IP协议的数量就可以看出,Internet网络是一个比较复杂的系统,能适配多种应用场景,根据使用协议的不同而实现不同的功能。
为了降低网络设计的复杂性,设计者将以分层的方式组织TCP/IP协议,每一层可能包括不同通信服务的多种协议。
从最底层的硬件开始,每一层都建立在其下一层的基础上,并负责向其上一层提供服务。
exosip2学习总结
exosip2协议栈学习总结1、exosip2协议栈介绍eXosip是Osip2的一个扩展协议集,它部分封装了Osip2协议栈,使得它更容易被使用。
使用 sip 协议建立多媒体会话是一个复杂的过程,exosip 库开发的目的在于隐藏这种复杂性。
正如它的名称所表示的,eXosip2 - the eXtended osip Library,它扩展了osip 库,实现了一个简单的高层API。
通过使用exosip,我们可以避免直接使用osip 带来的困难。
需要注意,exosip 并不是对osip 的简单封装包裹,而是扩展。
Osip 专注于sip 消息的解析,事务状态机的实现,而exosip 则基于osip 实现了call、options、register、publish 等更倾向于功能性的接口。
当然,这些实现都是依赖于底层osip 库已有的功能的。
2、exosip的模块构成2.1 底层连接管理extl.c、extl_udp.c、extl_tcp.c、extl_dtls.c、extl_tls.c 是与网络连接有关的文件。
实现了连接的建立,数据的接收以及发送等相关的接口。
其中,extl_udp.c 为使用UDP 连接的实现,extl_tcp.c 为使用TCP 连接的实现。
Extl_dtls.c 以及extl_tls.c 都是使用安全socket 连接的实现。
2.2 内部功能模块实现Jauth.c、jcall.c、jdialog.c、jevents.c、jnotify.c、jpublish.c、jreg.c、jrequest.c、jresponse.c、jsubscribe.c 等文件实现了内部对一些模块的管理,这些模块正如其文件名所表示的,jauth.c主要是认证,jcall.c 则是通话等等。
2.3 上层API 封装实现Excall_api.c、exinsubsription_api.c、exmessag_api.c、exoptions_api.c、expublish_api.c、exrefer_api.c、exregister_api.c、exsubsribtion_api.c 这几个以api 为后缀的文件,实现各个子模块的管理。
uip协议栈
uip协议栈UIP协议栈。
UIP(Micro IP)协议栈是一个专门为嵌入式系统设计的轻量级TCP/IP协议栈,它是由Adam Dunkels在2001年设计并开发的。
UIP协议栈具有占用资源少、运行效率高的特点,非常适合于资源有限的嵌入式系统。
本文将对UIP协议栈的特点、结构和应用进行介绍。
首先,UIP协议栈的特点。
UIP协议栈的设计目标是在资源有限的嵌入式系统上提供TCP/IP通信功能,因此其特点主要包括占用资源少、运行效率高、适用于小型设备等。
UIP协议栈采用了一些精简的设计方案,如采用静态内存分配、使用事件驱动等,使得其占用的内存资源较少,适用于RAM较小的嵌入式系统。
同时,UIP协议栈在代码结构上也进行了精简,避免了一些复杂的功能,从而提高了运行效率。
这些特点使得UIP协议栈成为嵌入式系统中常用的TCP/IP协议栈之一。
其次,UIP协议栈的结构。
UIP协议栈主要包括网络层、传输层和应用层三部分。
在网络层,UIP协议栈支持IPv4和IPv6两种网络协议,可以根据实际需求选择使用。
在传输层,UIP协议栈支持TCP和UDP两种传输协议,可以满足不同的通信需求。
在应用层,UIP协议栈提供了一些常用的网络应用接口,如HTTP、DHCP、SNTP等,方便开发人员进行网络应用开发。
整个UIP协议栈的结构清晰,功能模块化,易于理解和使用。
最后,UIP协议栈的应用。
UIP协议栈广泛应用于各种嵌入式系统中,如传感器网络、智能家居、工业控制等领域。
以传感器网络为例,传感器节点通常具有资源有限的特点,需要使用轻量级的协议栈来实现与上层网络的通信。
UIP协议栈正是针对这一需求而设计的,其占用资源少、运行效率高的特点使得其在传感器网络中得到广泛应用。
另外,在智能家居和工业控制领域,UIP协议栈也可以为设备之间的通信提供可靠的网络支持。
总之,UIP协议栈是一款专门为嵌入式系统设计的轻量级TCP/IP协议栈,具有占用资源少、运行效率高的特点,适用于资源有限的嵌入式系统。
详解uIP TCPIP协议栈在51单片机上的设计实现
详解uIP TCPIP协议栈在51单片机上的设计实现一引言随着信息技术的不断发展,以及人们对日常生活舒适度、方便度要求的提高,信息家电、智能仪表等产品越来越频繁的出现在我们的生活当中;人们也越来越热衷于把家电、仪表等设备连接到Internet 中,从而可以方便、及时的对它们进行远程察看、远程控制。
把这些设备接入Internet ,就需要考虑TCP/IP 网络协议的实现。
51单片机是对目前所有兼容Intel 8031指令系统的单片机的统称。
该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为目前应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。
目前很多公司都有51系列的兼容机型推出,在目前乃至今后很长的一段时间内将占有大量市场。
51单片机是基础入门的一个单片机,还是应用最广泛的一种。
需要注意的是52系列的单片机一般不具备自编程能力。
本文将简要描述uIP的实现方法,分析uIP协议栈的应用接口,并讨论如何将其应用到51系列单片机上。
二uIP协议栈的实现方法简述uIP协议栈主要提供了三个函数供系统底层调用。
即uip_init(),uip_input()和uip_periodic()。
其与应用程序的主要接口是UIP_APPCALL()。
ip_init()是系统初始化时调用的,主要初始化协议栈的侦听端口和默认所有连接是封闭的。
当网卡驱动收到一个输进包时,将放进全局缓冲区uip_buf中,包的大小由全局变量uip_len约束。
同时将调用uip_input ()函数,这个函数将会根据包首部的协议处理这个包和需要时调用应用程序。
当uip_input ()返回时,一个输出包同样放在全局缓冲区uip_buf里,大小赋给uip_len.假如uip_len是0,则说明没有包要发送。
否则调用底层系统的发包函数将包发送到网络上。
Linux协议栈实现分析完整版
sys_socketcall()
sys_socketcall()
sys_socketcall()
sys_socketcall()
sys_socket()
sys_bind()
sys_listen()
sys_accept()
sock_create()
sockfd_lookup()
sockfd_lookup()
ip_route_connect()
sock_close()
tcp_connect()
sock->ops->release()
tcp_transmit_skb()
tcp_close()、udp_close()
read调用
read() sys_read() sock_readv() sock_readv_writev()
如果定义了NETFILTER,则先进入 IP_FORWARD
Iq
lter
ip_options_compile ip_forward_finish ip_route_input_slow 在缓存中找到
ip_output.c:367
ip
进行路由,并把skb->dst->input函数 指针指向ip_local_deliver或ip_error 或ip_forward或ip Route.c:1658-1675行,在路由时 会先在路由缓存中查找,没找到则 由ip_route_input_slow函数从路 由表中查,并加入到缓存中
sockfd_lookup()
__sock_create()
security_socket_bind()
security_socket_listen()
SIP协议栈
SIP协议栈SIP(Session Initiation Protocol)是一种用于建立、修改和终止多媒体会话的通信协议。
它使用文本格式进行通信,并在互联网上运行。
SIP协议栈是指用于实现SIP协议的软件组件的集合,下面将介绍SIP协议栈的组成和工作原理。
SIP协议栈由多个层次组成,包括传输层、协议层和应用层。
传输层负责将SIP消息从一个节点传输到另一个节点。
常用的传输层协议包括UDP(User Datagram Protocol)和TCP (Transmission Control Protocol)。
协议层负责解析和处理SIP消息,例如建立会话、修改会话参数等。
应用层负责与用户交互,并根据需要生成SIP消息。
SIP协议栈的工作原理如下:当一个节点想要建立会话时,它将发送一个INVITE消息到目标节点。
目标节点收到INVITE消息后,将返回一个100 Trying消息表示正在处理请求。
然后,如果目标节点可以接受会话,它将返回一个180 Ringing消息表示正在响铃,并开始为该会话分配资源。
之后,目标节点将返回一个200 OK消息表示会话建立成功。
发送节点收到200 OK消息后,将发送一个ACK消息确认会话建立成功。
如果发送节点需要修改会话参数,它可以发送一个UPDATE消息到目标节点。
目标节点收到UPDATE消息后,将根据需要修改会话参数,并返回一个200 OK消息确认修改成功。
如果发送节点想要终止会话,它可以发送一个BYE消息到目标节点。
目标节点收到BYE消息后,将返回一个200 OK消息表示会话终止成功。
SIP协议栈还支持其他功能,例如身份验证、位置服务和消息转发。
身份验证功能可以确保会话只能由合法用户建立和修改。
位置服务功能可以根据用户的位置信息将会话路由到合适的节点。
消息转发功能可以将SIP消息转发到其他网络中的节点。
总之,SIP协议栈是一种用于建立、修改和终止多媒体会话的通信协议。
第二章 uIP协议栈分析V1.00
2ቤተ መጻሕፍቲ ባይዱ 2
uIP 架构
uIP相当于一个代码库,通过一系列的函数实现与底层硬件和高层应用程序 的通讯, 对于整个系统来说它内部的协议组是透明的, 从而增加了协议的通用性。 uIP协议栈与系统底层和高层应用之间的关系如图2-1所示。
图2-1 uIP在系统中的位置 从上图可以看出, uIP 协议栈主要提供了三个函数供系统底层调用。即 uip_init(), uip_input() 和 uip_periodic() 。 其 与 应 用 程 序 的 主 要 接 口 是
本页已使用福昕阅读器进行编辑。 福昕软件(C)2005-2007,版权所有, 仅供试用。
UIP_APPCALL( )。 uip_init()是系统初始化时调用的,主要初始化协议栈的侦听端口和默认所有 连接是关闭的。 当网卡驱动收到一个输入包时,将放入全局缓冲区 uip_buf 中,包的大小由 全局变量 uip_len 约束。同时将调用 uip_input()函数,这个函数将会根据包首部 的协议处理这个包和需要时调用应用程序。当 uip_input()返回时,一个输出包同 样放在全局缓冲区 uip_buf 里,大小赋给 uip_len。如果 uip_len 是 0,则说明没 有包要发送。否则调用底层系统的发包函数将包发送到网络上。 uIP 周期计时是用于驱动所有的 uIP 内部时钟事件。当周期计时激发,每一 个 TCP 连接都会调用 uIP 函数 uip_periodic()。 类似于 uip_input()函数。 uip_periodic() 函数返回时,输出的 IP 包要放到 uip_buf 中,供底层系统查询 uip_len 的大小发 送。 由于使用 TCP/IP 的应用场景很多,因此应用程序作为单独的模块由用户实 现。uIP 协议栈提供一系列接口函数供用户程序调用,其中大部分函数是作为 C 的宏命令实现的,主要是为了速度、代码大小、效率和堆栈的使用。用户需要将 应 用 层 入 口 程 序 作 为 接 口 提 供 给 uIP 协 议 栈 , 并 将 这 个 函 数 定 义 为 宏 UIP_APPCALL()。这样,uIP 在接受到底层传来的数据包后,在需要送到上层应 用程序处理的地方,调用 UIP_APPCALL( )。在不用修改协议栈的情况下可以适 配不同的应用程序。
uip简介
Uip协议栈初步分析5.1Uip协议栈架构uIP 的代码和这个文档的新版本可以在uIP的主页下载/adam/uip/。
Uip协议栈架构图Uip协议栈包含以下几层:1.硬件驱动程序:包含rtl8019as/ax88796/dm9000等的驱动程序由于uip是个免费的协议栈,在不同芯片合系统上,需要对原有的协议栈进行修改,这个过程就叫做移植,一般的uip协议栈没有提供网络芯片的驱动程序,所幸遇的是/projects/uipAVR.htm已经将uip移植到avr上,并提供了rtl8019as和ax88796的驱动程序,dm9000的驱动程序没有提供。
本开发板提供的软件也是从上述地址的软件移植而来,类似的charon ii 和ethernut软件也提供类似的驱动程序,有兴趣的也可以参考一下。
驱动程序完成,芯片的初始化,复位,溢出处理,读写函数和收发包等,主要函数如下另外对网络芯片的寻址也在此完成!!!!主要文件在rtl8019.h和rtl8019.c中2.nic网络层主要完成网络的初始化,网络芯片的选取,网络芯片的轮训poll等主要文件在nic.h和nic.c中3.uip协议栈层主要实现网络协议栈的具体实现,支持arp/icmp/udp/tcp/http/等为了实现在8位单片机上运行,系统设计时没有采用socket编程方式本层是uip协议栈的核心,所以得协议处理都在本层实现主要函数有:主要文件在uip.h和uip.c中4.uip_app层支持基于udp/tcp的上层应用函数的实现例如如果需要网页功能,需要支持http,那么在app.h/.c中实现具体的功能!!主要文件在app.h和app.c中编译文件其他介绍:Uipopt.h 这个是uip协议栈的配置函数,例如本机ip地址,本机网关,本机屏蔽码,本机mac 地址以及uip协议栈的一些常用设置等都在此修改!Uip_arp.h/.c定义了arp协议的处理函数Uip_arch.h/.c定义了协议栈需要的校验和函数5.2应用程序主要文件列表上图是一个项目的主要包含文件,其中html.h/.c是网页显示的文件!5.3. uip主要函数简介:5.4.uip main函数介绍:/******************************************************************** * Main Control Loop**********************************************************************/ int main(void){unsigned char i;unsigned char arptimer=0;////////////// MY CODE ADD//串口初始化USART_init();/////////////////////////// init NIC device driver//网络初始化函数nic_init();//uip协议栈初始化// init uIPuip_init();// init app 应用程序初始化,比如tcp或者udp ,http的应用!example1_init();// httpd_init();// init ARP cache 初始化arp协议的缓冲uip_arp_init();// init periodic timer 初始化周期函数定时器initTimer();//开放中断sei();//主循环while(1){// look for a packet查询网卡是否有数据包uip_len = nic_poll();if(uip_len == 0)//如果没有数据包{// if timed out, call periodic function for each connection if(timerCounter > TIMERCOUNTER_PERIODIC_TIMEOUT){timerCounter = 0;for(i = 0; i < UIP_CONNS; i++){uip_periodic(i);//周期性检查函数// transmit a packet, if one is readyif(uip_len > 0) //如果包长度大于0 发送包{//主动发送和重发数据包在此进行uip_arp_out();nic_send();}}/* Call the ARP timer function every 10 seconds. */if(++arptimer == 20)//更新arp表{uip_arp_timer();arptimer = 0;}}}else // packet received 接收到网络数据包{// process an IP packet 处理ip数据包if(BUF->type == htons(UIP_ETHTYPE_IP)){// add the source to the ARP cache// also correctly set the ethernet packet length before processinguip_arp_ipin();uip_input();// transmit a packet, if one is readyif(uip_len > 0){uip_arp_out();nic_send();}}// process an ARP packet 处理arp包else if(BUF->type == htons(UIP_ETHTYPE_ARP)){uip_arp_arpin();// transmit a packet, if one is readyif(uip_len > 0)nic_send();}}}return 1;}串口转TCP程序初步本范例主要实现串口数据发送到远程ip的对应端口,串口数据包含帧头和帧尾,主要有串口中断函数,和串口处理函数2个函数构成,分析如下:volatile unsigned int UartTxCount,UartRxCount,UartRxCount1;volatile unsigned char TxSendReady,RxOK,RS232Enable;//串口1通讯程序//没有增加超时处理20060822//SIGNAL(SIG_USART_RECV)#pragma interrupt_handler RS485COM:31//atmega32l @14void RS485COM(void){Rs485_Data=UDR1;//Rs485_Data=UDR;#ifdef MCUA TMEGA32//printf("=%x\n",Rs485_Data);////if(RxOK==1)printf("RxOK==1!\n");#if RS485HEADER//如果是帧头if(Rs485_Data==RSStart ) //接收到开始标志{RsStart=1; //开始接受串口1的数据Rs485Counter=0; //接收计数器清零RxBuf[Rs485Counter]=Rs485_Data; //把数据送入接收缓冲区RXBUFRSCRC=0; //RSCRC清零RxOK=0; //没有接收完成//加上0X55//#if CRC0//RSCRC+=Rs485_Data;//#endifRs485Counter++; //接收计数器加一}else if(Rs485_Data==RSEnd) //接收到结束标志{//检查CRC// if(RSCRC==RxBuf[Rs485Counter-1])// {RxBuf[Rs485Counter]=Rs485_Data; //将结束的数据送入接收缓冲区// UartRxCount=++Rs485Counter;RSLEN=++Rs485Counter; //把接收计数器的值送入RSLENRxOK=1; //接收完成RsStart=0; //清除RSSTARTRS485process();//Rs485Counter=0;// }/*RxBUF[Rs485Counter]=Rs485_Data;//加上0XAARSCRC+=Rs485_Data;//加上0XAA的字节长度Rs485Counter++;*//*else{//清除RxBuffor(j=0;j<TxBufLen;j++)RxBuf[j]='';//置位标志//3.初始化串口变量和标志// UartTxCount=0;UartRxCount=0;TxSendReady=0;RxOK=0;RS232Enable=1;}*/}else{#endif //RS485HEADER//开始接收数据帧中除了头和尾的中间数据//首先检查状态if(RxOK!=1)//如果没有结束{//检查计数器的值是否溢出//将接收的数据送入接收缓冲区RXBUF,同时计算CRC,计数器自动加一if(RsStart==1||Rs485Counter!=0){RxBuf[Rs485Counter]=Rs485_Data;//RSCRC+=Rs485_Data;Rs485Counter++;}#if RS485HEADER}#endif //RS485HEADER}}/*1. 串口及程序初始化;{TxSendReady=0;RxOK=0;RS232Enable=1;}2. 首先从串口接收数据,由于数据以0X55开始,0XAA结束,接收时数据写入RxBuf[];3. 接收完成,置接收标志RxOK=1;4. 判断RS232Enable=1,=1则复制到TxBuf, RxOK=0;TxSendReady=1;5. TCPAPP中判断if(TxSengReady==1),=1启动发送,发送完成清除TxSendReady=1;置位RS232Enable=1,允许数据装载到TxBuf*/void RS485process(void){unsigned char i;//if(UartRxCount!=0){//printf("UartRxCount=%x\n",UartRxCount);//for(i=0;i<UartRxCount;i++)printf("%x",RxBuf[i]);//printf("\n");//}//printf("RxOK=%x ",RxOK);//printf("TCP_SEND_OK=%x " ,TCP_SEND_OK);//printf("RS232Enable=%x ",RS232Enable);//printf("TCP_SEND_READY=%x \n",TCP_SEND_READY);if(TCP_SEND_OK==0){printf("TCP_SEND_OK==0\n");return;//如果发送没有完成则返回}//printf("RS232Enable=%x\n",RS232Enable);//printf("TCP_SEND_READY=%x\n",TCP_SEND_READY);//接收完成if(RSLEN!=0||RS232Enable==1)//如果不是空包和串口更新允许RS232ENABLE=1 {//如果缓冲中已经有数据包,需要把缓冲重的数据保存起来if(TCP_SEND_READY==1){//接受成功//UDR0 = j++;RxOK=0;//清接收成功标志UartRxCount1=RSLEN;//Rs485Counter;//包含包头和包尾的//把数据放入上一个数据包的TCP发送缓冲区的后面for(i=0;i<UartRxCount1;i++){TxBuf[i+UartRxCount]=RxBuf[i];}UartRxCount+=UartRxCount1;RSLEN=0;return;}if(TCP_SEND_OK)TCP_SEND_READY=1;//TCP准备发送else {UartRxCount=0;printf("TCP_SEND_OK=0\n");return;}//接受成功//printf("RxOK=1\n");RxOK=0;//清接收成功标志UartRxCount=RSLEN;//Rs485Counter;//包含包头和包尾的//把数据放入TCP发送缓冲区for(i=0;i<UartRxCount;i++){TxBuf[i]=RxBuf[i];//printf("TxBuf[%x]=%x\n",i,TxBuf[i]);}RSLEN=0;//for(i=0;i<TxBufLen;i++)RxBuf[i]='';//printf("\nTCP_SEND_READY=0\n");//RS232Enable=0;}else{printf("wait");}return;}。
uip协议
UIP协议UIP协议是一种用于物联网设备通信的轻量级协议。
它的设计目标是提供简单、高效、可靠的通信方式,适用于资源受限的设备。
本文将介绍UIP协议的基本原理和特点。
1. 概述UIP协议是一种基于UDP的通信协议,它采用了简单的报文格式和轻量级的传输机制。
相较于其他复杂的通信协议,UIP协议具有更低的资源消耗和更高的效率。
它适用于小型物联网设备之间的通信,如传感器、智能家居设备等。
2. 报文格式UIP协议的报文格式非常简单,由报文头部和报文数据组成。
报文头部包含了源地址、目标地址、报文长度等信息,用于协议的解析和路由。
报文数据部分存放了具体的数据内容。
[报文头部][报文数据]3. 传输机制UIP协议采用了一种称为Sliding Window的传输机制,用于实现可靠的数据传输。
在数据发送方,窗口会根据接收方的反馈进行调整,以保证数据的正确传输。
通过动态调整窗口大小和重传机制,UIP协议能够在不可靠的网络环境下保证数据的可靠传输。
4. 功能特点4.1 简单易用UIP协议的设计非常简单,API接口易于理解和使用。
开发人员可以快速上手,实现设备之间的通信功能。
4.2 资源占用低由于UIP协议采用了轻量级的报文格式和传输机制,它在处理器和内存资源上的消耗非常低。
这使得UIP协议非常适合资源受限的物联网设备。
4.3 高效可靠UIP协议通过Sliding Window机制实现了高效的数据传输,能够在不可靠的网络环境下保证数据的可靠性。
它可以应对一定的丢包和延迟,保证数据的完整性和正确性。
5. 应用场景UIP协议广泛应用于各种物联网设备之间的通信场景。
以下是几个常见的应用场景:•传感器网络:多个传感器节点之间通过UIP协议实现数据的采集和共享。
•智能家居:智能家居设备之间可以通过UIP协议进行联动控制和数据交换。
•工业控制:UIP协议可以应用于工业自动化领域,实现设备之间的通信和控制。
6. 总结UIP协议是一种适用于物联网设备通信的轻量级协议。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
提供的接口在 uip.h 中,为了减少函数调用造成的额外支出,大部分接口函 数以宏命令实现的。 1.初始化uIP协议栈:uip_init() 2.处理输入包:uip_input() 3.处理周期计时事件:uip_periodic() 4.开始监听端口:uip_listen() 5.连接到远程主机:uip_connect() 6.接收到连接请求:uip_connected() 7.主动关闭连接:uip_close() 8.连接被关闭:uip_closed()
#define UIP_FIXEDETHADDR 1
#define UIP_ETHADDR0 0x00
#define UIP_ETHADDR1 0x4f
#define UIP_ETHADDR2 0x49
#define UIP_ETHADDR3 0x12
#define UIP_ETHADDR4 0x12
#define UIP_NETMASK2 255
#define UIP_NETMASK3 0
#define UIP_DRIPADDR0 192
#define UIP_DRIPADDR1 168
#define UIP_DRIPADDR2 1
#define UIP_DRIPADDR3 1 (2)使能 MAC 地址
的拷贝,且发送和接收都是依靠这个缓存区,极大的节省空间和时间。 (4) 支持多个主动连接和被动连接并发。 (5) 其源代码中提供一套实例程序:web 服务器,web 客户端,电子邮件
发送程序(SMTP 客户端),Telnet 服务器, DNS 主机名解析程序等。 通用性强,移植起来基本不用修改就可以通过。 (6) 对数据的处理采用轮循机制,不需要操作系统的支持。 由于 uIP 对资源的需求少和移植容易,大部分的 8 位微控制器都使用过 uIP 协议栈, 而且很多的著名的嵌入式产品和项目(如卫星,Cisco 路由器,无线传感 器网络)中都在使用 uIP 协议栈。
uip_periodic(i); if(uip_len > 0) {
uip_arp_out(); etherdev_send(); } } /*查看 10S 是否到了,到了则调用 ARP 处理程序*/ if(timer_expired(&arp_timer)) { timer_reset(&arp_timer); uip_arp_timer(); } } } return; }
2.2 uIP 架构
uIP相当于一个代码库,通过一系列的函数实现与底层硬件和高层应用程序 的通讯,对于整个系统来说它内部的协议组是透明的,从而增加了协议的通用性。 uIP协议栈与系统底层和高层应用之间的关系如图2-1所示。
图2-1 uIP在系统中的位置 从上图可以看出,uIP 协议栈主要提供了三个函数供系统底层调用。即 uip_init(), uip_input() 和 uip_periodic() 。 其 与 应 用 程 序 的 主 要 接 口 是
uIP 协议栈去掉了完整的 TCP/IP 中不常用的功能,简化了通讯流程,但保 留了网络通信必须使用的协议,设计重点放在了 IP/TCP/ICMP/UDP/ARP 这些网 络层和传输层协议上,保证了其代码的通用性和结构的稳定性。
由于 uIP 协议栈专门为嵌入式系统而设计,因此还具有如下优越功能: (1) 代码非常少,其协议栈代码不到 6K,很方便阅读和移植。 (2) 占用的内存数非常少,RAM 占用仅几百字节。 (3) 其硬件处理层、协议栈层和应用层共用一个全局缓存区,不存在数据
uIP 周期计时是用于驱动所有的 uIP 内部时钟事件。当周期计时激发,每一 个 TCP 连接都会调用 uIP 函数 uip_periodic()。类似于 uip_input()函数。uip_periodic() 函数返回时,输出的 IP 包要放到 uip_buf 中,供底层系统查询 uip_len 的大小发 送。
/*从网卡读数据*/ uip_len = etherdev_read(); /*如果存在数据则按协议处理*/ if(uip_len > 0) {
/*收到的是 IP 数据,调用 uip_input()处理*/ if(BUF->type == htons(UIP_ETHTYPE_IP)) {
uip_arp_ipin(); uip_input(); /*处理完成后,如果 uip_buf 中有数据,则调用 etherdev_send 发 送出去*/ if(uip_len > 0)
{ uip_arp_out(); etherdev_send();
} } /*收到的是 ARP 数据,调用 uip_arp_arpin()处理*/
else if(BUF->type == htons(UIP_ETHTYPE_ARP)) { uip_arp_arpin();
if(uip_len > 0) { etherdev_send();
由于使用 TCP/IP 的应用场景很多,因此应用程序作为单独的模块由用户实 现。uIP 协议栈提供一系列接口函数供用户程序调用,其中大部分函数是作为 C 的宏命令实现的,主要是为了速度、代码大小、效率和堆栈的使用。用户需要将 应 用 层 入 口 程 序 作 为 接 口 提 供 给 uIP 协 议 栈 , 并 将 这 个 函 数 定 义 为 宏 UIP_APPCALL()。这样,uIP 在接受到底层传来的数据包后,在需要送到上层应 用程序处理的地方,调用 UIP_APPCALL( )。在不用修改协议栈的情况下可以适 配不同的应用程序。
#define UIP_CONF_BYTE_ORDER (7)暂时不移植打印信息,先关闭
UIP_BIG_ENDIAN
#define UIP_CONF_LOGGING
0
(8)定义数据结构类型
typedef unsigned char u8_t;
typedef unsigned int u16_t;
typedef unsigned long u32_t; 7. 如果使用 keil C 的小模式编译,需要在大部分的 RAM 的变量前增加 xdata。 8.data 为 keil C 的关键词,代码中所有出现 data 的地方(主要是参数、局 部变量、结构体成员)改为 pucdata 或 ucdata。 9.解决编译过程中的错误。uIP 协议栈为 C 语言编写,编译过程中的问题 比较少,并且容易解决。
2.3 uIP 在 MCS-51 单片机上的移植
1.为此项目建立一个 keil C 工程,建立 src 目录存放源文件。 2.通过阅读 uip-1.0\unix\main.c,了解 uIP 的的主循环代码架构,并将 main.c 放到 src 目录下。 3.仿照 uip-1.0\unix\tapdev.c 写网卡驱动程序,与具体硬件相关。这一步比 较费点时间,不过好在大部分网卡芯片的驱动程序都有代码借鉴或移植。驱动需 要提供三个函数,以 RTL9019AS 驱动为例。 etherdev_init():网卡初始化函数,初始化网卡的工作模式。 u16_t etherdev_read(void):读包函数。将网卡收到的数据放入全局缓存区 uip_buf 中,返回包的长度,赋给 uip_len。 void etherdev_send(void):发包函数。将全局缓存区 uip_buf 里的数据(长度 放在 uip_len 中)发送出去。 所以,收包和发包主要是操作 uip_buf 和 uip_len。具体驱动分析可参考《第 三章 网络芯片的驱动》。 4.由于 uIP 协议栈需要使用时钟,为 TCP 和 ARP 的定时器服务。因此使 用单片机的定时器 0 用作时钟,每 20ms 让计数 tick_cnt 加 1,这样,25 次计数 (0.5S)满了后可以调用 TCP 的定时处理程序。10S 后可以调用 ARP 老化程序。 对 uIP1.0 版本,增加了 timer.c/timer.h,专门用来管理时钟,都放到 src 下。 5.uIP 协议栈的主要内容在 uip-1.0\uip\下的 uip.c/uip.h 中,放到 src 下。如 果需要 ARP 协议,需要将 uip_arp.c 和 uip_arp.h 也放到 src 下。 6.uipopt.h/uip-conf.h 是配置文件,用来设置本地的 IP 地址、网关地址、 MAC 地址、全局缓冲区的大小、支持的最大连接数、侦听数、ARP 表大小等。 需要放在 src 下,并且根据需要配置。在 V1.00 版本中对配置做了如下修改: (1)配置 IP 地址,默认先关 IP,在初始化中再设定。
} } } /*查看 0.5S 是否到了,到了则调用 uip_periodic 处理 TCP 超时程序*/ else if(timer_expired(&periodic_timer)) {
timer_reset(&periodic_timer); for(i = 0; i < UIP_CONNS; i+DDR5 (3)使能 ping 功能
0x13
#define UIP_PINGADDRCONF 1 (4)关闭主动请求连接的功能
#define UIP_ACTIVE_OPEN 0 (5)将 uip_tcp_appstate_t 定位 u8_t 类型。 (6)由于单片机是大端结构,因此宏定义需要修改
#define UIP_FIXEDADDR 0
#define UIP_IPADDR0 192
#define UIP_IPADDR1 168
#define UIP_IPADDR2 1
#define UIP_IPADDR3 9
#define UIP_NETMASK0 255
#define UIP_NETMASK1 255
第二章 uIP 协议栈分析
2.1 uIP 特性
uIP 由瑞典计算机科学学院(网络嵌入式系统小组)的 Adam Dunkels 开发。其 源代码由 C 语言编写,并完全公开,所有代码和相关说明文档可以到 /adam/uip/下载。最新版本是 uIP1.0 版本,本书移植和使用的版 本正是此版本。