一个开源且完全自主开发的国产网络协议栈
已剪輯自: https://mp.weixin.qq.com/s/_1LE7mGc9mRuajRgNsyirQ
onps是一個開源且完全自主開發(fā)的國產(chǎn)網(wǎng)絡(luò)協(xié)議棧,適用于資源受限的單片機系統(tǒng),提供完整地ethernet/ppp/tcp/ip協(xié)議族實現(xiàn),同時提供sntp、dns、ping等網(wǎng)絡(luò)工具,支持以太網(wǎng)環(huán)境下dhcp動態(tài)ip地址申請,也支持動態(tài)及靜態(tài)路由表。
協(xié)議棧還封裝實現(xiàn)了一個伯克利套接字(Berkeley sockets)層。
該層并沒有完全按照Berkeley sockets標準設(shè)計實現(xiàn),而是我根據(jù)以往socket編程經(jīng)驗,以方便用戶使用、簡化用戶編碼為設(shè)計目標,重新聲明并定義了一組常見socket接口函數(shù):
- socket:創(chuàng)建一個socket,目前僅支持udp和tcp兩種類型
- close:關(guān)閉一個socket,釋放當前占用的協(xié)議棧資源
- connect:與目標tcp服務(wù)器建立連接(阻塞型)或綁定一個固定的udp服務(wù)器地址
- connect_nb:與目標tcp服務(wù)器建立連接(非阻塞型)
- is_tcp_connected:獲取當前tcp鏈路的連接狀態(tài)
- send:數(shù)據(jù)發(fā)送函數(shù),tcp鏈路下為阻塞型
- send_nb:數(shù)據(jù)發(fā)送函數(shù),非阻塞型
- is_tcp_send_ok:數(shù)據(jù)是否已成功送達tcp鏈路的對端(收到tcp ack報文)
- sendto:udp數(shù)據(jù)發(fā)送函數(shù),發(fā)送數(shù)據(jù)到指定目標地址
- recv:數(shù)據(jù)接收函數(shù),udp/tcp鏈路通用
- recvfrom:數(shù)據(jù)接收函數(shù),用于udp鏈路,接收數(shù)據(jù)的同時函數(shù)會返回數(shù)據(jù)源的地址信息
- socket_set_rcv_timeout:設(shè)定recv()函數(shù)接收等待的時長,單位:秒
- bind:綁定一個固定端口、地址
- listen:tcp服務(wù)器進入監(jiān)聽狀態(tài)
- accept:接受一個到達的tcp連接請求
- tcpsrv_recv_poll:tcp服務(wù)器專用函數(shù),等待任意一個或多個tcp客戶端數(shù)據(jù)到達信號
- socket_get_last_error:獲取socket最近一次發(fā)生的錯誤信息
- socket_get_last_error_code:獲取socket最近一次發(fā)生的錯誤編碼
協(xié)議棧簡化了傳統(tǒng)BSD socket編程需要的一些繁瑣操作,將一些不必要的操作細節(jié)改為底層實現(xiàn),比如select/poll模型、阻塞及非阻塞讀寫操作等。
簡化并不意味著推翻,socket接口函數(shù)的基本定義、主要參數(shù)、使用方法并沒有改變,你完全可以根據(jù)以往經(jīng)驗及編程習(xí)慣快速上手并熟練使用onps棧sockets。
無須過多關(guān)注協(xié)議棧底層,利用socket api編程即可完全滿足復(fù)雜通訊應(yīng)用的需求,而不像LwIp一樣需要使用它自定義的一組接口函數(shù)才能達成同樣的目標。
為了適應(yīng)單片機系統(tǒng)對內(nèi)存使用極度變態(tài)的苛刻要求,onps協(xié)議棧在設(shè)計之初即考慮采用寫時零復(fù)制(zero copy)技術(shù)。用戶層數(shù)據(jù)在向下層協(xié)議傳遞過程中,協(xié)議棧采用buf list鏈表技術(shù)將它們鏈接到一起,直至將其發(fā)送出去,均無須任何內(nèi)存復(fù)制操作。
另外,協(xié)議棧采用buddy算法提供安全、可靠的動態(tài)內(nèi)存管理功能,以期最大限度地提高協(xié)議棧運行過程中的內(nèi)存利用率并盡可能地減少內(nèi)存碎片。
不同于本世紀00到10年代初,單片機的應(yīng)用場景中ucosii等rtos尚未大規(guī)模普及,前后臺系統(tǒng)還大行其道的時代,現(xiàn)如今大部分的應(yīng)用場景下開發(fā)人員選擇使用rtos已成為主流。
因此,協(xié)議棧在設(shè)計之初即不支持前后臺模式,其架構(gòu)設(shè)計建立在時下流行的rtos(RT-Thread、ucosii/iii等)之上。協(xié)議棧移植的主要工作也就自然是針對不同rtos編寫相關(guān)os適配層功能函數(shù)了。
當然,如果你有著極其特定的應(yīng)用場景,需要將onps棧移植到采用前后臺模式的單片機上,我的建議是保留tcp/udp之下協(xié)議層的通訊處理邏輯,調(diào)整上層的系統(tǒng)架構(gòu)使其適應(yīng)目標系統(tǒng)運行模式。
onps棧設(shè)計實現(xiàn)了一套完整的tcp/ip協(xié)議模型。從數(shù)據(jù)鏈路層到ip層,再到tcp/udp層以及之上的伯克利socket層,最后是用戶自己的通訊應(yīng)用層,onps棧實現(xiàn)了全棧覆蓋,能夠滿足絕大部分的網(wǎng)絡(luò)編程需求。其架構(gòu)如下:
可以看出,其與傳統(tǒng)的網(wǎng)絡(luò)編程模型并沒有什么不同,用戶仍然是繼續(xù)利用socket api編寫常見的tcp及udp網(wǎng)絡(luò)應(yīng)用。同時你還可以利用協(xié)議棧提供的幾個網(wǎng)絡(luò)工具進行網(wǎng)絡(luò)校時、dns查詢等操作。
目錄結(jié)構(gòu)
名稱描述
| bsd | 伯克利sockets層的相關(guān)接口函數(shù)實現(xiàn)源文件 |
| ethernet | 以太網(wǎng)協(xié)議族如ethernet-ii/arp及emac層、dhcp客戶端等的相關(guān)實現(xiàn)源文件 |
| include | 協(xié)議棧的頭文件 |
| ip | ip及其上層icmp/tcp/udp協(xié)議族的相關(guān)實現(xiàn)源文件 |
| mmu | 協(xié)議棧內(nèi)存管理模塊的相關(guān)實現(xiàn)源文件 |
| net_tools | 網(wǎng)絡(luò)工具實現(xiàn)源文件,如dns查詢、網(wǎng)絡(luò)校時、ping等 |
| netif | 網(wǎng)卡及路由管理等相關(guān)接口實現(xiàn)源文件 |
| port | 協(xié)議棧移植相關(guān)的源文件 |
| ppp | ppp鏈路層相關(guān)實現(xiàn)源文件,包括lcp/ipcp/chap/pap等協(xié)議族的實現(xiàn)源文件 |
| TcpServerForStackTesting | 用于協(xié)議棧測試的tcp服務(wù)器,IDE為vs2015開發(fā),目標系統(tǒng)為win7及以上 |
| test_code | linux下的ppp撥號原理驗證文件 |
協(xié)議棧支持主流的ARM Cortex系列MCU,支持Keil MDK、IAR等常見IDE。移植的核心工作就是完成RTOS模擬層的編寫及適配,詳細的移植說明請參考《onps網(wǎng)絡(luò)協(xié)議棧移植及使用說明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
本說明提供了STM32F103RCT6及STM32F407VET6兩種硬件平臺的移植樣例,每種樣例分別針對RT-Thread和ucosii兩種RTOS。樣例工程經(jīng)過了嚴格的內(nèi)部測試,可以直接使用。
如果你沒有太多時間,或者樣例工程與你的目標平臺并不匹配,你可以直接參考協(xié)議棧移植的一般性指導(dǎo)文件《onps棧移植手冊》:
https://gitee.com/Neo-T/open-npstack/raw/master/onps%E6%A0%88%E7%A7%BB%E6%A4%8D%E6%89%8B%E5%86%8C.pdf
協(xié)議棧開發(fā)的一般性指導(dǎo)文件請參考
《onps棧API接口手冊》:
https://gitee.com/Neo-T/open-npstack/raw/master/onps%E6%A0%88API%E6%8E%A5%E5%8F%A3%E6%89%8B%E5%86%8C.pdf)
《onps棧用戶使用手冊》:
https://gitee.com/Neo-T/open-npstack/raw/master/onps%E6%A0%88%E7%94%A8%E6%88%B7%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C.pdf
Apache License 2.0開源許可協(xié)議
版權(quán)聲明:本文來源網(wǎng)絡(luò),免費傳達知識,版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請聯(lián)系我進行刪除。
總結(jié)
以上是生活随笔為你收集整理的一个开源且完全自主开发的国产网络协议栈的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows下合并iso镜像文件
- 下一篇: 数据中心网络如何发展成为无损数据中心网络