开源网络协议栈onps诞生记
小孩没娘,说来话长,一切都要从LwIP说起。大约是06年9月,本人在二姨的坛口发布了一篇小文——《uC/OS-II 平台下的 LwIP 移植笔记》。自此一发不可收拾,开启了一段我与LwIP从相识到相知的艰难历程。一年多的时间,对LwIP的使用获得的点点滴滴的知识聚沙成塔、集腋成裘,终于在08年汇成了一本大部头的书《嵌入式网络系统设计——基于 Atmel ARM7 系列》。这本书详细讲解了如何从零开始构建一个带实时操作系统的嵌入式网路通讯系统应用的完整技术实现过程,涉及单片机软、硬件开发、uC/OS-II实时内核 、LwIP协议栈移植及应用等相关知识。这本书的反响相当不错,好多人给我发 msn(可惜这么好的一个即时通讯工具就这么被微软放弃了,好多联系人就此失联,)或邮件咨询相关问题。彼时的uC/OS-II和LwIP是单片机开发者眼中的两大神器,属于基础的不能再基础的核心软件,是我长时间仰望的大神级别的存在。作为一名有梦想的程序猿,有朝一日能够像这些大神一样 ,参与甚至主导这样的核心基础软件的研发,幸之甚哉。梦想的种子一旦种下,就会在心底的某个地方悄悄地生根、发芽直至成长为一颗参天大树。清人山阴金先生言:”志之所趋,无远弗届。穷山距海,不能限也。”要想到达志之所趋之地,非一时一日之功可至。所以,写笔记以至写书都是为了让自己静下来,把脑海中那些有关uC/OS-II、LwIP的琐碎知识、技巧重新整理、归纳形成系统的知识,在思想层面与大神在线交谈,将大神的设计思想消化吸收,变成滋润自己的丰富营养。
在我原来的写作计划中,这本书的出版只是一个开始,接下来还要写第二本——系统介绍 LwIP 包含的 ppp 协议栈的移植、应用及设计实现等相关内容。如此一步一步、踏踏实实地走下去,梦想终将得偿。但,事与愿违,自08年书出版后,我的工作重心从单片机转到了嵌入式Linux系统,用到LwIP的机会从此归零。研发的产品也愈发复杂,可自由支配时间愈发变少。当然,最重要的一点是——ppp协议族在我的眼里还是太复杂了,涉及lcp、chap/pap、ipcp等多个协议之间的交互与协作。完成ppp移植并且应用只是第一步,要想变成铅字,我必须了解全部的技术细节,完全清楚ppp的相关工作原理并消化吸收后才能变成指尖下流动的文字明明白白地展示给读者。这也是我实现梦想必须要完成的工作。但可惜的是,那时的我对ppp没有任何知识储备,并且也无法拿出足够的时间从一加一等于二开始研究。没有完整时间、没有知识储备——能力、精力二者均不可得,信心自然就不足了,自然就没有把握把这件事情做好了,自然就不敢“硬”挤出时间继续我的写作计划了。于是,梦想的脚步在那时被按下了暂停键,LwIP、协议栈、核心基础软件这些标志性的东西被我悄悄地封存在了内心最隐秘的角落。
如今时间已经来到了二零年代,一个疫情肆虐、暂未看到结束迹象的年代。我的自由可支配时间多了起来。十余年的时光,各种复杂项目的锤炼也让我的知识储备和技术能力突飞猛进,远非当年的我可比。21年春节前与友人聊天,聊起开源软件,特别是嵌入式网络协议栈。他说适用于资源受限的单片机系统的网络协议栈可选择面很窄,主要就两款:LwIP和ThreadX NetX,前者可适配RT-Thread、uC/OS-II之类的多种rtos,而后者只能适配ThreadX,咱们中国人自己的开源网络协议栈还没有。说者无心,听者有意,那一刻我知道梦想之树到了开花结果的时候了。只不过时移势易,计划需要做些调整。没必要继续十余年前未竟的写作计划了,因为我的实力足以支撑我直接动手开发自己的网络协议栈了,无须从LwIP那里汲取营养了。于是,梦想的脚步在暂停十余年后再次向前迈出。
动手之前,需要先取个名字,想来想去还是直白一些更好。既然我要研发的是开源网络协议栈,直译成英文就是“open net protocol stack”,那就直接取英文全称的每个单词的首字母,就叫做onps栈,简单明了,还容易记。终于,历时6个月余,我顺利地完成了onps栈的1.0版。1.0版提供完整地ethernet/ppp/tcp/ip 协议族实现,同时提供 sntp、dns、ping 等网络工具,支持以太网环境下 dhcp 动态 ip 地址申请,也支持动态及静态路由表。不同于LwIP,协议栈还封装实现了一个伯克利套接字(Berkeley sockets)层供用户继续按照以往的编程经验与习惯使用onps栈开发自己的通讯应用。同时,为了方便用户使用、简化用户编码,协议栈还简化了传统BSD socket 编程需要的一些繁琐操作,将一些不必要的操作细节改为底层实现,比如 select/poll 模型、阻塞及非阻塞读写操作等。
为了适应单片机系统对内存使用极度变态的苛刻要求,onps 协议栈在设计之初即考虑采用写时零复制(zero copy)技术。用户层数据在向下层协议传递过程中,协议栈采用 buf list 链表技术将它们链接到一起,直至将其发送出去,均无须任何内存复制操作。另外,协议栈采用 buddy 算法提供安全、可靠的动态内存管理功能,以期最大限度地提高协议栈运行过程中的内存利用率并尽可能地减少内存碎片。
不同于本世纪 00 到 10 年代初,单片机的应用场景中 ucosii 等 rtos 尚未大规模普及,前后台系统还大行其道的时代,现如今大部分的应用场景下开发人员选择使用 rtos 已成为主流。因此,协议栈在设计之初即不支持前后台模式,其架构设计建立在时下流行的 rtos(RT-Thread、ucosii/iii 等)之上。协议栈移植的主要工作也就自然是针对不同 rtos 编写相关 os 适配层功能函数了。当然,如果你有着极其特定的应用场景,需要将 onps 栈移植到采用前后台模式的单片机上,我的建议是保留 tcp/udp 之下协议层的通讯处理逻辑,调整上层的系统架构使其适应目标系统运行模式。
其实,协议栈完成开发只是实现梦想的第一步。用户在使用过程中遇到的各种问题,协议栈的改进建议,新版本的发布都需要一个平台。于是我又在阿里云购买了一台云服务器,带宽1Mbps(资金有限,实在没办法),在上面部署了一个WEB服务器,作为onps栈的技术交流及官方资讯发布平台。另外我还为onps栈注册了一个域名:onps.org.cn,作为onps栈的官网访问地址。onps栈的源码可以从码云或gihub上获取。
历尽千辛万苦,onps栈如今已开源。新莺初啼,总免不了会有诸多不尽如人意的地方。期望各位多多使用,把使用过程中遇到的问题通过onps栈的技术交流社区提交给我,让onps栈能够快速迭代,早日比肩LwIP,为国产核心基础软件的进步贡献你我一份微薄的力量!
开源网络协议栈onps诞生记的更多相关文章
- 几种开源SIP协议栈对比OPAL,VOCAL,sipX,ReSIProcate,oSIP
随着VoIP和NGN技术的发展,H.323时代即将过渡到SIP时代,在H.323的开源协议栈中,Openh323占统治地位,它把一个复杂而又先进 的H.323协议栈展现在普通程序员的眼前,为H.323 ...
- 不错的网络协议栈测试工具 — Packetdrill
Packetdrill - A network stack testing tool developed by Google. 项目:https://code.google.com/p/packetd ...
- 【RL-TCPnet网络教程】第1章 当前主流的小型嵌入式网络协议栈
第1章 当前主流的小型嵌入式网络协议栈 这几年物联网发展迅猛,各种新产品.新技术也是层出不穷,本章节就为大家介绍当前主流的小型嵌入式网络协议栈. 1.1 当前主流的嵌入式网络协议栈 1.2 u ...
- chain33 区块链开发框架诞生记
chain33 诞生记 很多年没有写博客了,应该说,自从2013年开始玩比特币,就没有写过了.这5年来,做了很多事情,也见了很多以前做梦都没有想到过都事情.我做的最开心的事情,也是觉得最有意义的事情, ...
- 谷歌Gmail诞生记:十年回首
美国<时代>周刊网络版今天刊登题为<Gmail诞生记:10年前鲜为人知的故事>(How Gmail Happened: The Inside Story of Its Laun ...
- 不错的网络协议栈測试工具 — Packetdrill
Packetdrill - A network stack testing tool developed by Google. 项目:https://code.google.com/p/packetd ...
- 几种开源SIP协议栈对比
几种开源SIP协议栈对比 随着VoIP和NGN技术的发展,H.323时代即将过渡到SIP时代,在H.323的开源协议栈中,Openh323占统治地位,它把一个复杂而又先进的H.323协议栈展现在普通程 ...
- 理解 Linux 网络栈(1):Linux 网络协议栈简单总结
本系列文章总结 Linux 网络栈,包括: (1)Linux 网络协议栈总结 (2)非虚拟化Linux环境中的网络分段卸载技术 GSO/TSO/UFO/LRO/GRO (3)QEMU/KVM + Vx ...
- Android中android-async-http开源网络框架的简单使用
android-async-http开源网络框架是专门针对Android在Apache的基础上构建的异步且基于回调的http client.所有的请求全在UI线程之外发生,而callback发生在创建 ...
随机推荐
- 谈谈你对Promise的理解
一.Promise是什么? 理解 抽象表达: Promise 是一门新的技术(ES6 规范) Promise 是 JS 中进行异步编程的新解决方案(备注:旧方案是单纯使用回调函数) 具体表达: 从语法 ...
- 【MySQL】DDL因Waiting for table metadata lock卡住
在数据库空闲时间,对表做碎片整理: alter table my_abc engine=innodb; 发现会话被阻塞,显示状态是: Waiting for table metadata lock 手 ...
- Java使用定时任务详解
定时任务 目录 定时任务 SpringBoot定时任务 默认单线程 使用异步多线程 Spring定时任务XML配置(注解形式几乎同上) 使用springTask: ----springTask为spr ...
- FusionCopmpute之CNA,VRM虚拟机安装
CNA和VRM安装步骤一样,需要修改的只有IP 按步骤创建 修改自己虚拟机想要存放的位置 需要把自己网络同样配置为仅主机(提前配好) 自己也可以修改至200G 虚拟机只是用多少取多少 CNA可以设置为 ...
- 离线方式安装高可用RKE2 (版本: v1.22.13+rke2r1)记录
说明: 想要了解RKE2可以到官网(https://docs.rke2.io 或 https://docs.rancher.cn/docs/rke2/_index/)看最新资料 用官网给出的离线安装( ...
- 【HMS Core】集成地图服务不显示地图问题
[问题描述] 关于华为HMS-地图服务不显示地图的问题. 背景:集成华为地图服务运行后页面不显示地图,运行app后不展示地图报错MapsInitializer is not initialized. ...
- Lua脚本在Redis事务中的应用实践
使用过Redis事务的应该清楚,Redis事务实现是通过打包多条命令,单独的隔离操作,事务中的所有命令都会按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断.事务中的命令要么全部 ...
- 第六章:Django 综合篇 - 16:Authentication
Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. Django的认证系统包含了身份验证和权限管理两部分.简单地说,身份验证用于核实某个用户是否合法,权限管理 ...
- ProxySQL(6):管理后端节点
文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9286922.html 配置后端节点前的说明 为了让ProxySQL能够找到后端的MySQL节点,需要将后端的 ...
- 阿里云下配置keepalive,利用HAVIP实现HA
注:这篇文章参考网络,有些称呼都变了,比如阿里云上的现在是弹性ip 包括阿里云在内的很多云环境,因为不支持浮动IP广受诟病.目前阿里云在VPC网络下发布了HAVIP,能够实现arp宣告IP.这样也就让 ...