計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告中國地質(zhì)大學(xué)武漢_第1頁
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告中國地質(zhì)大學(xué)武漢_第2頁
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告中國地質(zhì)大學(xué)武漢_第3頁
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告中國地質(zhì)大學(xué)武漢_第4頁
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告中國地質(zhì)大學(xué)武漢_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告學(xué)院: 計(jì)算機(jī)學(xué)院 專業(yè):計(jì)算機(jī)科學(xué)與技術(shù) 教師: 班級: 姓名: 學(xué)號: 源碼在csdn上有目 錄題目一 02題目二 07題目三 17總結(jié) 24題目一:p105:3-07,為該數(shù)據(jù)添加crc碼,并驗(yàn)證他的正確性,改動crc碼最后一位,驗(yàn)證他的正確性。題目介紹:循環(huán)冗余檢驗(yàn)(crc)的原理是在發(fā)送端,先把數(shù)據(jù)劃分為組,假定每組k個比特?,F(xiàn)假定待傳送的數(shù)據(jù)m。crc運(yùn)算就是在數(shù)據(jù)m后面添加供差錯檢測用的n位冗余碼,然后構(gòu)成一個幀發(fā)出去,一共發(fā)送(k + n)位。在接收端把接收到的數(shù)據(jù)以幀為單位進(jìn)行crc檢驗(yàn):把收到的的每一個幀都除以同樣的除數(shù)(模2運(yùn)算),然后檢測余數(shù),如果

2、傳輸過程中沒有差錯,得到的余數(shù)肯定為0,如果出現(xiàn)誤碼,那么余數(shù)等于0的概率是非常小的。算法說明:求余數(shù)的算法采用逐位比較的方法,每次從被除數(shù)(cstring類型的字符)的前段取出與除數(shù)相同的位數(shù),進(jìn)行逐位比較,如果相同結(jié)果則為0,不同結(jié)果則為1,然后得到一個比較后的結(jié)果。刪除被除數(shù)前被取出的字段,把比較后的結(jié)果連接到被除數(shù)前。此時的被除數(shù)位數(shù)不變,前邊至少有一位為0,然后利用循環(huán)控制,把被除數(shù)前端的0位刪除。然后重復(fù)之前的步驟,直到被除數(shù)的位數(shù)小于除數(shù)的位數(shù),此時的剩下的被除數(shù)就是余數(shù)。然后檢測余數(shù)的位數(shù),若位數(shù)比除數(shù)的位數(shù)減1還要小,則在余數(shù)前端補(bǔ)0,使余數(shù)的位數(shù)等于除數(shù)的位數(shù)減1。校驗(yàn)算法

3、與求余數(shù)的算法類似,根據(jù)接收到的數(shù)據(jù)和預(yù)先商定的除數(shù),進(jìn)行計(jì)算,求出余數(shù),若余數(shù)為0,則傳輸?shù)臄?shù)據(jù)無誤,若余數(shù)不為0,則傳輸過程中產(chǎn)生了錯誤。算法流程圖如下所示:按位比較n將被除數(shù)前幾位用結(jié)果替換除去被除數(shù)前端為0的位取出被除數(shù)前端與除數(shù)相同的位數(shù)算法開始y判斷被除數(shù)的位數(shù)是否小于除數(shù)的位數(shù)獲取被除數(shù)和除數(shù)獲得余數(shù),算法結(jié)束程序流程圖:程序開始輸入源數(shù)據(jù)和除數(shù)計(jì)算冗余碼(余數(shù))人為改動接收數(shù)據(jù)(或者不改動)校驗(yàn)改動后的數(shù)據(jù)程序結(jié)束運(yùn)行截圖:計(jì)算冗余校驗(yàn)碼:改變接收序列主要代碼實(shí)現(xiàn):1. 計(jì)算冗余碼函數(shù)如下:void cmy01dlg:onbtncount() / todo: add your

4、control notification handler code hereupdatedata(true);cstring num1 = m_num1;/被除數(shù)cstring num2 = m_num2;/除數(shù)cstring send = num1;cstring rcv;cstring r;/余數(shù)cstring temp = ;cstring pre;int l1,l2; /被除數(shù),除數(shù)的長度l1 = num1.getlength();/獲取被除數(shù)長度l2 = num2.getlength();/獲取除數(shù)長度/被除數(shù)后添加n-1個0for (int i = 0;i l2-1;i+)num1

5、 = num1 + 0;/按位與運(yùn)算while(1)pre = num1.left(l2);for (i = 0;i l2;i+)if (pre.mid(i,1) = num2.mid(i,1)temp = temp + 0;if (pre.mid(i,1) != num2.mid(i,1)temp = temp + 1;num1.delete(0,l2);/刪除被除數(shù)前的數(shù)據(jù)num1 = temp + num1;/將結(jié)果加在被除數(shù)前/去除被除數(shù)前邊的為0位while(num1.left(1) = 0)num1.delete(0,1);l1 = num1.getlength();/獲取被除數(shù)長

6、度if(l1 enablewindow(false);getdlgitem(idc_edit_num2)-enablewindow(false);updatedata(false);2. 檢測接收數(shù)據(jù)函數(shù)如下:void cmy01dlg:onbtncheck() / todo: add your control notification handler code hereupdatedata(true);cstring num2 = m_num2;/除數(shù)cstring rcv = m_rcv;cstring r;/余數(shù)cstring temp = ;cstring pre;int l1,l2;

7、 /被除數(shù),除數(shù)的長度l2 = num2.getlength();/獲取除數(shù)長度/按位與運(yùn)算while(1)pre = rcv.left(l2);for (int i = 0;i l2;i+)if (pre.mid(i,1) = num2.mid(i,1)temp = temp + 0;if (pre.mid(i,1) != num2.mid(i,1)temp = temp + 1;rcv.delete(0,l2);/刪除被除數(shù)前的數(shù)據(jù)rcv = temp + rcv;/將結(jié)果加在被除數(shù)前/去除被除數(shù)前邊的為0位while(rcv.left(1) = 0)rcv.delete(0,1);l1

8、= rcv.getlength();/獲取被除數(shù)長度if(l1 = l2-1)break;elsetemp = ;r = rcv;/余數(shù)/余數(shù)去0while(r.left(1) = 0)r.delete(0,1);if (r = )messagebox(接收序列正確!,);elsemessagebox(接收序列錯誤!,);題目二:p126:圖4-16:加載rip協(xié)議 ,得到r1,r2,r3的路由表。題目介紹:路由信息協(xié)議(rip)是一種基于距離向量的路由選擇協(xié)議,要求每一個路由器都要維護(hù)從它自己到其他每一個目的網(wǎng)絡(luò)的距離記錄。每一個路由器僅和相鄰的路由器交換信息;路由器交換的信息是當(dāng)前路由器所

9、知道的全部信息,即自己的路由表;路由器按照固定的時間間隔交換路由信息,當(dāng)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)發(fā)生變化時,路由器也能及時向相鄰路由器通告拓?fù)渥兓蟮穆酚尚畔?。其中交換信息是按照距離向量算法進(jìn)行更新信息。算法說明:本程序的核心算法是距離向量算法,算法的步驟如下所示:用定時器控制,每個一定時間,首先對地址為x的相鄰路由器發(fā)來的rip報(bào)文,先將下一跳字段中的地址都改為x,并把所有的距離字段的值加1。然后對修改后的rip報(bào)文的每一個項(xiàng)目,查詢本機(jī)的路由表,若本機(jī)路由表中沒有網(wǎng)絡(luò)n,則把該項(xiàng)目添加到本機(jī)路由表中,否則,若下一跳地址是x,則用收到的項(xiàng)目替換原來的項(xiàng)目,若下一跳地址不是x,收到項(xiàng)目中的距離小于原距離時

10、進(jìn)行更新,除以上情況,什么都不做。算法流程圖如下所示:算法開始獲取相鄰路由器的路由表,處理信息原路由表中無網(wǎng)絡(luò)ny把該項(xiàng)添加到路由表中n下一跳地址是xy替換原路由表中的項(xiàng)目收到d小于原距離距離nynrip報(bào)文循環(huán)完畢yn算法結(jié)束程序流程圖:程序開始獲取并修改相鄰路由器的路由表每個固定時間更新按照上述算法更新路由表路由表是否更新完畢ny程序結(jié)束運(yùn)行截圖:初始化:更新路由表:主要代碼實(shí)現(xiàn):1. 設(shè)定定時器模塊void cmy02dlg:onbtnupdate() settimer(1,5000,null);settimer(2,7000,null);settimer(3,9000,null);2.

11、 定時器消息響應(yīng)函數(shù)模塊void cmy02dlg:ontimer(uint nidevent) updatedata(true);int i,j,k,sign;cstring temp53;if (nidevent = 1)/初始化臨時數(shù)組for (i = 0;i 5;i+)for(j = 0;j 3;j+)tempij = ;/r1學(xué)習(xí)r2的路由表for(i = 0;i m_r2.getitemcount();i+)tempi0 = m_r2.getitemtext(i,0);tempi1 = m_r2.getitemtext(i,1);tempi2 = m_r2.getitemtext(

12、i,2);i = 0;while(tempi1 != )k = atoi(tempi1.getbuffer(0);k+;/距離加1tempi1.format(%d,k);tempi2 = r2;/下一跳改為r2i+;/根據(jù)r2的路由表更新r1的路由表for (j = 0;j 5;j+)if (tempj0 = )break;/防止多余插入sign = 0;for (i = 0;i m_r1.getitemcount();i+)/若路由表中有該網(wǎng)絡(luò)if (m_r1.getitemtext(i,0) = tempj0)sign = 1;/表示有該網(wǎng)絡(luò)if (m_r1.getitemtext(i,2

13、) = tempj2)/若下一跳是x,則替換m_r1.setitemtext(i,1,tempj1);else/下一跳地址不是xif (atoi(tempj1.getbuffer(0) atoi(m_r1.getitemtext(i,1).getbuffer(0)/若新距離小于原距離,則更新距離和下一跳地址m_r1.setitemtext(i,1,tempj1);m_r1.setitemtext(i,2,tempj2);if (sign = 0)lv_item ivitem;int nindex = m_r1.getitemcount();ivitem.mask = lvif_text;ivi

14、tem.iitem = nindex;ivitem.isubitem = 0;ivitem.psztext =;m_r1.insertitem(&ivitem);m_r1.setitemtext(nindex,0,tempj0);m_r1.setitemtext(nindex,1,tempj1);m_r1.setitemtext(nindex,2,tempj2);if (nidevent = 2)for (i = 0;i 5;i+)for(j = 0;j 3;j+)tempij = ;for(i = 0;i m_r1.getitemcount();i+)tempi0 = m_r1.getite

15、mtext(i,0);tempi1 = m_r1.getitemtext(i,1);tempi2 = m_r1.getitemtext(i,2);i = 0;while(tempi1 != )k = atoi(tempi1.getbuffer(0);k+;/距離加1tempi1.format(%d,k);tempi2 = r1;/下一跳改為r1i+;for (j = 0;j 5;j+)if (tempj0 = )break;/防止多余插入sign = 0;for (i = 0;i m_r2.getitemcount();i+)if (m_r2.getitemtext(i,0) = tempj0

16、)sign = 1;/表示有該網(wǎng)絡(luò)if (m_r2.getitemtext(i,2) = tempj2)/若下一跳地址是x,則替換m_r2.setitemtext(i,1,tempj1);else/下一跳地址不是xif (atoi(tempj1.getbuffer(0) atoi(m_r2.getitemtext(i,1).getbuffer(0)m_r2.setitemtext(i,1,tempj1);m_r2.setitemtext(i,2,tempj2);if (sign = 0)lv_item ivitem;int nindex = m_r2.getitemcount();ivitem

17、.mask = lvif_text;ivitem.iitem = nindex;ivitem.isubitem = 0;ivitem.psztext =;m_r2.insertitem(&ivitem);m_r2.setitemtext(nindex,0,tempj0);m_r2.setitemtext(nindex,1,tempj1);m_r2.setitemtext(nindex,2,tempj2);/r2學(xué)習(xí)r3的路由表for (i = 0;i 5;i+)for(j = 0;j 3;j+)tempij = ;for(i = 0;i m_r3.getitemcount();i+)tempi

18、0 = m_r3.getitemtext(i,0);tempi1 = m_r3.getitemtext(i,1);tempi2 = m_r3.getitemtext(i,2);i = 0;while(tempi1 != )k = atoi(tempi1.getbuffer(0);k+;/距離加1tempi1.format(%d,k);tempi2 = r3;/下一跳改為r1i+;for (j = 0;j 5;j+)if (tempj0 = )break;/防止多余插入sign = 0;for (i = 0;i m_r2.getitemcount();i+)if (m_r2.getitemtex

19、t(i,0) = tempj0)sign = 1;/表示有該網(wǎng)絡(luò)if (m_r2.getitemtext(i,2) = tempj2)/若下一跳地址是x,則替換m_r2.setitemtext(i,1,tempj1);else/下一跳地址不是xif (atoi(tempj1.getbuffer(0) atoi(m_r2.getitemtext(i,1).getbuffer(0)m_r2.setitemtext(i,1,tempj1);m_r2.setitemtext(i,2,tempj2);if (sign = 0)lv_item ivitem;int nindex = m_r2.getite

20、mcount();ivitem.mask = lvif_text;ivitem.iitem = nindex;ivitem.isubitem = 0;ivitem.psztext =;m_r2.insertitem(&ivitem);m_r2.setitemtext(nindex,0,tempj0);m_r2.setitemtext(nindex,1,tempj1);m_r2.setitemtext(nindex,2,tempj2);if (nidevent = 3)/r3學(xué)習(xí)r2的路由表for (i = 0;i 5;i+)for(j = 0;j 3;j+)tempij = ;for(i =

21、0;i m_r2.getitemcount();i+)tempi0 = m_r2.getitemtext(i,0);tempi1 = m_r2.getitemtext(i,1);tempi2 = m_r2.getitemtext(i,2);i = 0;while(tempi1 != )k = atoi(tempi1.getbuffer(0);k+;/距離加1tempi1.format(%d,k);tempi2 = r2;/下一跳改為r2i+;for (j = 0;j 5;j+)if (tempj0 = )break;/防止多余插入sign = 0;for (i = 0;i m_r3.getit

22、emcount();i+)if (m_r3.getitemtext(i,0) = tempj0)sign = 1;/表示有該網(wǎng)絡(luò)if (m_r3.getitemtext(i,2) = tempj2)/若下一跳是x,則替換m_r3.setitemtext(i,1,tempj1);else/下一跳地址不是xif (atoi(tempj1.getbuffer(0) atoi(m_r3.getitemtext(i,1).getbuffer(0)m_r3.setitemtext(i,1,tempj1);m_r3.setitemtext(i,2,tempj2);if (sign = 0)lv_item i

23、vitem;int nindex = m_r3.getitemcount();ivitem.mask = lvif_text;ivitem.iitem = nindex;ivitem.isubitem = 0;ivitem.psztext =;m_r3.insertitem(&ivitem);m_r3.setitemtext(nindex,0,tempj0);m_r3.setitemtext(nindex,1,tempj1);m_r3.setitemtext(nindex,2,tempj2);settimer(1,5000,null);updatedata(false);/取消定時器if (m

24、_r1.getitemcount() = 4 & m_r2.getitemcount() = 4 & m_r3.getitemcount() = 4)killtimer(1);killtimer(2);killtimer(3);messagebox( 路由表已收斂!,);cdialog:ontimer(nidevent);題目三:模擬p198滑動窗口的實(shí)現(xiàn)過程,要求接收端b有正常接受報(bào)文時,確認(rèn)正確。不能收到所需要的報(bào)文時,重復(fù)發(fā)送確認(rèn)報(bào)文。a端在連續(xù)收到3個重復(fù)確認(rèn)時,啟動重發(fā)機(jī)制。題目介紹:假定數(shù)據(jù)傳輸是按照一個方向進(jìn)行傳輸?shù)?,即a發(fā)送數(shù)據(jù),b給出確認(rèn),tcp的滑動窗口是以字節(jié)為單位的。發(fā)

25、送窗口表示:在沒有收到b確認(rèn)的情況下,a可以連續(xù)吧數(shù)據(jù)都發(fā)送出去,凡是已經(jīng)發(fā)送的數(shù)據(jù),在收到確認(rèn)之前必須暫時保留,以便超時重傳使用。發(fā)送窗口的后沿的后邊部分表示發(fā)送已經(jīng)收到了確認(rèn),這些數(shù)據(jù)不需要在保留了,發(fā)送窗口前沿的前面部分表示不允許發(fā)送的,因?yàn)榻邮辗經(jīng)]有為這部分?jǐn)?shù)據(jù)保留臨時存放的緩存空間。發(fā)送窗口的大小由窗口的前沿和后沿共同決定。發(fā)送窗口的變化有兩種可能,即不動(沒有收到新的確認(rèn))和前移(收到新的確認(rèn)),發(fā)送窗口的后沿不可能向后移動,因?yàn)椴荒艹蜂N已經(jīng)收到的確認(rèn),發(fā)送窗口的前沿通常是不斷向前移動,但是也有可能不動,這兩種情況一是沒有收到新的確認(rèn),對方的通知窗口大小也不變,二是收到了新的確認(rèn)但

26、是對方的窗口縮小了,使得發(fā)送的窗口前沿正好不動。發(fā)送窗口的前沿也有可能向后收縮,但是tcp的標(biāo)準(zhǔn)強(qiáng)烈不贊成這么做。算法說明:假設(shè)a為發(fā)送端,b為接收端,用鏈表保存發(fā)送但還沒有接收的數(shù)據(jù),a發(fā)送的數(shù)據(jù)先轉(zhuǎn)存到鏈表中,每次發(fā)送插入到鏈表的末尾。b每次接收一個鏈表最前端的數(shù)據(jù),接收后從鏈表首部刪除該數(shù)據(jù)。分別用兩個定時器控制發(fā)送和接收,發(fā)送和接收開始后一段時間,人為模擬一個傳輸錯誤,即刪去鏈表最前端的數(shù)據(jù)。在界面上利用listcontrol控件顯示發(fā)送的數(shù)據(jù)和接收的數(shù)據(jù),并且顯示日志,控件顯示的內(nèi)容就是滑動窗口的位置。發(fā)送端每發(fā)送一個數(shù)據(jù)就在日志中顯示“發(fā)送xx”,接收端每次接受一個數(shù)據(jù)就在日志中顯

27、示“接收xx,ack xx”,丟失數(shù)據(jù)以“xx 已經(jīng)丟失”的形式顯示在日志中。接收端每次返回的ack值會存儲在一個數(shù)組對應(yīng)的元素中(初始值為0,每次ack會讓對應(yīng)位置自加一次),發(fā)送端每次發(fā)送時會查詢這個數(shù)組,若數(shù)組中有某個元素的值大于等于3(即連續(xù)三次沒收到),則會重新發(fā)送這個數(shù)據(jù)。算法的流程圖如下圖所示:發(fā)送方發(fā)送數(shù)據(jù)接收方接收數(shù)據(jù)發(fā)送方檢查ack數(shù)組接收方接收數(shù)據(jù),并傳回相應(yīng)ack值有無值大于等于3n發(fā)送方按照正常順序發(fā)送數(shù)據(jù)y發(fā)送丟失的數(shù)據(jù)程序流程圖:程序開始初始化控件開始發(fā)送接收數(shù)據(jù)接收端檢測ack數(shù)組按正常次序發(fā)送數(shù)據(jù)有無超過3次ack發(fā)送丟失數(shù)據(jù)yn是否發(fā)送完成ny程序結(jié)束運(yùn)行截

28、圖: 主要代碼實(shí)現(xiàn):1. 計(jì)時器響應(yīng)函數(shù):void cmy03dlg:ontimer(uint nidevent) int i,j,k;slnode *p,*q;cstring temp;cstring temp2;lv_item ivitem;int nindex;if (nidevent = 1)int sign = 0;for (i = 0;i = 3)sign = 1;break;if (sign = 1)/表示收到三次確認(rèn) /*發(fā)送數(shù)據(jù)*/m_sendi1 = 1;/發(fā)送數(shù)據(jù)/添加到隊(duì)列中p = head;while(p-next != null)p = p-next;q = (slnode *)malloc(sizeof(slnode);q-date = m_sendi0;q-next = p-next;p-next = q;/修改日志nindex = m_loglist.getitemcount();ivitem.mask = lvif_text;ivitem.iitem = nindex;ivitem.isubitem = 0;ivitem.psztext =;temp.format(%d,m_sendi0);m_ackm_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論