计算机网络项目——最小网元设计(阶段三)
目錄
- 階段目標(biāo)
- 設(shè)計(jì)描述
- 1、幀結(jié)構(gòu)
- 2、按目的轉(zhuǎn)發(fā)
- 3、反向地址學(xué)習(xí)
- 4、未知廣播
- 測(cè)試情況
- 其他想說的話
階段目標(biāo)
本階段主要完成鏈路層交換機(jī)的功能實(shí)現(xiàn):單播目的地址判收、支持廣播、有端口地址表、反向地址學(xué)習(xí),并在含交換機(jī)的多網(wǎng)元情況下完成測(cè)試。
設(shè)計(jì)描述
1、幀結(jié)構(gòu)
原理:
在階段二基礎(chǔ)的幀格式下,在幀頭增加了源、目的MAC地址,其中MAC地址采用3位二進(jìn)制碼編碼(考慮到配置文件設(shè)備數(shù)不超過8,也算是視情況偷了個(gè)懶),并且對(duì)本來為6字節(jié)的MAC地址簡(jiǎn)單處理,設(shè)備號(hào)即為MAC地址(如設(shè)備號(hào)為3則MAC地址為(int)3,然后轉(zhuǎn)換為二進(jìn)制目的和源MAC地址),幀格式其他部分同階段二。
此處的源MAC地址可以直接利用配置文件所讀取到的參數(shù)直接賦值,而目的MAC地址則需要手動(dòng)進(jìn)行輸入,或在APP層進(jìn)行鍵入傳遞參數(shù),或直接利用LNK層封裝時(shí)進(jìn)行手動(dòng)鍵盤鍵入。
| 幀頭定界符 | Dst_MAC | Src_MAC | ACK標(biāo)志位 | 幀序號(hào) | 數(shù)據(jù)位 | CRC校驗(yàn)位 | 幀尾定界符 |
涉及函數(shù):
發(fā)送方: int add_src_mac(U8* s, int len); //插入源MAC地址 int add_dst_mac(U8* s, int len, int dst_mac); //插入目的MAC地址接收方: int get_src_mac(U8* s); //提取源MAC地址 int get_dst_mac(U8* s); //提取目的MAC地址要點(diǎn):
2、按目的轉(zhuǎn)發(fā)
原理:
本例中,通過lowerNumber的數(shù)量是否大于1來初步判斷是否為交換機(jī),以區(qū)別交換機(jī)和一般主機(jī)的LNK層。
每接收一幀,查看其目的MAC地址,判斷是否為自身,如果是自身則向上層遞交,不是則按端口號(hào)轉(zhuǎn)發(fā),若無此地址則廣播到其他端口。其中轉(zhuǎn)發(fā)和廣播均通過Timeout()函數(shù)定時(shí)發(fā)送實(shí)現(xiàn),以達(dá)到交換機(jī)先“存儲(chǔ)”再轉(zhuǎn)發(fā)的效果。
對(duì)于交換機(jī),在所收到的數(shù)據(jù)需要進(jìn)行轉(zhuǎn)發(fā)時(shí),需要進(jìn)行拆包,與自己的MAC地址表進(jìn)行比對(duì),然后利用find_port()函數(shù)找到MAC表映射的轉(zhuǎn)發(fā)端口,進(jìn)行轉(zhuǎn)發(fā)。
涉及函數(shù):
-----全局MAC地址表----- struct Switch_table {int addr;int port; };//建立交換機(jī)MAC表//全局MAC表,個(gè)數(shù)最大為PORTNUM struct Switch_table* st; int table_len; //MAC表端口數(shù)-----查表和表輸出函數(shù)----- void print_switch_table(); //打印MAC表 int find_port(int addr); //根據(jù)目的地址查詢并返回端口號(hào)----Timeout()函數(shù)中存儲(chǔ)轉(zhuǎn)發(fā)所需要的循環(huán)隊(duì)列---- #define MAX_QUE 60 struct queue_t {int front;int rear;U8* data[MAX_QUE]; //數(shù)據(jù)數(shù)組int len[MAX_QUE]; //每個(gè)幀的幀長(zhǎng)數(shù)組int next_port[MAX_QUE]; //待轉(zhuǎn)發(fā)數(shù)據(jù)的轉(zhuǎn)發(fā)出口int src_port[MAX_QUE]; //接收數(shù)據(jù)的源端口,記錄下來便于后面的反向地址學(xué)習(xí)以及未知廣播 }; //全局循環(huán)隊(duì)列緩沖區(qū) struct queue_t my_buffer_pool;int enqueue(struct queue_t* que, U8* buf, int len, int nextPort, int srcPort); U8* dequeue(struct queue_t* que, int* len, int* nextPort, int* srcPort); void initqueue(struct queue_t* que); //初始化隊(duì)列,建議在程序開始運(yùn)行時(shí)的initialFunction()中使用 void freequeue(struct queue_t* que); //清空緩存區(qū)要點(diǎn):
3、反向地址學(xué)習(xí)
原理:
接收幀后,獲取其源MAC地址,如果MAC表中沒有此映射,則進(jìn)行該地址的學(xué)習(xí),或者在原有基礎(chǔ)上進(jìn)行更新(一定是要更新的,但這也可能在廣播風(fēng)暴中造成地址漂移)。
本例設(shè)計(jì)時(shí)考慮到模型的規(guī)模較小,設(shè)備不多,如果采用先進(jìn)行ARP進(jìn)行定時(shí)廣播學(xué)習(xí),會(huì)浪費(fèi)信道資源(其實(shí)一想也不會(huì)太浪費(fèi)),故采用按需學(xué)習(xí)的方式。本例中反向?qū)W習(xí)re_addr_learn()僅對(duì)接收幀內(nèi)的源地址進(jìn)行學(xué)習(xí),對(duì)于沒有參與通信設(shè)備的地址不進(jìn)行學(xué)習(xí)。
涉及代碼:
void re_addr_learn(int addr, int port); //反向地址學(xué)習(xí)4、未知廣播
交換機(jī)對(duì)于未知的目的地址將會(huì)廣播到其他所有端口,在Timeout()函數(shù)中利用for循環(huán)依次向除接收端口轉(zhuǎn)發(fā)出去即可。但在交換機(jī)組成環(huán)型拓?fù)鋾r(shí)會(huì)引起廣播風(fēng)暴占用大量帶寬。故應(yīng)設(shè)計(jì)生成樹算法進(jìn)行此問題的規(guī)避。(但由于一個(gè)人的人力問題和時(shí)間問題,生成樹沒有想到怎么較好的實(shí)現(xiàn),可能是圖論算法沒有學(xué)的很好的緣故,DFS和BFS沒有想好咋在這個(gè)里面簡(jiǎn)單使用)
測(cè)試情況
1、含交換機(jī)的一條線拓?fù)錅y(cè)試情況
發(fā)送一次數(shù)據(jù),由于數(shù)據(jù)幀和確認(rèn)幀的來回兩次轉(zhuǎn)發(fā),交換機(jī)產(chǎn)生兩次MAC地址的反向?qū)W習(xí),并打印顯示MAC表。
2、廣播風(fēng)暴所帶來的MAC表漂移情況
在以上無生成樹環(huán)型拓?fù)鋱D中,理論分析,各交換機(jī)會(huì)不斷進(jìn)行轉(zhuǎn)發(fā),形成廣播風(fēng)暴,并伴隨MAC表漂移。以下測(cè)試從網(wǎng)元1的APP層發(fā)送一次數(shù)據(jù),觀測(cè)各交換機(jī)LNK層情況。
可以觀測(cè)到,在網(wǎng)元1只發(fā)送了一次數(shù)據(jù)的情況下,其他各個(gè)網(wǎng)元LNK層均同上圖一樣,不停的轉(zhuǎn)發(fā)廣播數(shù)據(jù)幀,不停的更新MAC表,并且同一地址的映射發(fā)生漂移,同理論分析一樣形成廣播風(fēng)暴。
其他想說的話
雖然交換機(jī)的基本功能都已經(jīng)實(shí)現(xiàn),但是無奈一個(gè)人的工作量還是太大,生成樹當(dāng)時(shí)沒能來得及實(shí)現(xiàn),也是有點(diǎn)小遺憾。而且在這個(gè)階段由于沒有牽涉進(jìn)來網(wǎng)絡(luò)層的路由,所以不太好指明數(shù)據(jù)最終的目的設(shè)備是誰(shuí),當(dāng)時(shí)是簡(jiǎn)單通過代碼里面手動(dòng)修改。但在引入路由和IP與MAC的映射關(guān)系之后,這個(gè)問題便沒有了。
這個(gè)階段個(gè)人認(rèn)為除了完整的生成樹協(xié)議的實(shí)現(xiàn),其他功能的實(shí)現(xiàn)還是比較簡(jiǎn)單的,而且仍然主要停留在數(shù)據(jù)鏈路層,還沒有考慮與其他層交互的設(shè)計(jì),導(dǎo)致難度也沒有那么高。
總結(jié)
以上是生活随笔為你收集整理的计算机网络项目——最小网元设计(阶段三)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据通信原理_同网段主机通信原理
- 下一篇: php语句过滤掉html标签_php过滤