日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算机网络项目——最小网元设计(阶段二)

發(fā)布時(shí)間:2024/8/23 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机网络项目——最小网元设计(阶段二) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 階段目標(biāo)
  • 設(shè)計(jì)描述
    • 1、幀結(jié)構(gòu)
    • 2、幀定位
    • 3、差錯(cuò)檢測(cè)
    • 4、差錯(cuò)控制
    • 5、流量控制
    • 6、長(zhǎng)幀傳輸——分片
  • 測(cè)試情況
  • 其他想說的話

階段目標(biāo)

用鏈路層例程代碼(LnkTester.sln)設(shè)計(jì)實(shí)現(xiàn)鏈路層上點(diǎn)到點(diǎn)之間的通信過程,具體包括:兩點(diǎn)之間幀同步、、差錯(cuò)檢測(cè)、差錯(cuò)控制、簡(jiǎn)單的流量控制。

設(shè)計(jì)描述

本階段主要停留在鏈路層對(duì)等實(shí)體之間的通信,故我們?cè)O(shè)計(jì)時(shí)出于簡(jiǎn)便的測(cè)試的想法,先不考慮上下之間的數(shù)據(jù)傳遞帶來的封裝問題,將應(yīng)用層融合為鏈路層。不過需要修改配置文件,將PHY和APP兩層的配置文件改為PHY和LNK的兩層文件,主要就是改一個(gè)APP層的名字,沒有其他需求印象中是不太需要改其他參數(shù)的。

1、幀結(jié)構(gòu)

不管是幀、數(shù)據(jù)包還是什么其他的數(shù)據(jù)形式也好,設(shè)計(jì)之初對(duì)于幀格式的設(shè)計(jì)一定是首尾的,這是一切的基礎(chǔ)。在計(jì)算機(jī)網(wǎng)絡(luò)的發(fā)展史中,協(xié)議的產(chǎn)生常常會(huì)伴隨幀格式的改變。所以這是設(shè)計(jì)中的重頭戲。

PS:設(shè)計(jì)采用面向位填充首尾定界法

01111110000000011001…011001111110
幀頭定界符ACK標(biāo)志位幀序號(hào)數(shù)據(jù)位CRC校驗(yàn)位幀尾定界符

2、幀定位

原理

幀定位采用面向位填充首尾定界法。幀頭和幀尾標(biāo)志固定為‘01111110’,在發(fā)送方封裝成幀時(shí)通過get_frame()函數(shù)將幀內(nèi)連續(xù)5個(gè)1后添加一個(gè)0,以便能夠準(zhǔn)確對(duì)幀進(jìn)行定位。在接收方又通過讀取bit流,讀到首尾的“01111110”來進(jìn)行定界,然后去除數(shù)據(jù)位中的連續(xù)5個(gè)1后的0.來還原真實(shí)數(shù)據(jù)位。(U8類型=char類型,此處這樣定義,只是為了專門區(qū)別,用來表示單字節(jié)數(shù)據(jù),這是指導(dǎo)書的說明,但我自己使用的時(shí)候則感覺多把他看成是1bit數(shù)據(jù)的形式。)

涉及函數(shù)

int get_frame(U8* s, int len); //發(fā)送端成幀 int locate_frame(U8* s, int len,U8* bufSend); //接收端提取幀

要點(diǎn)

  • 需要對(duì)于連續(xù)8位數(shù)據(jù)的讀取,判斷首尾定界符,這是簡(jiǎn)單的for循環(huán)。
  • 需要添加和提取5個(gè)1后面的0,這也是數(shù)據(jù)結(jié)構(gòu)中基礎(chǔ)的移位問題,要注意數(shù)據(jù)前移和后移時(shí)的到底是尾部先移動(dòng)還是頭部先移動(dòng)。
  • 除了簡(jiǎn)單的去除5個(gè)1后的0,可能要考慮因?yàn)槿コ鼵RC,ACK標(biāo)志位和序列號(hào)時(shí)指針頭的移動(dòng)和len的變化問題,也可以簡(jiǎn)單在向上層轉(zhuǎn)發(fā)函數(shù)中考慮。
  • 3、差錯(cuò)檢測(cè)

    原理

    差錯(cuò)檢測(cè)采用CRC-4來產(chǎn)生校驗(yàn)碼緊跟數(shù)據(jù)后面,其中CRC生成多項(xiàng)式采用固定G[5] = { 1,0,0,1,1 }利用crccode()函數(shù)來產(chǎn)生四位校驗(yàn)碼,并在接收端用crcdecode()函數(shù)進(jìn)行校驗(yàn)。校驗(yàn)錯(cuò)誤則丟棄該幀,等待重傳。(此處實(shí)際情況好像是多采用檢錯(cuò)能力更強(qiáng)的CRC16,此處出于簡(jiǎn)便設(shè)計(jì)和運(yùn)算速度,采用最短的CRC校驗(yàn)碼)

    涉及函數(shù)

    int crccode(U8* s, int len); //計(jì)算s的CRC校驗(yàn)位采用生成多項(xiàng)式G[5]={1,0,0,1,1} bool crcdecode(U8* s, int len); //接收方校驗(yàn)數(shù)據(jù)

    要點(diǎn)

  • 添加和刪除校驗(yàn)碼的移位問題,以及注意改變數(shù)據(jù)的長(zhǎng)度len
  • CRC的計(jì)算原理是采用模2除法,區(qū)別于二進(jìn)制除法
  • 4、差錯(cuò)控制

    原理

    對(duì)于數(shù)據(jù)在信道上進(jìn)行傳輸?shù)倪^程中可能產(chǎn)生的誤碼進(jìn)行差錯(cuò)控制設(shè)計(jì),我們采用停等協(xié)議進(jìn)行差錯(cuò)控制(雖然后續(xù)階段的設(shè)計(jì)發(fā)現(xiàn),停等協(xié)議這種一發(fā)一收的方式還是不夠高效,但設(shè)計(jì)是最簡(jiǎn)單的,其實(shí)可以嘗試滑窗的GB_N和SR協(xié)議),增加1位ACK標(biāo)識(shí)符和4位序列(由于是停等協(xié)議序號(hào)只有0000和1111),ACK標(biāo)志位判斷當(dāng)前幀是數(shù)據(jù)幀(0)還是確認(rèn)幀(1),并且判斷收到的是否為正確序號(hào)的幀(相應(yīng)確認(rèn)幀序號(hào)總是為期待收到的下一幀的序列號(hào))。確認(rèn)幀的數(shù)據(jù)位采用八位全1(11111111)作為數(shù)據(jù)部分。為提高效率,收方收到ACK為1的幀數(shù)據(jù)位中判斷收到數(shù)據(jù)位中有超過四個(gè)1即判斷收到確認(rèn)幀;同時(shí)序號(hào)中有三個(gè)及三個(gè)以上相同數(shù)字的即自動(dòng)糾錯(cuò)判斷幀序號(hào)。在發(fā)生差錯(cuò)和丟包時(shí),利用Timeout()內(nèi)部的重傳函數(shù)將緩存下來的數(shù)據(jù)進(jìn)行定時(shí)幀重傳,直到接收到正確的確認(rèn)幀,然后計(jì)時(shí)器開始變量isTimeStart停止。

    涉及函數(shù)

    int add_ack_seq(U8* s, int len); //加入1位ACK標(biāo)識(shí)位和4位序列號(hào)——————確認(rèn)幀的ACK為1,并且ACK的數(shù)據(jù)bit流部分為11111111 bool isAck(U8* s); //判斷是否為確認(rèn)幀 int get_ack_frame(U8* s, U8* ack_frame); //生成s對(duì)應(yīng)的確認(rèn)幀(幀序號(hào)為期待下一次接收到的幀序號(hào))---------------------重要變量-----------------------------超時(shí)重傳-- int TickTack = 0;//全局變量在Timeout()用來差錯(cuò)控制中的重傳 bool isTimerStart = false;//全局計(jì)時(shí)器啟動(dòng)標(biāo)志--緩存區(qū)-- U8* buffer = NULL;//全局的緩沖區(qū),發(fā)送前用來裝載可能重傳的數(shù)據(jù) int buflen = 0;//緩沖區(qū)儲(chǔ)存的字符串長(zhǎng)度--幀序號(hào)-- U8 SEQ[4] = { 0,0,0,0 };//四位序列號(hào)為全局變量,只有0000和1111,停等協(xié)議中異或交替出現(xiàn)

    要點(diǎn)

  • 在數(shù)據(jù)位頭部,添加ACK標(biāo)志位和幀序號(hào)涉及到的移位和len變化
  • 幀序號(hào)由于是采用停等協(xié)議,故異或用1111和0000兩個(gè)序號(hào)足矣,并且多位數(shù)據(jù)可以采用前向糾錯(cuò)(和數(shù)據(jù)位8位全1能夠前向糾錯(cuò)同理),減少重傳次數(shù),提高傳輸效率;雖然停等協(xié)議效率本來就很低。
  • 緩存區(qū)的全局變量在清空的時(shí)候建議采用提前分配一塊較大的空間,然后不要采用free()釋放的方式表示某次數(shù)據(jù)的緩存清空,而采用buflen=0長(zhǎng)度清0來表示。因?yàn)樵趯?shí)測(cè)過程中因?yàn)榍昂蟠蝹鬏敂?shù)據(jù)過程中,可能會(huì)由于超時(shí)時(shí)間的數(shù)值過小,導(dǎo)致出現(xiàn)連續(xù)多次釋放同一塊空間,導(dǎo)致以下報(bào)錯(cuò)。(而且反復(fù)申請(qǐng)和反復(fù)清空的操作本身就是一種很費(fèi)資源的方式,參考數(shù)據(jù)棧清空時(shí)是因?yàn)檎娴牟粫?huì)再用那一塊數(shù)據(jù)了,才清空的)。
    報(bào)錯(cuò)截圖:(這個(gè)困擾了我很久,網(wǎng)上只知道是釋放了空內(nèi)存,后來花費(fèi)很久才找到上面的解決辦法)
  • 5、流量控制

    在本例中,對(duì)于停等協(xié)議來說其實(shí)流量控制的意義不大,因?yàn)橐话l(fā)一收的機(jī)制本身就不會(huì)出現(xiàn)流量一股腦全懟進(jìn)去的情況。但還是可以做流量控制,可以仿照重傳,在Timeout()函數(shù)中設(shè)置一個(gè)閾值,和一個(gè)類似Ticktack的時(shí)鐘變量,然后當(dāng)達(dá)到閾值的時(shí)候,在sendtolower()前sleep一定的時(shí)間,達(dá)到流量控制的效果。(由于當(dāng)時(shí)有點(diǎn)摸魚,只隨手寫了個(gè)sleep,上面的說法才應(yīng)該是正確的流控)

    6、長(zhǎng)幀傳輸——分片

    這是當(dāng)時(shí)自己沒有做的一項(xiàng)拓展功能,但在后面傳輸圖片或者文件的功能實(shí)現(xiàn)中,發(fā)現(xiàn)這是極其必要的。因?yàn)槿绻麄鬏數(shù)臄?shù)據(jù)過長(zhǎng),會(huì)導(dǎo)致數(shù)據(jù)產(chǎn)生錯(cuò)誤而重傳的概率提高,可能導(dǎo)致反復(fù)重傳而傳不過去。因此將數(shù)據(jù)進(jìn)行分片多次傳輸,減小每次傳輸?shù)膸L(zhǎng)度,就有必要了。
    雖然沒有具體實(shí)現(xiàn),但后續(xù)想了一下實(shí)現(xiàn)思路,還是比較簡(jiǎn)單:可以將數(shù)據(jù)按定長(zhǎng)分段存入一個(gè)循環(huán)隊(duì)列中,然后對(duì)每個(gè)小幀進(jìn)行幀頭和幀長(zhǎng)的記錄,然后依次封裝發(fā)送。可以用一個(gè)標(biāo)志變量記錄當(dāng)發(fā)送總數(shù)據(jù)量等于從上層接收到的幀長(zhǎng)的時(shí)候,來表示一個(gè)完整的幀已經(jīng)傳輸成功;或者可以用更多的幀序號(hào)加以區(qū)分。接收方則需要按幀序號(hào)重新組裝數(shù)據(jù)放入一個(gè)新的內(nèi)存即可。

    測(cè)試情況

    1、點(diǎn)到點(diǎn)數(shù)據(jù)傳輸情況

    發(fā)送方:

    接收方:

    2、重傳情況

    發(fā)送方:

    接收方:

    其他想說的話

    階段二應(yīng)該是后面兩個(gè)階段的基礎(chǔ),個(gè)人覺得階段二主要是學(xué)會(huì)如何閱讀源碼,然后學(xué)會(huì)如何使用已有的一些例程函數(shù),去方便我們的代碼編寫。(然后在調(diào)試過程中,最重要的就是學(xué)會(huì)看內(nèi)存數(shù)據(jù)的變化,這是很重要的一點(diǎn),能提高解決bug的效率)
    不過好在這一階段的代碼,有老師的講解視頻可以參考,所以學(xué)著參考視頻,放開手大膽去做,克服畏難情緒,好的結(jié)果才能回應(yīng)這樣一個(gè)好的開端!

    總結(jié)

    以上是生活随笔為你收集整理的计算机网络项目——最小网元设计(阶段二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。