2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論