已剪辑自: https://mp.weixin.qq.com/s/_1LE7mGc9mRuajRgNsyirQ
onps是一个开源且完全自主开发的国产网络协议栈,适用于资源受限的单片机系统,提供完整地ethernet/ppp/tcp/ip协议族实现,同时提供sntp、dns、ping等网络工具,支持以太网环境下dhcp动态ip地址申请,也支持动态及静态路由表。
协议栈还封装实现了一个伯克利套接字(Berkeley sockets)层。
该层并没有完全按照Berkeley sockets标准设计实现,而是我根据以往socket编程经验,以方便用户使用、简化用户编码为设计目标,重新声明并定义了一组常见socket接口函数:
- socket:创建一个socket,目前仅支持udp和tcp两种类型
- close:关闭一个socket,释放当前占用的协议栈资源
- connect:与目标tcp服务器建立连接(阻塞型)或绑定一个固定的udp服务器地址
- connect_nb:与目标tcp服务器建立连接(非阻塞型)
- is_tcp_connected:获取当前tcp链路的连接状态
- send:数据发送函数,tcp链路下为阻塞型
- send_nb:数据发送函数,非阻塞型
- is_tcp_send_ok:数据是否已成功送达tcp链路的对端(收到tcp ack报文)
- sendto:udp数据发送函数,发送数据到指定目标地址
- recv:数据接收函数,udp/tcp链路通用
- recvfrom:数据接收函数,用于udp链路,接收数据的同时函数会返回数据源的地址信息
- socket_set_rcv_timeout:设定recv()函数接收等待的时长,单位:秒
- bind:绑定一个固定端口、地址
- listen:tcp服务器进入监听状态
- accept:接受一个到达的tcp连接请求
- tcpsrv_recv_poll:tcp服务器专用函数,等待任意一个或多个tcp客户端数据到达信号
- socket_get_last_error:获取socket最近一次发生的错误信息
- socket_get_last_error_code:获取socket最近一次发生的错误编码
协议栈简化了传统BSD socket编程需要的一些繁琐操作,将一些不必要的操作细节改为底层实现,比如select/poll模型、阻塞及非阻塞读写操作等。
简化并不意味着推翻,socket接口函数的基本定义、主要参数、使用方法并没有改变,你完全可以根据以往经验及编程习惯快速上手并熟练使用onps栈sockets。
无须过多关注协议栈底层,利用socket api编程即可完全满足复杂通讯应用的需求,而不像LwIp一样需要使用它自定义的一组接口函数才能达成同样的目标。
为了适应单片机系统对内存使用极度变态的苛刻要求,onps协议栈在设计之初即考虑采用写时零复制(zero copy)技术。用户层数据在向下层协议传递过程中,协议栈采用buf list链表技术将它们链接到一起,直至将其发送出去,均无须任何内存复制操作。
另外,协议栈采用buddy算法提供安全、可靠的动态内存管理功能,以期最大限度地提高协议栈运行过程中的内存利用率并尽可能地减少内存碎片。
不同于本世纪00到10年代初,单片机的应用场景中ucosii等rtos尚未大规模普及,前后台系统还大行其道的时代,现如今大部分的应用场景下开发人员选择使用rtos已成为主流。
因此,协议栈在设计之初即不支持前后台模式,其架构设计建立在时下流行的rtos(RT-Thread、ucosii/iii等)之上。协议栈移植的主要工作也就自然是针对不同rtos编写相关os适配层功能函数了。
当然,如果你有着极其特定的应用场景,需要将onps栈移植到采用前后台模式的单片机上,我的建议是保留tcp/udp之下协议层的通讯处理逻辑,调整上层的系统架构使其适应目标系统运行模式。
onps栈设计实现了一套完整的tcp/ip协议模型。从数据链路层到ip层,再到tcp/udp层以及之上的伯克利socket层,最后是用户自己的通讯应用层,onps栈实现了全栈覆盖,能够满足绝大部分的网络编程需求。其架构如下:
可以看出,其与传统的网络编程模型并没有什么不同,用户仍然是继续利用socket api编写常见的tcp及udp网络应用。同时你还可以利用协议栈提供的几个网络工具进行网络校时、dns查询等操作。
目录结构
名称描述
bsd | 伯克利sockets层的相关接口函数实现源文件 |
ethernet | 以太网协议族如ethernet-ii/arp及emac层、dhcp客户端等的相关实现源文件 |
include | 协议栈的头文件 |
ip | ip及其上层icmp/tcp/udp协议族的相关实现源文件 |
mmu | 协议栈内存管理模块的相关实现源文件 |
net_tools | 网络工具实现源文件,如dns查询、网络校时、ping等 |
netif | 网卡及路由管理等相关接口实现源文件 |
port | 协议栈移植相关的源文件 |
ppp | ppp链路层相关实现源文件,包括lcp/ipcp/chap/pap等协议族的实现源文件 |
TcpServerForStackTesting | 用于协议栈测试的tcp服务器,IDE为vs2015开发,目标系统为win7及以上 |
test_code | linux下的ppp拨号原理验证文件 |
协议栈支持主流的ARM Cortex系列MCU,支持Keil MDK、IAR等常见IDE。移植的核心工作就是完成RTOS模拟层的编写及适配,详细的移植说明请参考《onps网络协议栈移植及使用说明v1.0》一文:
https://gitee.com/Neo-T/open-npstack/releases/download/v1.0.0.221017/onps%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E6%A0%88%E7%A7%BB%E6%A4%8D%E5%8F%8A%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8Ev1.0.7z
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Go语言全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Golang知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
76440)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!