|
一直想讓單片機(尤其是51)聯(lián)網(wǎng),感覺這樣很好玩。但是沒有非常輕量的ip實現(xiàn),而且本人不太想讓單片機用ip網(wǎng)絡(luò)(占地址)。于是設(shè)計了非常輕量的網(wǎng)絡(luò)協(xié)議棧,稱為zxdnet(簡稱znet)。他可以工作對mtu的最小要求是48字節(jié),所以可以在很多鏈路上,例如串口和紅外。他很適合愛好者用來玩,也可以用于學(xué)習(xí)網(wǎng)絡(luò)原理。znet適用于構(gòu)建完全私有的組織內(nèi)網(wǎng)絡(luò)而不是公共網(wǎng)絡(luò)。
報文中所有字段都是大端序的。
znet和ip一樣是采用分層架構(gòu)的分組交換網(wǎng)絡(luò),數(shù)據(jù)包可以經(jīng)過多個路由器轉(zhuǎn)發(fā)后到達目的地。
首先介紹下znet的網(wǎng)絡(luò)層協(xié)議zp的報頭:
1.png (23.27 KB, 下載次數(shù): 0)
下載附件
2025-3-16 04:12 上傳
介紹下各字段:
BF(2bit):基本標志。前1bit表示目標地址類型,如果是0目標地址為普通地址,如果是1目標地址為組播地址(目前還沒設(shè)計組播)。后1bit表示無錯誤標志,如果此位為1,在發(fā)生錯誤的時候就不會通過zcp協(xié)議回報錯誤(類似ip中的icmp錯誤回報)
Proto(4bit):上層協(xié)議號
0: ZARP (ZXDNET 地址解析協(xié)議)
1: ZCP (ZXDNET 控制協(xié)議)
2: TUDP (簡單用戶數(shù)據(jù)報協(xié)議)
3: UDP (用戶數(shù)據(jù)報協(xié)議)
4: TCP (傳輸控制協(xié)議)
5: IPoZP (IP over ZP)
6: RAW
7-15: 用戶自定義
Time To Live(8bit):TTL
這個字段定義了數(shù)據(jù)報允許的最大跳數(shù)。發(fā)送方初始化這個值,每個路由節(jié)點在處理時將其減一。如果TTL在數(shù)據(jù)報到達目的地之前變?yōu)榱悖瑪?shù)據(jù)報會立即被丟棄。這個機制防止了無限路由循環(huán)。
Extra Flag(16bit):額外標志。用戶自定義,一般用于qos。
Total Length (16bit):報文總長度(字節(jié)),包括網(wǎng)絡(luò)層頭(16字節(jié))及其數(shù)據(jù)。
Header Checksum(16bit):首部校驗和。
僅對頭部字段計算校驗和。由于某些頭部字段(例如生存時間)在傳輸過程中可能會改變,因此每個處理頭部的節(jié)點都必須驗證和重新計算這個校驗和。
校驗和字段是頭部中所有16位字的反碼和的16位反碼。在計算過程中,校驗和字段本身被視為零。如果計算出的校驗和為零,則以全1的形式傳輸。如果校驗和字段本身為0,就跳過校驗,這適用于可靠鏈路。
Source Address和Destination Address:源地址和目標地址。
地址分配:
Zxdnet使用32位地址空間,采用CIDR,分類如下:
未指定/本地廣播地址(0.0.0.0/32):
位模式:00000000 00000000 00000000 00000000。
作為源:未初始化設(shè)備(例如,啟動時的0.0.0.0)。
作為目的地:有限廣播(在子網(wǎng)之外不可路由)。
回環(huán)地址(0.0.0.128/25):
位模式:00000000 00000000 00000000 1XXXXXXX。
僅限于內(nèi)部主機通信。
NAT擴展地址(0.0.0.64/26):
位模式:00000000 00000000 00000000 01XXXXXX。
僅限于本地地址擴展。
NAT處理:典型的NAT中間盒有兩個接口,一個連接到包含最多63個NAT設(shè)備的局域網(wǎng)(接口地址為0.0.0.64/26),另一個連接到全球網(wǎng)絡(luò)(具有全局單播地址)。對于使用端口號的傳輸層協(xié)議,NAT設(shè)備將全局單播地址的端口號劃分為幾個段,每個段包含相同數(shù)量的端口。這些端口然后映射到每個設(shè)備的前幾個端口號(從0開始)。中間盒本身將被分配第一個端口段。例如,對于一個總共有256個端口的傳輸層協(xié)議,NAT設(shè)備將這些端口劃分為64個段,每個段包含4個端口。端口0-3由中間盒使用,端口4-7映射到第一個NAT設(shè)備的端口0-3,依此類推,端口252-255映射到第63個NAT設(shè)備的端口0-3。對于ZCP Echo和ZCP錯誤報告,中間盒充當(dāng)代理。ZARP和IPoZP不支持NAT穿越。NAT嵌套不被支持。
保留地址(0.0.0.1-0.0.0.63):
位模式:00000000 00000000 00000000 00XXXXXX(XXXXXX!=000000)。
這些地址不得分配給任何設(shè)備或用于數(shù)據(jù)報頭。
單播地址(所有非保留地址):
分配給設(shè)備,全局可路由。
znet地址空間中只有256個為特殊用途,其他全部可以分配給設(shè)備。znet沒有所謂“網(wǎng)絡(luò)地址“,表示一個網(wǎng)絡(luò)可以用第一個設(shè)備地址+子網(wǎng)前綴長度。znet也沒有所謂”局域網(wǎng)廣播地址“,只有一個不可跨網(wǎng)關(guān)的有限廣播地址0.0.0.0。這樣的設(shè)計十分簡化,可以高效實現(xiàn),節(jié)省地址。
zp協(xié)議不支持網(wǎng)絡(luò)層分片,因為違反了網(wǎng)絡(luò)層無連接原則,并且一些運輸層不需要,占用了頭部空間。
下面介紹一些運輸層協(xié)議(上面提到的)。
首先是zarp協(xié)議。他設(shè)計的很簡潔。如果鏈路層目標地址是廣播地址就是請求,是設(shè)備地址就是響應(yīng)。
zcp協(xié)議用于控制和診斷網(wǎng)絡(luò)本身。校驗和算法與zp頭的一致,但是涵蓋zcp頭和他的數(shù)據(jù)。zcp報文最大48字節(jié)(包括zp頭)。zcp目前有2個作用:錯誤回報和回顯。首先說下錯誤回報報文。
2.png (16.96 KB, 下載次數(shù): 0)
下載附件
2025-3-16 04:12 上傳
以下是errcode定義:
0 = 網(wǎng)絡(luò)不可達。
1 = 主機不可達。
2 = 協(xié)議不可達。
3 = 端口不可達。
4 = 超出MTU。
5 = 生存時間在傳輸中超出。
6 = 數(shù)據(jù)丟失。
7 = 數(shù)據(jù)損壞。
8 = 鏈路擁塞。
9 = 顯式擁塞通告。
10 = 不支持組播。
注意,如果是超出MTU,原始zp頭里的校驗和字段會被替換為mtu。
然后介紹下回顯報文。
3.png (16.69 KB, 下載次數(shù): 0)
下載附件
2025-3-16 04:12 上傳
code=0就是回顯請求,code=1就是回顯響應(yīng)。對方收到后改變code,重新計算校驗和,然后發(fā)回報文, Identifier ,Sequence Number和Data不能改變。
data是用戶數(shù)據(jù),最大22字節(jié)。
znet支持跨nat ping。Source Host和 Destination Host就是為了跨nat ping。在正常情況下,當(dāng)設(shè)備發(fā)送 echo 請求時,這兩個字段都設(shè)置為 0。如果 NAT 設(shè)備向另一臺設(shè)備發(fā)送 Echo 請求,則中間框會將 Source Host 字段設(shè)置為其標識符(與地址的低 6 位匹配),以便將 Echo 回復(fù)路由回 NAT 設(shè)備。如果設(shè)備想要向 NAT 設(shè)備發(fā)送 echo 請求,則必須將 Destination Host 字段設(shè)置為 NAT 設(shè)備的標識符,并將 echo 請求發(fā)送到中間盒。在將請求轉(zhuǎn)發(fā)到目標 NAT 設(shè)備之前,中間框會自動將 Destination Host 字段設(shè)置為零。當(dāng)目標 NAT 設(shè)備返回回聲回復(fù)時,中間框?qū)⑹褂?NAT 設(shè)備的標識符重寫該字段,并將響應(yīng)轉(zhuǎn)發(fā)回發(fā)起回聲請求的設(shè)備。
最后介紹tudp協(xié)議。
4.png (11.66 KB, 下載次數(shù): 0)
下載附件
2025-3-16 04:12 上傳
這個報文頭簡單,無需過多講解。校驗和需要涵蓋tudp頭部和他的數(shù)據(jù)。tudp最大允許28字節(jié)的數(shù)據(jù),從而可以在單片機上高效運行。
znet其余的設(shè)計以后補充。
znet主要用途是研究和學(xué)習(xí),以及讓單片機聯(lián)網(wǎng)。znet目前還沒有被實現(xiàn),我會盡快實現(xiàn)他。歡迎大家一起探討,研究,使用,提出修改意見!
本人是業(yè)余愛好者,znet可能有不完善之處,請大家盡管提出
|
|