比特派app钱包安卓下载|uip
UIP 学习总结一-CSDN博客
>UIP 学习总结一-CSDN博客
UIP 学习总结一
倾心琴心
于 2013-02-17 17:40:56 发布
阅读量1.6k
收藏
3
点赞数
2
分类专栏:
UIP
嵌入式
文章标签:
UIPTCP嵌入式网络以太网
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iLoveHdr/article/details/8585817
版权
嵌入式
同时被 2 个专栏收录
5 篇文章
0 订阅
订阅专栏
UIP
2 篇文章
0 订阅
订阅专栏
UIP 学习总结一
UIP是用C语言写的一个网络协议栈,UIP协议栈是TCP/IP协议栈的一个功能子集,它只能实现一次处理一个单独的网络接口,它支持IP、ICMP、UDP和TCP协议。UIP是一个非常精简的协议栈,适用于8位和16位微处理器构建基于以太网的应用。本文主要总结UIP的使用,对UIP源码的解析留待以后详细讲解。
一、获得UIP
CSDN上可以下载UIP协议栈,以及相应的文档资料。
二、 UIP组成结构
这里将要讲述下载后的UIP协议栈主要文件的作用。下载后的目录结构如下
其中uip文件时整个UIP协议栈文件,不需要更改。My_arch文件夹是移植相关的文件,在移植到具体的处理器平台时需要更改一些文件。
其中需要修改的文件有tapdev.h tapdec.c clock-arch.c clock-arch.huip_arch.c
Uip-conf.h。
Tapdev.c是关于所移植平台上对以太网的设备接口支持,需要提供以太网的初始化和读取网帧和发送网络帧的函数实现。
Clock-arch.c是uip的时钟支持,需要实现的函数有时钟初始化,获得时钟函数,一般情况下会使用系统时钟也可以用定时器提供时钟支持。主要在移植uc/os-ii时我们一般已经使用了系统时钟,那么为uip提供时钟支持的可以使用定时器完成,也可以使用UCOS的获得时钟节拍的函数。
Main.c是一个使用范例,下面将详细讲解这个文件。
三、 Main.c
Main.c主要包含有循环时钟的设置与初始化、arp时钟的初始化、以太网设备接口初始化、uip协议栈的初始化、设定本机的IP地址 网关和掩码、应用初始化
文件中包含以下函数调用
timer_set(&periodic_timer, CLOCK_SECOND / 2);//初始化轮询时钟,
timer_set(&arp_timer, CLOCK_SECOND * 10);//初始化arp时钟
tapdev_init();//以太网设备初始化
uip_init();//UIP协议栈初始化
uip_ipaddr(ipaddr, 192,168,0,2);
uip_sethostaddr(ipaddr);//主机IP
uip_ipaddr(ipaddr, 192,168,0,1);
uip_setdraddr(ipaddr);//网关
uip_ipaddr(ipaddr, 255,255,255,0);
uip_setnetmask(ipaddr);//掩码
httpd_init();//应用初始化,范例为一个web服务器
main.c中最重要的是一个循环,该循环查看网络上是否有到本机的数据帧以及本机是否有数据帧需要发送,为UIP提供了底层设备的支持。
while(1) {
uip_len = tapdev_read();//读取网络帧,返回长度,数据保存在uip_buf中
//大于0则说明有网络数据到来
if(uip_len > 0) {
//该数据类型为 IP包
if(BUF->type == htons(UIP_ETHTYPE_IP)) {
//通知ARP有IP包进来 进行ip 对mac地址转换并保存在arp缓存中
uip_arp_ipin();
uip_input();//调用uip_input函数对网络数据处理
/* Ifthe above function invocation resulted in data that
should be sent out on the network, theglobal variable
uip_len is set to a value > 0. */
if(uip_len> 0) {
uip_arp_out();//如果没有该ip的mac地址则要发送arp请求,所以在UDP应用中需要发送一次伪数据来获得mac地址
tapdev_send();//发送数据
}
} else if(BUF->type == htons(UIP_ETHTYPE_ARP)) {
uip_arp_arpin();//arp请求
/* Ifthe above function invocation resulted in data that
should be sent out on the network, theglobal variable
uip_len is set to a value > 0. */
if(uip_len> 0) {
tapdev_send();//arp回复
}
}
//超时则启动轮询
}else if(timer_expired(&periodic_timer)) {
timer_reset(&periodic_timer);
//遍历所有的TCP链接
for(i = 0; i < UIP_CONNS; i++) {
uip_periodic(i);
/* Ifthe above function invocation resulted in data that
should be sent out on the network, the globalvariable
uip_len is set to a value > 0. */
if(uip_len> 0) {
uip_arp_out();
tapdev_send();
}
}
#if UIP_UDP
for(i = 0; i < UIP_UDP_CONNS; i++) {
uip_udp_periodic(i);
/* Ifthe above function invocation resulted in data that
should be sent out on the network, theglobal variable
uip_len is set to a value > 0. */
if(uip_len> 0) {
uip_arp_out();
tapdev_send();
}
}
#endif /* UIP_UDP */
/* Call the ARP timer function every 10 seconds. */
if(timer_expired(&arp_timer)) {
timer_reset(&arp_timer);
uip_arp_timer();
}
}
}
return 0;
}
该循环是UIP协议栈的的基本需要重点理解。
四 、uip-conf.h
该文件为对UIP的配置文件。
主要配置选项有:uip TCP最大链接数、uip 最大监听端口数、uip缓存大小、uip数据顺序(是否颠覆)
UDP支持、UDP最大链接数。
其中和应用联系最为直接和紧密的是UIP_APPCALL 配置和 UIP_UDP_APPCALL
这两个宏分别需要指向uip回调的应用函数。
通常会如下配置
对于TCP应用
typedef struct { //…..成员} uip_tcp_appstate_t;//该结构体作为uip为每个链接保留的应用数据。
#ifndef UIP_APPCALL
#define UIP_APPCALLTcpApp//TcpApp是一个函数的名称,该函数与处理TCP相关
对于UDP应用
typedef struct {//….成员} uip_udp_appstate_t;
#ifndef UIP_UDP_APPCALL
#defineUIP_UDP_APPCALL UDPApp//UDPApp为函数名称,该函数与处理UDP相关
五、编写基于UIP的网络应用。
完成以上的工作后,就可以开始编写基于UIP的网络应用了。
具体的编写方法在uip文档中有详细的讲解,这里不多说了,主要注意一下几点。
1、 首先要区分不同的应用,为不同的应用分配不同的端口,然后再编写uip回调函数时先写
switch(uip_udp_conn->lport){
case HTONS(PORT) :
{
If(uip_newdata())
{
}else if(uip_poll())
{
}
//……其他情况分支
}
}
对于TCP应用类似。
UIP当前的TCP链接保存在uip_conn,UDP链接保存在uip_udp_conn结构体中。可以根据自己的需要灵活地设计回调函数。
2、 在加入实时操作系统支持后,在上面提及的循环中必须调用系统的延时函数,为其他的任务提供时间运行。
3、 UIP主要是为支持TCP协议而编写的,对于UDP的支持不是很充分,比如它无法实现服务器端的功能而需要对UIP协议栈进行一定的修改,这个在网上有一些资料讲解了,大家可以自己查询一下。
六 小结。
第一次写技术总结,很多方面经验不足,还望各位提提意见,多谢大家。在总结的时候才发现自己在很多地方还是理解的模糊不清的,这也是我开始坚持写总结的一个原因。这是对UIP的第一份总结,后面会有更加详细地分析和总结。2013了,大家都在努力,我也要,希望我找份好工作嘞,祝福我吧,新年快乐。
优惠劵
倾心琴心
关注
关注
2
点赞
踩
3
收藏
觉得还不错?
一键收藏
知道了
0
评论
UIP 学习总结一
UIP 学习总结一UIP是用C语言写的一个网络协议栈,UIP协议栈是TCP/IP协议栈的一个功能子集,它只能实现一次处理一个单独的网络接口,它支持IP、ICMP、UDP和TCP协议。UIP是一个非常精简的协议栈,适用于8位和16位微处理器构建基于以太网的应用。本文主要总结UIP的使用,对UIP源码的解析留待以后详细讲解。一、获得UIP CSDN上可以下载UIP协议栈,以及相应的文档资料
复制链接
扫一扫
专栏目录
参与评论
您还未登录,请先
登录
后发表或查看评论
倾心琴心
CSDN认证博客专家
CSDN认证企业博客
码龄13年
暂无认证
13
原创
32万+
周排名
176万+
总排名
5万+
访问
等级
647
积分
8
粉丝
9
获赞
5
评论
18
收藏
私信
关注
热门文章
VS2012:error LNK2026: 模块对于 SAFESEH 映像是不安全的
13426
按键抖动与处理
10610
嵌入式实验指导
2840
fatal error LNK1112: 模块计算机类型“X86”与目标计算机类型“x64”冲突
2530
如何成为一名嵌入式系统工程师
2226
分类专栏
C++
1篇
代码风格
1篇
UIP
2篇
嵌入式
5篇
QT编程
2篇
VS2012
1篇
.net MVC
1篇
uC/OS
2篇
ARM
1篇
C
1篇
.net 编程
1篇
最新评论
std::variant的源码粗读
CSDN-Ada助手:
不知道 Java 技能树是否可以帮到你:https://edu.csdn.net/skill/java?utm_source=AI_act_java
VS2012:error LNK2026: 模块对于 SAFESEH 映像是不安全的
hofianohaioghk:
谢谢分享。。
VS2012:error LNK2026: 模块对于 SAFESEH 映像是不安全的
xiaoyao3857:
Thanks,正好我也碰到此问题
VS2012:error LNK2026: 模块对于 SAFESEH 映像是不安全的
w_yu珊珊爱喵喵:
谢谢分享~~
QT5静态编译教程,主要针对vs2012
lin11111111111:
大神啊===
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
std::variant的源码粗读
对比华为和谷歌coding style
好习惯影响着开发效率
2023年1篇
2021年1篇
2014年3篇
2013年18篇
目录
目录
分类专栏
C++
1篇
代码风格
1篇
UIP
2篇
嵌入式
5篇
QT编程
2篇
VS2012
1篇
.net MVC
1篇
uC/OS
2篇
ARM
1篇
C
1篇
.net 编程
1篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
一张表看懂uIP和lwIP的区别-腾讯云开发者社区-腾讯云
懂uIP和lwIP的区别-腾讯云开发者社区-腾讯云用户1605515一张表看懂uIP和lwIP的区别关注作者腾讯云开发者社区文档建议反馈控制台首页学习活动专区工具TVP最新优惠活动文章/答案/技术大牛搜索搜索关闭发布登录/注册首页学习活动专区工具TVP最新优惠活动返回腾讯云官网用户1605515首页学习活动专区工具TVP最新优惠活动返回腾讯云官网社区首页 >专栏 >一张表看懂uIP和lwIP的区别一张表看懂uIP和lwIP的区别用户1605515关注发布于 2018-04-11 10:57:485.1K0发布于 2018-04-11 10:57:48举报文章被收录于专栏:嵌入式程序猿嵌入式程序猿我们给大家介绍过目前比较流行的开源TCP/IP开源协议栈uIP和lwIP, 这两种都是由瑞典计算机科学研究院开发的,广泛应用于嵌入式系统中。因为全功能的TCP/IP协议是很庞大的,在资源紧张的嵌入式上是很难实现的,所以本着复杂问题简单化的原则,在嵌入式的应用场景下,做了一些假设和简化,瑞典计算机科学研究院开发出了这种可在嵌入式中应用的开源TCP/IP协议栈。在freeRTOS的学习中我们就给大家介绍过这两种协议栈,uIP比lwIP更精简,被大量移植在8位,16位,32位单片机上, lwIP比uIP功能更全一些,但同时占用资源也就更多一些。上面一张图就可以看出功能区别。两者在内存管理和分配上也有所不同,具体在移植应用时可以看源码。源码包里有一些例程可以参考学习,我们给大家移植过在freeRTOS下基于这两种协议栈的,webserver,并且测试通过,有兴趣的可以看看前几篇文章。关于协议栈的源码可以到https://github.com/adamdunkels/uip去下载uip源码。源码目录结构如下学习任何一个源码都要先搞清楚他的源码目录结构。Lwip可以去http://savannah.nongnu.org/projects/lwip/下载源码目录结构这两个都是开源的,可以应用于商业应用或者学习。可以根据自己的应用合理选择适合自己的协议栈。本文参与 腾讯云自媒体分享计划,分享自微信公众号。原始发表:2017-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除开源tcp/ip嵌入式本文分享自 嵌入式程序猿 微信公众号,前往查看如有侵权,请联系 cloudcommunity@tencent.com 删除。本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!开源tcp/ip嵌入式评论登录后参与评论0 条评论热度最新登录 后参与评论推荐阅读LV.关注文章0获赞0领券社区专栏文章阅读清单互动问答技术沙龙技术视频团队主页腾讯云TI平台活动自媒体分享计划邀请作者入驻自荐上首页技术竞赛资源技术周刊社区标签开发者手册开发者实验室关于社区规范免责声明联系我们友情链接腾讯云开发者扫码关注腾讯云开发者领取腾讯云代金券热门产品域名注册云服务器区块链服务消息队列网络加速云数据库域名解析云存储视频直播热门推荐人脸识别腾讯会议企业云CDN加速视频通话图像分析MySQL 数据库SSL 证书语音识别更多推荐数据安全负载均衡短信文字识别云点播商标注册小程序开发网站监控数据迁移Copyright © 2013 - 2024 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有 深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档Copyright © 2013 - 2024 Tencent Cloud.All Rights Reserved. 腾讯云 版权所有登录 后参与评论00第八章 开放经济(六):IS-LM-UIP模型(上) - 知乎
第八章 开放经济(六):IS-LM-UIP模型(上) - 知乎首发于宏观经济学教程——从入门到入学切换模式写文章登录/注册第八章 开放经济(六):IS-LM-UIP模型(上)君子终日乾乾上海社会科学院6. 汇率决定理论(三):IS-LM-UIP模型[1](上)6.1 无抛补利率平价条件(UIP)为了说明无抛补利率平价条件(uncovered interest parity, UIP),我们首先要解释一下什么叫“抛”,什么叫“补”。在外汇市场中,为了对冲风险,常常使用这样的交易方式:在本期购买一笔外汇后,同时卖出一笔同等数量的远期外汇(也就是外汇期货)。即:在约定的日期,按照事先已经确定的汇率卖出同等数量的外币。如果外币发生贬值,那么本期购买的外汇价值就会下跌,但卖出的远期外汇收益会增加。反之,如果外币发生升值,那么本期购买的外汇价值会上涨,但卖出的远期外汇收益会下降。总之,投资者可以通过对冲交易,避免或减少汇率波动的损失。外汇交易中,所谓的“抛”,指的是即期抛出本币购买外币的操作。所谓的补,指的是同步抛出外币期货,补入本币期货的操作。“无抛补(uncoverd)”——更准确的翻译应该是“有抛无补”——指的是在即期将本币兑换成外币的同时,并没有在远期外汇市场上作一笔相反的交易。等到投资期结束,以当时的汇率将外币兑换为本币。反之,“抛补(covered)”则是“有抛有补”,在抛出本币购买外币的同时进行一笔反向的期货操作。明确了“无抛补”的含义之后,我们来解释利率平价条件。这要从国际投资的套利交易开始。套利(arbitrage),俗称倒卖。假设一台苹果手机在美国卖1000美元,在中国卖7000人民币,美元对人民币的汇率为6,不考虑运输成本的情况下,从美国代购一台苹果手机只需6000人民币,但可以在中国以7000人民币的价格卖出,这样就可以套利1000人民币。在金融市场上的套利行为与之类似。假设张三手握$1,思考如何通过投资债券获利。如果投资美国债券,美国债券第t年的利率为 i_t(名义利率),那么t+1年的本息就是 $(1+i_t) 。如果选择投资英国债券,而英国债券第t年的利率为 i_t^* ,美元对英镑的名义汇率为 E_t ,那么张三先在外汇市场兑换 £E_t ,t+1年后的本息就是 £E_t (1+i_t^*) 。假设张三预期t+1年美元对英镑的名义汇率为 E_{t+1}^e ,那么张三一年后以美元表示的本息是 $\frac{E_t (1+i_t^* )}{E_{t+1}^e } 。图源:布兰查德《宏观经济学》如果资本在英美两国是完全自由流动的,理论上就不会存在套利的机会。这是因为,一旦有超额收益,资本就会蜂拥而入,不断压低投资收益率,直至抹平超额收益。因此,投资美国债券和投资英国债券最终的收益应该是一样的:1+i_t=\frac{E_t (1+i_t^* )}{E_{t+1}^e } 稍作变形:\frac{1+i_t^*}{1+i_t}=\frac{E_{t+1}^e}{E_t } 由于(1+i_t^*)/(1+i_t )≈1+i_t^*-i_t (数学注释)对于两个较小的数x,y,有 (1+x)/(1+y)≈1+x-y 。这是由于 (1+y)(1+x-y)=1+x+xy-y^2 ,其中 xy 和 y^2 都是非常小的数值,可以忽略不计,故 (1+y)(1+x-y)≈1+x ,从而 (1+x)/(1+y)≈1+x-y 。故这就是无抛补利率平价条件的公式。这个公式表明:国外与国内的利差近似等于本币的预期升值率,等于外币的预期贬值率。在实行固定汇率的情况下,如果市场相信固定汇率的可靠性,预期升值(贬值)率将为0——即 。那么国内外利率相等,不存在利差。这样一来,本国的宏观政策必须与外国保持高度一致,否则就会存在套利的机会,直至央行放弃固定汇率。因此,仅凭一个利率平价条件,我们已经可以推断出:在资本自由流动和固定汇率制的情况下,本国的货币政策失效。无抛补利率平价条件有两个不可或缺的前提:(1)不考虑任何投资风险,不考虑任何交易成本,仅仅从投资收益率的角度出发;(2)要求两国的资本可以自由流动,不存在严格的外汇管制。如果这两个前提不满足,跨国投资就会存在套利空间,利率平价条件也就不成立了。6.2 IS-LM-UIP模型回到原始版本的利率平价条件:1+i_t=\frac{E_t (1+i_t^* )}{E_{t+1}^e } 如果仅仅考察当期汇率和国内利率的函数关系,其它均视为外生变量,那么二者的关系是:E_t=\frac{1+i_t}{1+i_t^*} E_{t+1}^e 很显然,本国利率越高,汇率就越高,二者呈正相关。因此,UIP曲线是一条恒过 i=i^*,E=E^e 的,向右上方倾斜的曲线:事实上,利率平价条件是另一种形式的外汇市场均衡:在这一时刻,各国的投资收益率相等,因而资本流动趋于均衡。当然,NX-CF恒等式更多地是从产品市场上的实际因素考察外汇市场均衡,因而决定的对象是实际汇率;而UIP条件主要考虑的是从货币投机行为进行考察,因而决定的对象是名义汇率。但从考察短期经济波动的角度出发,基于价格刚性的假设,两个模型得出的结论没有什么不同。加入IS-LM模型后,逻辑也是类似的:由IS-LM模型决定国内利率,利率又通过UIP条件决定汇率,三者联立即可求得产品市场、货币市场、外汇市场同时均衡的情况:如上图所示,IS曲线和LM曲线的交点决定了名义利率 i_0 和均衡产出 Y_0 ,又通过UIP条件决定了均衡汇率 E_0 。(数学注释)IS-LM模型中价格刚性的假设使得通胀率为0,因此名义利率等于实际利率。IS-LM-UIP模型的数学表达式如下:IS: Y=C(Y-T)+I(r)+G+NX(ε) LM: M/P=L(i,Y) UIP: E=\frac{1+i}{1+i^* } E^e 费雪效应: i=r+π,π=0 实际汇率与名义汇率之间的关系: ε=EP/P^* 由于 P 和 P^* 都是不变常量,因此不必区分名义汇率和实际汇率。将UIP条件和费雪方程代入IS方程,即:IS: Y=C(Y-T)+I(i)+G+NX(\frac{1+i}{1+i^* } E^e) , LM: M/P=L(i,Y) 由此可解得开放经济条件下的均衡利率和产出。前情提要: 参考^来源:布兰查德《宏观经济学》。该模型依然以短期价格刚性为假设,因此不必特意区别名义汇率和实际汇率。发布于 2022-10-20 13:14宏观经济经济学考研国际经济赞同 12添加评论分享喜欢收藏申请转载文章被以下专栏收录宏观经济学教程——从入门到入学接近宏观经济运行
uIP介绍[通俗易懂]-腾讯云开发者社区-腾讯云
绍[通俗易懂]-腾讯云开发者社区-腾讯云全栈程序员站长uIP介绍[通俗易懂]关注作者腾讯云开发者社区文档建议反馈控制台首页学习活动专区工具TVP最新优惠活动文章/答案/技术大牛搜索搜索关闭发布登录/注册首页学习活动专区工具TVP最新优惠活动返回腾讯云官网全栈程序员站长首页学习活动专区工具TVP最新优惠活动返回腾讯云官网社区首页 >专栏 >uIP介绍[通俗易懂]uIP介绍[通俗易懂]全栈程序员站长关注发布于 2022-08-02 13:51:031.5K0发布于 2022-08-02 13:51:03举报文章被收录于专栏:全栈程序员必看全栈程序员必看大家好,又见面了,我是你们的朋友全栈君。 下面内容都是参考英文文档 uip是一个开源的微型协议栈,主要用于8位,16位MCU,占用内存少,并且代码少,容易移植。 它既可以用于多任务的操作系统中,如ucos。也能单独存在,传说中的裸奔。 uip的主循环 uip主循环中重复做着两件事情。查看是否收到数据包查看周期性超时是否发生 如果有数据包到达,则会在主循环中调用输入处理函数,uip_input(),这个函数不会发生阻塞,而是立刻返回。它返回时,相应接收这个数据包的应用程序或协议栈会产生一个或多个将要被发送的回应数据包。如果是这样的话,底层的网络设备驱动会被调用去发送这些数据包。 周期性超时是用于驱动依靠定时器的TCP机制,比如延时确认,重发,估算往返时间。如果主循环中周期性定时发生,uip就会调用定时处理函数uip_periodic().uip与具体平台有关的函数 uip有几个函数是跟具体平台有关实现有关的。一个是校验和计算,一个是32位I附加值运算。
校验和计算 在接收和发送数据包过程,校验和计算都是很重要的,且每次发送和接收时都要计算校验和,所以校验和函数必须很有效率。这在很多情况下就意味着校验和计算必须针对于运行uip的不同平台而做出一些手动调整。
虽然uip包含了通用的校验和计算,但是也留了两个函数来针对特定的平台,这两个函数是uip_ipchksum()和uip_tcpchksum(),在这两个校验和函数中,可以使用汇编语言高度优化来超过C语言的效率。 32位附加值运算 TCP中的32位运算也并不是在所有平台上都有效,所以有一个针对特定平台的关于32位附加值实现的函数uip_add32(). uip的内存管理 uip不使用动态分配内存。而是用一个单独的全局缓冲区储存数据包,还有一个固定的数组来储存连接状态。这个全局缓冲区足够大可以储存一个包的最大大小。当有个数据包被接收到,设备驱动就会把这个包放在这个全局缓冲区里然后调用TCP/IP栈。如果这个包包含数据的话,那么TCP/IP协议栈就会通知相应的应用程序。因为这个在这个缓冲区的数据会被接下来到达的数据覆盖,所以应用程序不得不立即处理这些数据或者把这些数据放到第二缓冲区以便接下来处理。在应用程序处理这些数据之前这个全局缓冲区不会被新来的数据包覆盖。在处理当前数据包时新来的数据包必须排队。许多单片以太网控制器都有足够大的片内缓冲区来包含至少4个最大大小的以太网帧。如果缓冲区满了,接下来的数据就会被丢弃。这会导致性能降低,但只是发生在多重连接的情况下。这是因为uip建议一个非常小的接收窗口,这意味着每次连接时仅仅只有一个TCP段在网络中。 在uip中,用于接收数据包的全局缓冲区也用于TCP/IP头部的传出数据。如果应用程序发送动态数据,它会使用全局缓冲区的部分来作为临时缓冲区。为了传送这些数据,应用程序会传递一个指针和数据的长度到栈中。TCP/IP的头部被写入全局缓冲区,并且一旦产生头部数据,设备驱动就会发送头部信息和应用程序数据到网络中。这个数据不是排队需要重发的数据。而是应用程序重新产生数据如果需要重发的话。 uip需要的总的内存量是根据特定的运行情况确定的。内存的配置确定了系统处理的流量数和最大连接数。 uip的API接口 因为与uip协议栈的原因,它不使用传统的BSD套接字API,它有两种API用于应用编程,一种类似BSD套接字API,还有一种是基于事件的API,这种需要内存比前者更少。 基于事件的API的意思是有一个应用程序运行在uip之上,当处理发生的特定事件时,由uip调用处理相关事件。这些事件包括接收到或发送包,建立连接时,当数据需要重发时等等。 另外uip不同于其他TCP/IP协议栈的地方是需要手动处理重发数据,也就是要自己在应用程序里编写代码处理要重发的数据,其他协议栈都是自动处理。这样做的理由也是为了节约内存。 应用程序事件 处理应用程序事件的函数是UIP_APPCALL(),当发生任何事件时都会调用此函数。每个事件都有特定的测试函数来区分是哪种事件,这个函数是一个宏实现,需要注意的是,事件可以同时发生。 连接指示器 当uip调用一个应用程序,全局变量uip_conn被设置成一个指向uip_conn结构体的指针,这个变量被称作当前连接。唉这个结构体中有些变量是有用的,比如用来区分要连接的是何种服务或者是连接对方的IP地址。一个典型的应用就是通过结构体中的变量uip_conn->lport看连接端口来确定是何种服务,比如如果是80端口,就是HTTP服务器应用程序。 数据接收 如果测试函数uip_newdata()非零,那么说明接收到新数据。接收到数据的长度可以通过uip_datalen()函数获得。数据不会被uip缓冲,但是当函数返回时数据会被覆盖。所以应用程序必须及时处理该数据或者将数据放入另一个缓冲区中。 发送数据 发送数据时,uip通过接收者的TCP窗口大小和有效的缓冲区空间来调整发送数据的长度。缓冲空间的大小由内存配置决定,因此有可能不是所有发送的数据都会到达接收者一方。所以可以调用uip_mss()看实际到底有多少数据发送出去了。 发送数据的函数是uip_send(),这个函数需要两个参数,一个是指向发送数据的指针和发送数据的长度。如果应用程序需要RAM空间来发送数据的话,那么包缓冲区(就是由uip_appdata指向的缓冲区)可以用于此目的。 在一个连接的同一时间只能有一块数据被发送,在一次应用程序里调用多次uip_send()是不可能的,它只会把最后调用的数据包发出去。 数据重发 重发是由周期TCP定时器驱动的,每次超时定时器调用时,每个连接的重发定时器就会减少,如果重发定时器减少到0,那么重发就要重发数据。因为uip在发送数据包后不会保存数据,所以需要手动处理重发数据。当uip确定有一段需要重发时,应用程序调用uip_rexmit()设置标志,表明有重发要求。 应用程序会检查重发标志然后产生重发数据,从应用程序角度来看,重发的数据和原来的数据没有什么不同,所以这两段代码是一样的。 关闭连接 应用程序通过调用uip_close()来关闭连接。这种关闭是正常的关闭连接。如果为了表示是严重错误而导致的关闭,那么应用程序应该调用uip_abort()来终止连接。 如果连接被关闭的话,那么uip_closed()会返回真,接着应用程序就可以继续做必要的清理工作了。 报告错误 在一个连接中有两种严重的错误会发生,一种是连接被异常终止或者数据多次重发无效而终止。uip会分别通过调用测试函数uip_aborted()和uip_timeout()来报告这些错误信息。 轮询 当连接空闲时,uip就会在每次超时时间到达时进行轮询。轮询的函数是uip_poll()。 轮询的目的有两个,第一个目的是让应用程序知道有空闲的连接,并让空闲太久的连接关闭。第二个目的是让应用程序发送新产生的数据。发送数据只能由uip来调用。因此轮询是在空闲连接时发送数据的唯一方式。 监听端口 监听端口的函数是uip_listen()。当连接需要和端口绑定时,uip就会创建一个连接并调用此函数。如果应用程序调用此函数的话,uip_connected()就会返回真。 开始连接 打开一个新的连接的函数是uip_connect(),这个函数会返回一个指针指向uip_conn()结构体。如果没有多余的空闲槽,那么函数返回NULL。 函数uip_ipaddr()用于将IP地址放入两个16位的数组,用来表示IP地址。 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/125215.html原文链接:https://javaforall.cn本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。 原始发表:2022年4月1,如有侵权请联系 cloudcommunity@tencent.com 删除前往查看tcp/ipapi本文分享自 作者个人站点/博客 前往查看如有侵权,请联系 cloudcommunity@tencent.com 删除。本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!tcp/ipapi评论登录后参与评论0 条评论热度最新登录 后参与评论推荐阅读LV.关注文章0获赞0领券社区专栏文章阅读清单互动问答技术沙龙技术视频团队主页腾讯云TI平台活动自媒体分享计划邀请作者入驻自荐上首页技术竞赛资源技术周刊社区标签开发者手册开发者实验室关于社区规范免责声明联系我们友情链接腾讯云开发者扫码关注腾讯云开发者领取腾讯云代金券热门产品域名注册云服务器区块链服务消息队列网络加速云数据库域名解析云存储视频直播热门推荐人脸识别腾讯会议企业云CDN加速视频通话图像分析MySQL 数据库SSL 证书语音识别更多推荐数据安全负载均衡短信文字识别云点播商标注册小程序开发网站监控数据迁移Copyright © 2013 - 2024 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有 深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档Copyright © 2013 - 2024 Tencent Cloud.All Rights Reserved. 腾讯云 版权所有登录 后参与评论00
uIP协议栈分析_协议栈-腾讯云开发者社区-腾讯云
议栈分析_协议栈-腾讯云开发者社区-腾讯云全栈程序员站长uIP协议栈分析_协议栈关注作者腾讯云开发者社区文档建议反馈控制台首页学习活动专区工具TVP最新优惠活动文章/答案/技术大牛搜索搜索关闭发布登录/注册首页学习活动专区工具TVP最新优惠活动返回腾讯云官网全栈程序员站长首页学习活动专区工具TVP最新优惠活动返回腾讯云官网社区首页 >专栏 >uIP协议栈分析_协议栈uIP协议栈分析_协议栈全栈程序员站长关注发布于 2022-09-27 09:57:147460发布于 2022-09-27 09:57:14举报文章被收录于专栏:全栈程序员必看全栈程序员必看大家好,又见面了,我是你们的朋友全栈君。转载地址:http://blog.sina.com.cn/s/blog_abd39cc70101fj1f.htmluIP特性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()函数,这个函数将会根据包首部的协议处理这个包和需要时调用应用程序。当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在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,在初始化中再设定。#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#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地址#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_ETHADDR5 0x13(3)使能ping功能#define UIP_PINGADDRCONF 1(4)封闭主动请求连接的功能#define UIP_ACTIVE_OPEN 0(5)将uip_tcp_appstate_t定位u8_t类型。(6)由于单片机是大端结构,因此宏定义需要修改#define UIP_CONF_BYTE_ORDER UIP_BIG_ENDIAN(7)暂时不移植打印信息,先封闭#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语言编写,编译过程中的题目比较少,并且轻易解决。 uIP的主控制循环通过实际的代码说明uIP协议栈的主控制循环。
void main(void){
timer_set(&periodic_timer, CLOCK_CONF_SECOND / 2); timer_set(&arp_timer, CLOCK_CONF_SECOND * 10); init_Timer(); uip_init();uip_arp_init(); example1_init(); etherdev_init(); uip_ipaddr(ipaddr, 192,168,1,9); uip_sethostaddr(ipaddr); uip_ipaddr(ipaddr, 192,168,1,16); uip_setdraddr(ipaddr); uip_ipaddr(ipaddr, 255,255,255,0); uip_setnetmask(ipaddr); while(1) {
uip_len = etherdev_read(); if(uip_len > 0) {
if(BUF->type == htons(UIP_ETHTYPE_IP)) {
uip_arp_ipin(); uip_input(); if(uip_len > 0) {
uip_arp_out(); etherdev_send(); } } else if(BUF->type == htons(UIP_ETHTYPE_ARP)) {
uip_arp_arpin(); if(uip_len > 0) {
etherdev_send(); } } } else if(timer_expired(&periodic_timer)) {
timer_reset(&periodic_timer); for(i = 0; i < UIP_CONNS; i++) {
uip_periodic(i); if(uip_len > 0) {
uip_arp_out(); etherdev_send(); } } if(timer_expired(&arp_timer)) {
timer_reset(&arp_timer); uip_arp_timer(); } } } return;}uIP协议栈提供的主要接口提供的接口在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() 9.发出往的数据被应答:uip_acked() 10.在当前连接发送数据:uip_send() 11.在当前连接上收到新的数据:uip_newdata() 12.告诉对方要停止连接:uip_stop() 13.连接被意外终止:uip_aborted()发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179104.html原文链接:https://javaforall.cn本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。如有侵权请联系 cloudcommunity@tencent.com 删除前往查看iostcp/ip缓存本文分享自 作者个人站点/博客 前往查看如有侵权,请联系 cloudcommunity@tencent.com 删除。本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!iostcp/ip缓存评论登录后参与评论0 条评论热度最新登录 后参与评论推荐阅读LV.关注文章0获赞0领券社区专栏文章阅读清单互动问答技术沙龙技术视频团队主页腾讯云TI平台活动自媒体分享计划邀请作者入驻自荐上首页技术竞赛资源技术周刊社区标签开发者手册开发者实验室关于社区规范免责声明联系我们友情链接腾讯云开发者扫码关注腾讯云开发者领取腾讯云代金券热门产品域名注册云服务器区块链服务消息队列网络加速云数据库域名解析云存储视频直播热门推荐人脸识别腾讯会议企业云CDN加速视频通话图像分析MySQL 数据库SSL 证书语音识别更多推荐数据安全负载均衡短信文字识别云点播商标注册小程序开发网站监控数据迁移Copyright © 2013 - 2024 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有 深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档Copyright © 2013 - 2024 Tencent Cloud.All Rights Reserved. 腾讯云 版权所有登录 后参与评论00