版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目錄</b></p><p> CRC碼的實(shí)現(xiàn)與驗(yàn)證</p><p> 設(shè)計(jì)目的……………………………………………………………………………………………………2</p><p> 設(shè)計(jì)思想……………………………………………………………………………………………………2</p><p>
2、概要設(shè)計(jì)……………………………………………………………………………………………………3</p><p> 詳細(xì)設(shè)計(jì)……………………………………………………………………………………………………3</p><p> 程序主要代碼……………………………………………………………………………………………4</p><p> 運(yùn)行結(jié)果…………………………………………………
3、…………………………………………………5</p><p> 7、實(shí)驗(yàn)總結(jié)…………………………………………………………………………………………………….6</p><p> RIP協(xié)議路由表的實(shí)現(xiàn)</p><p> 設(shè)計(jì)目的…………………………………………………………………………………………………..7</p><p> 設(shè)計(jì)思想………
4、…………………………………………………………………………………………..7</p><p> 概要設(shè)計(jì)…………………………………………………………………………………………………..8</p><p> 詳細(xì)設(shè)計(jì)…………………………………………………………………………………………………..8</p><p> 程序主要代碼……………………………………………………
5、……………………………………..9</p><p> 運(yùn)行結(jié)果…………………………………………………………………………………………………14</p><p> 實(shí)驗(yàn)總結(jié)…………………………………………………………………………………………………15</p><p> 模擬滑動(dòng)窗口報(bào)文發(fā)送與接收</p><p> 設(shè)計(jì)目的……………………
6、……………………………………………………………………………15</p><p> 設(shè)計(jì)思想…………………………………………………………………………………………………15</p><p> 概要設(shè)計(jì)…………………………………………………………………………………………………16</p><p> 詳細(xì)設(shè)計(jì)………………………………………………………………………………
7、…………………17</p><p> 程序主要代碼…………………………………………………………………………………………18</p><p> 運(yùn)行結(jié)果………………………………………………………………………………………………..20</p><p> 實(shí)驗(yàn)總結(jié)………………………………………………………………………………………………..22</p>
8、<p> CRC碼的實(shí)現(xiàn)與驗(yàn)證</p><p><b> 設(shè)計(jì)目的</b></p><p> 了解循環(huán)冗余檢驗(yàn)的原理</p><p> 模擬實(shí)現(xiàn)FCS序列的生成</p><p> 模擬實(shí)現(xiàn)CRC碼的生成</p><p> 查看CRC碼檢驗(yàn)的正確性</p><
9、;p><b> 設(shè)計(jì)思想</b></p><p> 循環(huán)冗余檢驗(yàn)的原理:在發(fā)送端,先把數(shù)據(jù)劃分為組,假定每組k個(gè)比特?,F(xiàn)假定待傳送的數(shù)據(jù)M=101001(k=6)。CRC運(yùn)算就是在數(shù)據(jù)M的后面添加供差錯(cuò)檢測(cè)用的n位冗余碼,然后構(gòu)成一個(gè)幀發(fā)送出去,一共發(fā)送(k+n)位。在所要發(fā)送的數(shù)據(jù)后面增加n位冗余碼,雖然增大了數(shù)據(jù)傳輸?shù)拈_銷,但卻可以進(jìn)行差錯(cuò)檢測(cè)。當(dāng)傳輸可能出現(xiàn)差錯(cuò)時(shí),付出這種代
10、價(jià)往往是很值得的。 </p><p> 從上述原理可以看出,實(shí)現(xiàn)這個(gè)過程需要用到M,n兩個(gè)數(shù)據(jù),這兩個(gè)數(shù)據(jù)都是以串的形式出現(xiàn)的,所以可以用兩個(gè)數(shù)組進(jìn)行模擬。</p><p> n位冗余碼可以用以下方法得出。用二進(jìn)制的模2運(yùn)算進(jìn)行2n 乘M的運(yùn)算,這相當(dāng)于在M后面添加n個(gè)0.得到的(k+n_)位的數(shù)除以收發(fā)雙方事先商定的長(zhǎng)度為(n+1)位的除數(shù)P,得出商是Q而余數(shù)是R(n位,比P少
11、一位)。假定除數(shù)P=1101(即n=3)。經(jīng)模2除法運(yùn)算后的結(jié)果是:商Q=110101(這個(gè)商并沒有什么用處),而余數(shù)R=001。這個(gè)余數(shù)R就作為冗余碼拼接在數(shù)據(jù)M的后面發(fā)送出去。這種為了進(jìn)行檢錯(cuò)而添加的冗余碼常稱為幀檢驗(yàn)序列FCS。因此加上FCS后發(fā)送的幀的是101001001。</p><p> 進(jìn)行檢驗(yàn)的時(shí)候,把收到的每一個(gè)幀都除以同樣的除數(shù)P(模2運(yùn)算),然后檢查得到的余數(shù)R。</p>&
12、lt;p><b> 概要設(shè)計(jì)</b></p><p> 存儲(chǔ)結(jié)構(gòu):三個(gè)數(shù)組,分別用來存儲(chǔ)被除數(shù)、除數(shù)和余數(shù)。</p><p> 運(yùn)算過程:首先,將被除數(shù)的后面添加n位0。然后每次用被除數(shù)的n+1位和除數(shù)相異或,將結(jié)果的后三位放在余數(shù)的數(shù)組里,余數(shù)的最后一位直接繼承被除數(shù)沒有參與異或的位數(shù)的第一位數(shù)字。重復(fù)上述過程,直到被除數(shù)每一位都參與了異或過程。將最后剩
13、在余數(shù)數(shù)組里的余數(shù)作為FCS碼添加在原數(shù)據(jù)的后面,這就是可以用于循環(huán)冗余檢驗(yàn)的數(shù)據(jù)了。</p><p> 檢驗(yàn)過程:將添加了FCS碼的數(shù)據(jù)和除數(shù)P相異或,如果余數(shù)是0,則數(shù)據(jù)是正確的,如果余數(shù)不為0,則數(shù)據(jù)出錯(cuò)。</p><p><b> 詳細(xì)設(shè)計(jì)</b></p><p> 定義三個(gè)數(shù)組:M[k+n] , P[n+1],temp[n]。分
14、別用來存儲(chǔ)被除數(shù)、除數(shù)和余數(shù)。</p><p><b> 運(yùn)算過程:</b></p><p><b> M的后n位置0;</b></p><p> For( i = 0 -> k )</p><p><b> {</b></p><p>
15、 M的前n+1位和P異或,結(jié)果的后三位放入余數(shù)temp;</p><p> Temp最后一位直接繼承M中沒有參加異或的第一位;</p><p><b> 將M向后移一位。</b></p><p><b> }</b></p><p> 把M的后n位改成余數(shù);</p><
16、p><b> 得到CRC碼;</b></p><p><b> 檢驗(yàn)過程:</b></p><p> 用CRC碼與P相異或;</p><p> 如果結(jié)果為0,則檢驗(yàn)正確;</p><p><b> 否則,檢驗(yàn)出錯(cuò)。</b></p><p>
17、;<b> 程序主要代碼</b></p><p><b> int j,n;</b></p><p> int *q=new int [m]; //除數(shù)</p><p> int *p=new int [i]; //被除數(shù)</p><p> int *temp =
18、 new int [m] ; //中間臨時(shí)量,也是余數(shù)</p><p> CString b;</p><p> for(j = 0 ; j < i ; j++)</p><p><b> {</b></p><p> b=m_Crc.GetAt(j);</p><p>
19、 p[j]=atoi(b);</p><p><b> }</b></p><p> for( n = 0 ; n < m ; n++)</p><p><b> {</b></p><p> b=m_P.GetAt(n);</p><p> q[n]=at
20、oi(b);</p><p> temp[n]=p[n];</p><p><b> }</b></p><p> for(j = 0 ; j < i-m+1 ; j ++) //此for循環(huán)求出余數(shù)</p><p><b> {</b></p><p>
21、; if(temp[0]==0)</p><p><b> {</b></p><p> for(n=0;n<m-1;n++)</p><p> temp[n]=temp[n+1];</p><p> temp[n]=p[m+j];</p><p><b> }<
22、/b></p><p><b> else </b></p><p><b> {</b></p><p> for(n=0;n<m-1;n++)</p><p> temp[n]=(temp[n+1]!=q[n+1]);</p><p> temp[n
23、]=p[m+j];}</p><p><b> }</b></p><p> for(n=0;n<m-1;n++) //檢驗(yàn),如果余數(shù)中有不是1的,則結(jié)果為錯(cuò)</p><p> if(temp[n]!=0)break;</p><p> if(n==m-1)m_Result="yes&
24、quot;;</p><p> else m_Result="no";</p><p><b> 運(yùn)行結(jié)果示意:</b></p><p> 本程序采用了MFC來編寫,結(jié)果如下所示:</p><p><b> 正確結(jié)果驗(yàn)</b></p><p>&l
25、t;b> 錯(cuò)誤結(jié)果驗(yàn)證:</b></p><p><b> 實(shí)驗(yàn)總結(jié)</b></p><p> 循環(huán)冗余檢驗(yàn)的原理較為簡(jiǎn)單,實(shí)現(xiàn)起來也比較容易,但是并不能糾正錯(cuò)誤,也就是說發(fā)現(xiàn)錯(cuò)誤的話,只能讓數(shù)據(jù)再次發(fā)送,但對(duì)于單條數(shù)據(jù)量不大的數(shù)據(jù)傳輸,循環(huán)冗余檢驗(yàn)還是比較理想的。</p><p> RIP協(xié)議路由表的實(shí)現(xiàn)</p
26、><p><b> 設(shè)計(jì)目的</b></p><p> 理解RIP協(xié)議的工作原理;</p><p> 掌握RIP的收斂實(shí)現(xiàn);</p><p> 模擬RIP路由協(xié)議的工作過程。</p><p><b> 設(shè)計(jì)思想</b></p><p> RIP
27、協(xié)議:要求網(wǎng)絡(luò)中的每一個(gè)路由器都要維護(hù)從它自己到其他每一個(gè)目的網(wǎng)絡(luò)的距離記錄(因此,這是一組距離,即是“距離向量”)。</p><p> “距離”:從一路由器到直接連接的網(wǎng)絡(luò)的距離定義為1。從一路由器到非直接連接的網(wǎng)絡(luò)的距離定義為所經(jīng)過的路由器數(shù)加1.“加1”是因?yàn)榈竭_(dá)目的網(wǎng)絡(luò)后就進(jìn)行直接交付,而到直接連接的網(wǎng)絡(luò)的距離已經(jīng)定義為1.</p><p><b> 距離向量算法:&
28、lt;/b></p><p> 對(duì)每一個(gè)相鄰路由器發(fā)送過來的RIP報(bào)文,進(jìn)行以下步驟:</p><p> 對(duì)地址為X的相鄰路由器發(fā)來的RIP報(bào)文,先修改此報(bào)文中的所有項(xiàng)目:把“下一跳”字段中的地址都改為X,并把所有的“距離”字段的值加1.每一個(gè)項(xiàng)目都有三個(gè)關(guān)鍵數(shù)據(jù),即:到目的網(wǎng)絡(luò)N,距離是d,下一跳路由器是X。</p><p> 對(duì)修改后的RIP報(bào)文中的
29、每一個(gè)項(xiàng)目,進(jìn)行以下步驟:</p><p> 若原來的路由表中沒有目的網(wǎng)絡(luò)N,則把該項(xiàng)目添加到路由表中。</p><p> 否則若下一跳路由器地址是X,則把收到的項(xiàng)目替換原路由表中的項(xiàng)目。</p><p> 否則若收到的項(xiàng)目中的距離d小于路由表中的距離,則進(jìn)行更新,否則什么也不做。</p><p> 若3分鐘還沒有收到相鄰路由器的更新
30、路由表,則把此相鄰路由器記為不可達(dá)的路由器,即把距離置為16.</p><p><b> 返回。</b></p><p><b> 概要設(shè)計(jì)</b></p><p><b> 路由表存儲(chǔ):</b></p><p> 設(shè)計(jì)一個(gè)結(jié)構(gòu)體來存儲(chǔ),其中包括數(shù)據(jù):目的網(wǎng)絡(luò)、距離和下
31、一跳。</p><p><b> 初始化:</b></p><p> 設(shè)置三個(gè)路由器R1、R2、R3,分別連接網(wǎng)絡(luò)1、網(wǎng)絡(luò)2,網(wǎng)絡(luò)2、網(wǎng)絡(luò)3,網(wǎng)絡(luò)3、網(wǎng)絡(luò)4。這些網(wǎng)絡(luò)在路由表中初始化時(shí)產(chǎn)生,下一跳中均為直接交付,距離為1。</p><p><b> 更新:</b></p><p> 每次由用
32、戶選擇更新哪一個(gè)路由器中的路由表,更新的時(shí)候根據(jù)相鄰的路由器上的路由表進(jìn)行更新。</p><p><b> 輸出:</b></p><p> 采用MFC界面,將路由表信息實(shí)時(shí)更新輸出。</p><p><b> 詳細(xì)設(shè)計(jì)</b></p><p><b> 存儲(chǔ):</b>
33、</p><p> 路由表信息:因?yàn)椴捎昧薓FC輸出,所以數(shù)據(jù)項(xiàng)都定義為CString類型</p><p> typedef struct RouteNode </p><p><b> { </b></p><p> CString Route;//路由ip </p><p> CSt
34、ring Netip;//子網(wǎng)掩碼</p><p> CString port;//數(shù)據(jù)包送出的接口號(hào) </p><p> CString Dist;</p><p> struct RouteNode * next;//下一項(xiàng)路由記錄</p><p> }RouterTableList; </p><p>
35、 初始化:將與路由器直接連接的網(wǎng)絡(luò)信息添加到相應(yīng)的路由表中</p><p> R1: N1 1 直接交付</p><p> N2 1 直接交付</p><p> R2: N2 1 直接交付</p><p> N3 1 直接交付</p><p> R3 : N3
36、 1 直接交付</p><p> N4 1 直接交付</p><p><b> 更新:</b></p><p> R1根據(jù)R2的路由表進(jìn)行更新,R2根據(jù)R1和R3的路由表進(jìn)行更新,R3根據(jù)R2的路由表進(jìn)行更新。按照距離向量算法處理。</p><p><b> 程序主要代碼</
37、b></p><p><b> 初始化:</b></p><p> void CRIPDialog::OnBnClickedButtonInitial()</p><p><b> {</b></p><p> if(Rt1->next!=NULL){MessageBox(&qu
38、ot;已經(jīng)初始化過了");return;}</p><p> ListInsert(Rt1,"R1","10.0.0.0","0","1");</p><p> ListInsert(Rt1,"R1","20.0.0.0","1",&qu
39、ot;1");</p><p> ListInsert(Rt2,"R2","20.0.0.0","0","1");</p><p> ListInsert(Rt2,"R2","30.0.0.0","1","1");&l
40、t;/p><p> ListInsert(Rt3,"R3","30.0.0.0","0","1");</p><p> ListInsert(Rt3,"R3","40.0.0.0","1","1");</p><
41、p> ListAll(m_Route);</p><p><b> }</b></p><p><b> 更新:</b></p><p> void CRIPDialog::OnBnClickedButtonUpdate()</p><p><b> {</b>
42、</p><p> if(m_Route=="R1")</p><p> Find(Rt1,Rt2);</p><p> else if(m_Route=="R2")</p><p><b> {</b></p><p> Find(Rt2,Rt1
43、);</p><p> Find(Rt2,Rt3);</p><p><b> }</b></p><p> else if(m_Route=="R3")Find(Rt3,Rt2);</p><p> else {MessageBox("沒有這個(gè)路由器");return;}
44、</p><p> ListAll(m_Route);</p><p><b> }</b></p><p><b> 輔助函數(shù):</b></p><p> /*根據(jù)fron路由表中的信息更新head中的路由表*/</p><p> void CRIPDialog:
45、:Find(RouterTableList *head,RouterTableList *fron)</p><p><b> {</b></p><p> RouterTableList *q;</p><p> CString mRoute;</p><p> q=fron->next;</p&g
46、t;<p> mRoute=q->next->Route;</p><p> while(q!=NULL)</p><p><b> { </b></p><p> RouterTableList *p;</p><p> p=head->next;</p><
47、;p> while(p!=NULL)</p><p><b> {</b></p><p> if(q->Netip==p->Netip)break;</p><p> p=p->next;</p><p><b> }</b></p><p&g
48、t; if(p==NULL)</p><p><b> {</b></p><p> int a=atoi(q->Dist);</p><p><b> a++;</b></p><p> char c[2];</p><p> itoa(a,c,10);&
49、lt;/p><p> ListInsert(head,mRoute,q->Netip,q->port,c);</p><p><b> }</b></p><p> q=q->next;</p><p><b> }</b></p><p><b&
50、gt; }</b></p><p><b> 插入函數(shù):</b></p><p> void CRIPDialog::ListInsert(RouterTableList *head,CString Route,CString Netip,CString port, CString Dist)</p><p><b>
51、; {</b></p><p> RouterTableList *p,*q;</p><p><b> p=head;</b></p><p> while(p->next!=NULL)</p><p><b> {</b></p><p>
52、p=p->next;</p><p><b> }</b></p><p> //q=(RouterTableList *) malloc (sizeof (RouterTableList));</p><p> q=new RouterTableList [sizeof(RouterTableList)];</p>
53、<p> q->Dist=Dist;</p><p> q->Route=Route;</p><p> q->Netip=Netip;</p><p> q->port=port;</p><p> q->next=p->next;</p><p> p-&
54、gt;next=q;</p><p><b> }</b></p><p><b> 輸出函數(shù):</b></p><p> void CRIPDialog::ListAll(CString R)</p><p><b> {</b></p><p&g
55、t; RouterTableList *Rt;</p><p> if(R=="R1") Rt=Rt1->next;</p><p> else if(R=="R2") Rt=Rt2->next;</p><p> else if(R=="R3") Rt=Rt3->next;&
56、lt;/p><p> else return;</p><p> m_ListRoute.DeleteAllItems();</p><p> int nIndex=0;</p><p> while(Rt!=NULL)</p><p><b> {</b></p><p
57、> LV_ITEM lvItem;</p><p> lvItem.mask=LVIF_TEXT;</p><p> lvItem.iItem=nIndex;</p><p> lvItem.iSubItem=0;</p><p> lvItem.pszText="";</p><p&g
58、t; m_ListRoute.InsertItem(&lvItem);</p><p> if(m_Route==Rt->Route)</p><p><b> { </b></p><p> m_ListRoute.SetItemText(nIndex,0,Rt->Netip);</p><p&
59、gt; m_ListRoute.SetItemText(nIndex,2,"直¡À接¨®交?付?");</p><p> m_ListRoute.SetItemText(nIndex,1,Rt->Dist);</p><p><b> }</b></p><p><b
60、> else</b></p><p><b> {</b></p><p> m_ListRoute.SetItemText(nIndex,0,Rt->Netip);</p><p> m_ListRoute.SetItemText(nIndex,2,Rt->Route);</p><p
61、> m_ListRoute.SetItemText(nIndex,1,Rt->Dist);</p><p><b> }</b></p><p> Rt=Rt->next;</p><p><b> nIndex++;</b></p><p><b> }<
62、;/b></p><p><b> }</b></p><p><b> 運(yùn)行結(jié)果</b></p><p><b> 初始化:</b></p><p><b> 更新:</b></p><p> 本人先更新R2路由表
63、,再更新R1路由表,最后更新R3路由表,之后路由表再進(jìn)行更新時(shí),就無新項(xiàng)目了。</p><p><b> 實(shí)驗(yàn)總結(jié)</b></p><p> 本次的模擬較為簡(jiǎn)單,實(shí)現(xiàn)了默認(rèn)連接為R1—R2—R3的路由器的路由表的更新,網(wǎng)絡(luò)連接也較為簡(jiǎn)單,只有N1、N2、N3和N4網(wǎng)絡(luò)。RIP報(bào)文也是默認(rèn)的連接狀態(tài)產(chǎn)生的,并沒有產(chǎn)生新的不同于默認(rèn)連接的路由信息。</p>
64、<p> 雖然本次模擬實(shí)現(xiàn)內(nèi)容較為簡(jiǎn)單,但也有了RIP協(xié)議實(shí)現(xiàn)過程,基本掌握了RIP協(xié)議的工作原理,明白距離向量算法的要點(diǎn)。</p><p> 模擬滑動(dòng)窗口報(bào)文發(fā)送與接收</p><p><b> 設(shè)計(jì)目的</b></p><p> 掌握TCP可靠傳輸?shù)膶?shí)現(xiàn)過程;</p><p> 理解滑動(dòng)窗口的
65、發(fā)送、重傳、接收和確認(rèn)機(jī)制;</p><p> 模擬實(shí)現(xiàn)滑動(dòng)窗口的數(shù)據(jù)的傳送過程。</p><p><b> 設(shè)計(jì)思想</b></p><p> 首先假定數(shù)據(jù)在一個(gè)方向上進(jìn)行,即A發(fā)送數(shù)據(jù),B給出確認(rèn)。</p><p> 為A定義一個(gè)發(fā)送窗口,這個(gè)窗口內(nèi)的數(shù)據(jù)為可以發(fā)送的數(shù)據(jù),窗口內(nèi)可以分為兩個(gè)部分,一部分為已發(fā)
66、送但未收到確認(rèn),一部分為還未發(fā)送。當(dāng)有數(shù)據(jù)被確認(rèn)時(shí),就可以將窗口整個(gè)移動(dòng)已經(jīng)確認(rèn)了的數(shù)據(jù)位數(shù)。</p><p> 為B定義一個(gè)接收窗口,這個(gè)窗口內(nèi)可以有數(shù)據(jù),也可以沒有數(shù)據(jù),有的數(shù)據(jù)為A發(fā)送過來在可接收范圍內(nèi)的數(shù)據(jù)但未確認(rèn)的數(shù)據(jù)。</p><p> 確認(rèn)和重傳機(jī)制:當(dāng)B內(nèi)有數(shù)據(jù),而且第一位數(shù)據(jù)是期待接收的數(shù)據(jù),則將第一位的數(shù)據(jù)回復(fù)確認(rèn),并移除接收窗口,如果不是期待接收的數(shù)據(jù),則讓A進(jìn)行
67、重傳。當(dāng)A收到確認(rèn)后,將確認(rèn)的數(shù)據(jù)移除,并將A窗口前移。若收到重傳命令,則發(fā)送窗口不進(jìn)行前移,但是可以將窗口內(nèi)允許發(fā)送但沒有發(fā)送的數(shù)據(jù)添加到發(fā)送序列一起進(jìn)行重傳。</p><p> 回復(fù)丟失處理:如果長(zhǎng)時(shí)間沒有收到B的回復(fù),則應(yīng)該理解為發(fā)送失敗或者B的回復(fù)失敗,應(yīng)該選擇重傳。在程序中可以利用隨機(jī)概率事件來進(jìn)行模擬,即當(dāng)回復(fù)失敗或者發(fā)送失敗的事件發(fā)生,直接通知A進(jìn)行重傳,而不用進(jìn)行時(shí)間等待判斷。</p>
68、;<p><b> 概要設(shè)計(jì)</b></p><p> 存儲(chǔ)結(jié)構(gòu):兩個(gè)窗口都可以設(shè)計(jì)為循環(huán)隊(duì)列。</p><p> 發(fā)送窗口操作:發(fā)送窗口有取數(shù)據(jù)和刪除數(shù)據(jù)的操作,因?yàn)椴捎醚h(huán)隊(duì)列,所以窗口的前移可以在刪除數(shù)據(jù)的時(shí)候同時(shí)進(jìn)行,即將隊(duì)列尾添加進(jìn)新的數(shù)據(jù)即可。</p><p> 接收窗口的操作:接收窗口有入隊(duì)、取數(shù)和刪除操作。
69、接收窗口可以不用前移,因?yàn)楸境绦蚰M實(shí)現(xiàn)是當(dāng)收到至少一個(gè)數(shù)據(jù)時(shí),就進(jìn)行回復(fù)確認(rèn)判斷,也就是隊(duì)尾的位置是由發(fā)送窗口傳過來的數(shù)據(jù)的多少?zèng)Q定。</p><p> 輸出:采用控制臺(tái)輸出,內(nèi)容有A窗口內(nèi)的數(shù)據(jù),和必要的提示信息,比如發(fā)送或接收失敗,收到數(shù)據(jù)正常。</p><p><b> 詳細(xì)設(shè)計(jì)</b></p><p> 存儲(chǔ)結(jié)構(gòu):如果采用結(jié)構(gòu)體
70、,則可以定義如下:</p><p> typedef struct </p><p><b> {</b></p><p> int queue[MAX];</p><p> int rear; //隊(duì)尾指針</p><p> int front;
71、 //隊(duì)頭指針</p><p> int count; //計(jì)數(shù)器</p><p> }SeqCQueue;</p><p> 其中計(jì)數(shù)器用于指向已發(fā)送但未收到確認(rèn)的數(shù)據(jù)的尾部,在接收窗口中,計(jì)數(shù)器可以不用。</p><p><b> 發(fā)送窗口:</
72、b></p><p><b> 發(fā)送部分:</b></p><p> 如果接收窗口中有空位</p><p> 則將發(fā)送窗口中未發(fā)送的數(shù)據(jù)加入發(fā)送隊(duì)列(發(fā)送隊(duì)列可能是全新的,也可能是之前發(fā)送的數(shù)據(jù)因?yàn)樾枰貍鞫托聰?shù)據(jù)混合組成的)</p><p> 將數(shù)據(jù)傳輸給接收窗口</p><p>
73、;<b> 確認(rèn)部分:</b></p><p> 如果收到來自接收窗口的確認(rèn),則將發(fā)送窗口第一位數(shù)據(jù)刪除,并將窗口前移。然后調(diào)到發(fā)送部分功能</p><p> 否則直接調(diào)轉(zhuǎn)到發(fā)送部分</p><p><b> 接收窗口:</b></p><p><b> 接收:</b>
74、;</p><p> 收到來自發(fā)送方的數(shù)據(jù),在窗口允許范圍內(nèi)全部接收,但由于數(shù)據(jù)傳送過程中會(huì)有失敗,所以模擬概率為80%能將這個(gè)數(shù)據(jù)接收到。</p><p><b> 確認(rèn):</b></p><p> 將收到的第一位數(shù)據(jù)與期待收到的數(shù)據(jù)進(jìn)行比較</p><p> 如果相同,則收下,并回復(fù)確認(rèn)(由于回復(fù)確認(rèn)有可能丟
75、失,所以同樣采用隨機(jī)數(shù)模擬概率,用80%表示回復(fù)確認(rèn)成功),然后將第一位數(shù)據(jù)刪除,重復(fù)確認(rèn)步驟,直到數(shù)據(jù)不是期待的或者接收窗口內(nèi)沒數(shù)據(jù)。</p><p> 否則(包括回復(fù)丟失的情況),通知發(fā)送窗口重傳</p><p> 輸出顯示:接收窗口中的數(shù)據(jù)為A中數(shù)據(jù)的復(fù)制,而且,當(dāng)收到的數(shù)據(jù)是正確的,并回復(fù)確認(rèn)了,就需要把它刪除,所以就輸出接收窗口中的內(nèi)容,只需要把發(fā)送窗口中發(fā)送了但未收到確認(rèn)的
76、數(shù)據(jù)和所有窗口內(nèi)的數(shù)據(jù)都顯示出來,并且提示出每一步正確收到的數(shù)據(jù)就能夠反應(yīng)出滑動(dòng)窗口的模擬過程了。</p><p><b> 程序主要代碼</b></p><p> #include < iostream ></p><p> //#include < cstdio > ? ?</p><p&
77、gt; //#include < cstdlib > ? ?</p><p> #include < time.h ></p><p> #include < windows.h ></p><p> #define M -1</p><p> #define MAX 100</p>
78、;<p> int N = 0 ;</p><p> using namespace std;</p><p> void InitialP ( int *p ,int n )</p><p><b> {</b></p><p> for(int i=0 ; i < n; i++)<
79、/p><p><b> p[i]=N++;</b></p><p><b> }</b></p><p> void InitialQ (int *q, int m)</p><p><b> {</b></p><p> for(int i=0
80、;i < m; i++)</p><p><b> q[i]=M;</b></p><p><b> } </b></p><p> void send(int *p,int *q,int *p1,int *p2,int *p3)</p><p><b> {</b&g
81、t;</p><p> cout<<endl<<"------------------------------------------";</p><p> cout<<endl<<"當(dāng)前發(fā)送窗口中的數(shù)據(jù)為:"<<endl;</p><p> for(int i
82、= *p1 ; i < *p3 ; i++)</p><p> cout<<p[i]<<" ";</p><p> cout<<endl;</p><p> cout<<"已發(fā)送但未確認(rèn)的數(shù)據(jù)是:"<<endl;</p><p>
83、 for(int i= *p1 ; i< * p2 ; i++)</p><p><b> {</b></p><p> q[i]=p[i];</p><p> cout<<p[i]<<" ";</p><p><b> }</b><
84、/p><p> cout<<endl;</p><p><b> }</b></p><p> int receive ( int *q,int *p1, int * p2,int *p3)</p><p><b> {</b></p><p> srand
85、( time(0) );</p><p> int n=rand()%100;</p><p><b> int i;</b></p><p><b> if(n<90)</b></p><p><b> {</b></p><p>
86、cout<<"按正確順序接收:"<<q[0]<<endl;</p><p> cout<<endl<<"------------------------------------------";</p><p><b> }</b></p><p&
87、gt; else return 0;</p><p> for( i= *p1; i < *p3-1; i++)</p><p><b> {</b></p><p> q[i]=q[i+1];</p><p><b> }</b></p><p><b
88、> q[i]++;</b></p><p><b> (*p2)--;</b></p><p><b> return 1;</b></p><p><b> }</b></p><p> void main ( void )</p>
89、<p><b> {</b></p><p><b> int n,m;</b></p><p> cout<<"請(qǐng)輸入發(fā)送窗口和接收窗口的大小:"<<endl;</p><p> cin>>n>>m;</p><p&
90、gt; int *p = new int[n]; //發(fā)送窗口</p><p> int *q = new int[m]; //接收窗口</p><p> int p1,p2,p3;</p><p> int q1,q2,q3;</p><p><b> p1=p2=0;</b></p>
91、<p><b> p3=n;</b></p><p><b> q1=q2=0;</b></p><p><b> q3=m;</b></p><p> InitialP(p,n);</p><p> srand( time(0) ); //設(shè)定隨
92、機(jī)數(shù)種子</p><p> for(int i=0; i<MAX; )</p><p><b> {</b></p><p><b> int temp;</b></p><p><b> temp=p2;</b></p><p> if
93、((p2-temp)<(q3-q1))</p><p> p2=rand()%(n-1);</p><p> while(p2<temp)</p><p> p2=rand()%(n-1);</p><p> if(receive(p,&p1,&p2,&p3)==1)</p><
94、p><b> {</b></p><p><b> i++;</b></p><p> send(p,q,&p1,&p2,&p3);</p><p><b> }</b></p><p><b> else </b>
95、</p><p><b> {</b></p><p> cout<<"接收順序出錯(cuò)或者回復(fù)確認(rèn)有問題,開始重傳..."<<endl;</p><p><b> }</b></p><p> Sleep(500);</p><p
96、><b> }</b></p><p> getchar();</p><p><b> }</b></p><p><b> 運(yùn)行結(jié)果</b></p><p><b> 輸入窗口大?。?lt;/b></p><p>&l
97、t;b> 傳送過程:</b></p><p><b> 正確傳送:</b></p><p><b> 失敗傳送:</b></p><p><b> 實(shí)驗(yàn)總結(jié)</b></p><p> 程序正確模擬出了滑動(dòng)窗口的工作過程</p><
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 《計(jì)算機(jī)網(wǎng)絡(luò)》課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 《計(jì)算機(jī)網(wǎng)絡(luò)》課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 《計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)》
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)互連課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告 (2)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)---網(wǎng)絡(luò)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論