標(biāo)題: 為了讓51單片機(jī)聯(lián)網(wǎng),自己設(shè)計(jì)了一個(gè)輕量的網(wǎng)絡(luò)協(xié)議棧 [打印本頁(yè)]

作者: huilejie    時(shí)間: 2025-3-15 22:30
標(biāo)題: 為了讓51單片機(jī)聯(lián)網(wǎng),自己設(shè)計(jì)了一個(gè)輕量的網(wǎng)絡(luò)協(xié)議棧
一直想讓單片機(jī)(尤其是51)聯(lián)網(wǎng),感覺(jué)這樣很好玩。但是沒(méi)有非常輕量的ip實(shí)現(xiàn),而且本人不太想讓單片機(jī)用ip網(wǎng)絡(luò)(占地址)。于是設(shè)計(jì)了非常輕量的網(wǎng)絡(luò)協(xié)議棧,稱為zxdnet(簡(jiǎn)稱znet)。他可以工作對(duì)mtu的最小要求是48字節(jié),所以可以在很多鏈路上,例如串口和紅外。他很適合愛好者用來(lái)玩,也可以用于學(xué)習(xí)網(wǎng)絡(luò)原理。znet適用于構(gòu)建完全私有的組織內(nèi)網(wǎng)絡(luò)而不是公共網(wǎng)絡(luò)。
報(bào)文中所有字段都是大端序的。

znet和ip一樣是采用分層架構(gòu)的分組交換網(wǎng)絡(luò),數(shù)據(jù)包可以經(jīng)過(guò)多個(gè)路由器轉(zhuǎn)發(fā)后到達(dá)目的地。
首先介紹下znet的網(wǎng)絡(luò)層協(xié)議zp的報(bào)頭:


介紹下各字段:
BF(2bit):基本標(biāo)志。前1bit表示目標(biāo)地址類型,如果是0目標(biāo)地址為普通地址,如果是1目標(biāo)地址為組播地址(目前還沒(méi)設(shè)計(jì)組播)。后1bit表示無(wú)錯(cuò)誤標(biāo)志,如果此位為1,在發(fā)生錯(cuò)誤的時(shí)候就不會(huì)通過(guò)zcp協(xié)議回報(bào)錯(cuò)誤(類似ip中的icmp錯(cuò)誤回報(bào))

Proto(4bit):上層協(xié)議號(hào)
        0: ZARP (ZXDNET 地址解析協(xié)議)
        1: ZCP (ZXDNET 控制協(xié)議)
        2: TUDP (簡(jiǎn)單用戶數(shù)據(jù)報(bào)協(xié)議)
        3: UDP (用戶數(shù)據(jù)報(bào)協(xié)議)
        4: TCP (傳輸控制協(xié)議)
        5: IPoZP (IP over ZP)
        6: RAW
        7-15: 用戶自定義

Time To Live(8bit):TTL
        這個(gè)字段定義了數(shù)據(jù)報(bào)允許的最大跳數(shù)。發(fā)送方初始化這個(gè)值,每個(gè)路由節(jié)點(diǎn)在處理時(shí)將其減一。如果TTL在數(shù)據(jù)報(bào)到達(dá)目的地之前變?yōu)榱�,�?shù)據(jù)報(bào)會(huì)立即被丟棄。這個(gè)機(jī)制防止了無(wú)限路由循環(huán)。

Extra Flag(16bit):額外標(biāo)志。用戶自定義,一般用于qos。

Total Length (16bit):報(bào)文總長(zhǎng)度(字節(jié)),包括網(wǎng)絡(luò)層頭(16字節(jié))及其數(shù)據(jù)。

Header Checksum(16bit):首部校驗(yàn)和。
     僅對(duì)頭部字段計(jì)算校驗(yàn)和。由于某些頭部字段(例如生存時(shí)間)在傳輸過(guò)程中可能會(huì)改變,因此每個(gè)處理頭部的節(jié)點(diǎn)都必須驗(yàn)證和重新計(jì)算這個(gè)校驗(yàn)和。
    校驗(yàn)和字段是頭部中所有16位字的反碼和的16位反碼。在計(jì)算過(guò)程中,校驗(yàn)和字段本身被視為零。如果計(jì)算出的校驗(yàn)和為零,則以全1的形式傳輸。如果校驗(yàn)和字段本身為0,就跳過(guò)校驗(yàn),這適用于可靠鏈路。

Source Address和Destination Address:源地址和目標(biāo)地址。

地址分配:
   Zxdnet使用32位地址空間,采用CIDR,分類如下:

   未指定/本地廣播地址(0.0.0.0/32):
   位模式:00000000 00000000 00000000 00000000。
   作為源:未初始化設(shè)備(例如,啟動(dòng)時(shí)的0.0.0.0)。
   作為目的地:有限廣播(在子網(wǎng)之外不可路由)。

   回環(huán)地址(0.0.0.128/25):
   位模式:00000000 00000000 00000000 1XXXXXXX。
   僅限于內(nèi)部主機(jī)通信。

   NAT擴(kuò)展地址(0.0.0.64/26):
   位模式:00000000 00000000 00000000 01XXXXXX。
   僅限于本地地址擴(kuò)展。
   NAT處理:典型的NAT中間盒有兩個(gè)接口,一個(gè)連接到包含最多63個(gè)NAT設(shè)備的局域網(wǎng)(接口地址為0.0.0.64/26),另一個(gè)連接到全球網(wǎng)絡(luò)(具有全局單播地址)。對(duì)于使用端口號(hào)的傳輸層協(xié)議,NAT設(shè)備將全局單播地址的端口號(hào)劃分為幾個(gè)段,每個(gè)段包含相同數(shù)量的端口。這些端口然后映射到每個(gè)設(shè)備的前幾個(gè)端口號(hào)(從0開始)。中間盒本身將被分配第一個(gè)端口段。例如,對(duì)于一個(gè)總共有256個(gè)端口的傳輸層協(xié)議,NAT設(shè)備將這些端口劃分為64個(gè)段,每個(gè)段包含4個(gè)端口。端口0-3由中間盒使用,端口4-7映射到第一個(gè)NAT設(shè)備的端口0-3,依此類推,端口252-255映射到第63個(gè)NAT設(shè)備的端口0-3。對(duì)于ZCP Echo和ZCP錯(cuò)誤報(bào)告,中間盒充當(dāng)代理。ZARP和IPoZP不支持NAT穿越。NAT嵌套不被支持。

   保留地址(0.0.0.1-0.0.0.63):
   位模式:00000000 00000000 00000000 00XXXXXX(XXXXXX!=000000)。
   這些地址不得分配給任何設(shè)備或用于數(shù)據(jù)報(bào)頭。

   單播地址(所有非保留地址):
   分配給設(shè)備,全局可路由。
znet地址空間中只有256個(gè)為特殊用途,其他全部可以分配給設(shè)備。znet沒(méi)有所謂“網(wǎng)絡(luò)地址“,表示一個(gè)網(wǎng)絡(luò)可以用第一個(gè)設(shè)備地址+子網(wǎng)前綴長(zhǎng)度。znet也沒(méi)有所謂”局域網(wǎng)廣播地址“,只有一個(gè)不可跨網(wǎng)關(guān)的有限廣播地址0.0.0.0。這樣的設(shè)計(jì)十分簡(jiǎn)化,可以高效實(shí)現(xiàn),節(jié)省地址。

zp協(xié)議不支持網(wǎng)絡(luò)層分片,因?yàn)檫`反了網(wǎng)絡(luò)層無(wú)連接原則,并且一些運(yùn)輸層不需要,占用了頭部空間。

下面介紹一些運(yùn)輸層協(xié)議(上面提到的)。

  首先是zarp協(xié)議。他設(shè)計(jì)的很簡(jiǎn)潔。如果鏈路層目標(biāo)地址是廣播地址就是請(qǐng)求,是設(shè)備地址就是響應(yīng)。

zcp協(xié)議用于控制和診斷網(wǎng)絡(luò)本身。校驗(yàn)和算法與zp頭的一致,但是涵蓋zcp頭和他的數(shù)據(jù)。zcp報(bào)文最大48字節(jié)(包括zp頭)。zcp目前有2個(gè)作用:錯(cuò)誤回報(bào)和回顯。首先說(shuō)下錯(cuò)誤回報(bào)報(bào)文。


以下是errcode定義:

0 = 網(wǎng)絡(luò)不可達(dá)。

1 = 主機(jī)不可達(dá)。

2 = 協(xié)議不可達(dá)。

3 = 端口不可達(dá)。

4 = 超出MTU。

5 = 生存時(shí)間在傳輸中超出。

6 = 數(shù)據(jù)丟失。

7 = 數(shù)據(jù)損壞。

8 = 鏈路擁塞。

9 = 顯式擁塞通告。

10 = 不支持組播。

注意,如果是超出MTU,原始zp頭里的校驗(yàn)和字段會(huì)被替換為mtu。


然后介紹下回顯報(bào)文。



code=0就是回顯請(qǐng)求,code=1就是回顯響應(yīng)。對(duì)方收到后改變code,重新計(jì)算校驗(yàn)和,然后發(fā)回報(bào)文, Identifier ,Sequence Number和Data不能改變。
data是用戶數(shù)據(jù),最大22字節(jié)。
znet支持跨nat ping。Source Host和 Destination Host就是為了跨nat ping。在正常情況下,當(dāng)設(shè)備發(fā)送 echo 請(qǐng)求時(shí),這兩個(gè)字段都設(shè)置為 0。如果 NAT 設(shè)備向另一臺(tái)設(shè)備發(fā)送 Echo 請(qǐng)求,則中間框會(huì)將 Source Host 字段設(shè)置為其標(biāo)識(shí)符(與地址的低 6 位匹配),以便將 Echo 回復(fù)路由回 NAT 設(shè)備。如果設(shè)備想要向 NAT 設(shè)備發(fā)送 echo 請(qǐng)求,則必須將 Destination Host 字段設(shè)置為 NAT 設(shè)備的標(biāo)識(shí)符,并將 echo 請(qǐng)求發(fā)送到中間盒。在將請(qǐng)求轉(zhuǎn)發(fā)到目標(biāo) NAT 設(shè)備之前,中間框會(huì)自動(dòng)將 Destination Host 字段設(shè)置為零。當(dāng)目標(biāo) NAT 設(shè)備返回回聲回復(fù)時(shí),中間框?qū)⑹褂?NAT 設(shè)備的標(biāo)識(shí)符重寫該字段,并將響應(yīng)轉(zhuǎn)發(fā)回發(fā)起回聲請(qǐng)求的設(shè)備。


最后介紹tudp協(xié)議。


這個(gè)報(bào)文頭簡(jiǎn)單,無(wú)需過(guò)多講解。校驗(yàn)和需要涵蓋tudp頭部和他的數(shù)據(jù)。tudp最大允許28字節(jié)的數(shù)據(jù),從而可以在單片機(jī)上高效運(yùn)行。


znet其余的設(shè)計(jì)以后補(bǔ)充。

znet主要用途是研究和學(xué)習(xí),以及讓單片機(jī)聯(lián)網(wǎng)。znet目前還沒(méi)有被實(shí)現(xiàn),我會(huì)盡快實(shí)現(xiàn)他。歡迎大家一起探討,研究,使用,提出修改意見!
本人是業(yè)余愛好者,znet可能有不完善之處,請(qǐng)大家盡管提出

作者: msold5    時(shí)間: 2025-3-16 07:47
厲害!可以為底部硬件提供足夠性價(jià)比
作者: Highnose    時(shí)間: 2025-3-16 18:14
趕緊實(shí)現(xiàn),很不錯(cuò)的項(xiàng)目
作者: zxcscm    時(shí)間: 2025-3-16 22:52
實(shí)現(xiàn)了自主路由的話,是不可以使用無(wú)線模塊接力自組網(wǎng)了
作者: huilejie    時(shí)間: 2025-3-16 22:55
Highnose 發(fā)表于 2025-3-16 18:14
趕緊實(shí)現(xiàn),很不錯(cuò)的項(xiàng)目

本人高中生學(xué)業(yè)繁忙,實(shí)現(xiàn)需要一段時(shí)間,稍安勿躁
作者: wkman    時(shí)間: 2025-3-17 11:16
無(wú)tcp-ip都不算“聯(lián)網(wǎng)”概念吧

作者: lxh0508    時(shí)間: 2025-3-17 18:55
重新造輪子,沒(méi)有什么意義。現(xiàn)有的交換機(jī)、路由器都用不上。自己玩玩還可以
作者: huilejie    時(shí)間: 2025-3-17 22:14
wkman 發(fā)表于 2025-3-17 11:16
無(wú)tcp-ip都不算“聯(lián)網(wǎng)”概念吧

為什么呢?tcpip是一種常用的網(wǎng)絡(luò)協(xié)議棧而不是唯一的
作者: huilejie    時(shí)間: 2025-3-17 22:16
lxh0508 發(fā)表于 2025-3-17 18:55
重新造輪子,沒(méi)有什么意義�,F(xiàn)有的交換機(jī)、路由器都用不上。自己玩玩還可以

Znet被設(shè)計(jì)與以太網(wǎng)交換機(jī)完全兼容。一臺(tái)znet路由器可以使用一臺(tái)linux主機(jī)實(shí)現(xiàn)。znet并不是被設(shè)計(jì)專用于以太網(wǎng)的,而是可以工作在串口/紅外/無(wú)線等幾乎任何鏈路上,實(shí)現(xiàn)真正的低開銷網(wǎng)絡(luò)
作者: huilejie    時(shí)間: 2025-3-17 22:17
zxcscm 發(fā)表于 2025-3-16 22:52
實(shí)現(xiàn)了自主路由的話,是不可以使用無(wú)線模塊接力自組網(wǎng)了

是的,znet可以工作在很多鏈路上,包括433m無(wú)線模塊和2.4g無(wú)線模塊,也可以運(yùn)行在ble和wifi上,實(shí)現(xiàn)極低開銷與極大自由度的嵌入式網(wǎng)絡(luò)。
作者: lmn2005    時(shí)間: 2025-3-18 07:59
高中時(shí)代都能研究這么高深的技術(shù)了,不錯(cuò)的,必是未來(lái)的高技術(shù)人才!
作者: msold5    時(shí)間: 2025-3-19 14:50
高中.....  想起我兒子在高三時(shí)也是捧著一大堆電腦書看。
建議項(xiàng)目緩緩,可以高考完成后再慢慢做,這類項(xiàng)目必須是在長(zhǎng)時(shí)間測(cè)試中完善才能做出真正有價(jià)值的東西。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1