




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、長沙理工大學(xué)梁碧瑩精選網(wǎng)絡(luò)工程200858080205王靜2011 年 7 月 2 日學(xué) 院 計算機與通信工程專 業(yè)班 級 網(wǎng)絡(luò) 08-02 學(xué) 號學(xué)生姓名梁碧瑩指導(dǎo)教師課程成績完成日期課程設(shè)計任務(wù)書計算機與通信工程學(xué)院課程名稱網(wǎng)絡(luò)協(xié)議編程課程設(shè)計時間2010 2011 學(xué)年第二學(xué)期18 19 周學(xué)生姓名梁碧瑩指導(dǎo)老師王靜題目滑動窗口協(xié)議模擬程序的設(shè)計與實現(xiàn)主要內(nèi)容:(1) 了解網(wǎng)絡(luò)協(xié)議編程的基本知識;(2) 了解滑動窗口協(xié)議的工作機制;(3) 使用編程語言編寫一個滑動窗口協(xié)議的模擬程序,按要求實現(xiàn)程序。要求:( 1)按要求編寫課程設(shè)計報告書,能正確闡述設(shè)計結(jié)果。( 2)通過課程設(shè)計培養(yǎng)學(xué)生嚴
2、謹?shù)目茖W(xué)態(tài)度,認真的工作作風(fēng)和團隊協(xié)作精神。( 3)學(xué)會文獻檢索的基本方法和綜合運用文獻能力。( 4)在老師的指導(dǎo)下,要求每個學(xué)生獨立完成課程設(shè)計的全部內(nèi)容。應(yīng)當(dāng)提交的文件:( 1) 課程設(shè)計報告。( 2) 課程設(shè)計附件(源程序、各類圖紙、實驗數(shù)據(jù)、運行截圖等)。學(xué)院 班級 學(xué)生姓名 課程成績課程設(shè)計成績評定網(wǎng)絡(luò)工程200858080205王靜2011 年 7 月 2 日計算機通信工程專業(yè)網(wǎng)絡(luò) 08-02 班 學(xué) 號梁碧瑩指導(dǎo)教師完成日期指導(dǎo)教師對學(xué)生在課程設(shè)計中的評價評分項目優(yōu)良中及格不及格課程設(shè)計中的創(chuàng)造性成果學(xué)生掌握課程內(nèi)容的程度課程設(shè)計完成情況課程設(shè)計動手能力文字表達學(xué)習(xí)態(tài)度規(guī)范要求課
3、程設(shè)計論文的質(zhì)量指導(dǎo)教師對課程設(shè)計的評定意見指導(dǎo)教師簽字年月日滑動窗口協(xié)議模擬程序的設(shè)計與實現(xiàn)學(xué)生:梁碧瑩指導(dǎo)老師:王靜摘要: 本文主要介紹如何根據(jù)滑動窗口協(xié)議的原理,在Visual C+ 的平臺上設(shè)計一個滑動窗口協(xié)議模擬程序,并最終使該程序得以實現(xiàn)。本次程序設(shè)計分兩部分: 第一部分是發(fā)送方,第二部分是接收方。通過發(fā)送方和接收方之間的數(shù)據(jù)幀傳輸模擬,學(xué)習(xí)滑動窗口協(xié)議控制流量的原理和方法,以及滑動窗口協(xié)議的工作機制。關(guān)鍵詞: 滑動窗口協(xié)議流量控制工作機制模擬程序Design and Implementation of Sliding Window Protocol ProceduresStude
4、nt: Liang Biying Instructor: Wang JingAbstract: This paper describes the principle of Sliding Window Protocol and how to design and implement a procedure about the Sliding Window Protocol. The program design in two parts, one is the sender, the other is the receiver. After all, studying the principl
5、e and method of how the Sliding Window Protocol control the flow, and how the Sliding Window Protocol works through the transmission of data between the sender and the receiver.Keywords:Sliding window protocol Flow control Working mechanismSimulation program1 引言 11.1 滑動窗口協(xié)議概述 11.2 本次設(shè)計任務(wù) 12 滑動窗口協(xié)議介紹
6、 22.1 滑動窗口協(xié)議工作原理 22.2 滑動窗口算法 23 設(shè)計方案及分析 53.1 窗口機制總體設(shè)計及分析 53.2 協(xié)議選擇及分析 63.3 發(fā)送方與接收方設(shè)計流程 64 程序測試 125 總結(jié) 165.1 程序改進與完善 165.2 設(shè)計總結(jié) 16參考文獻 17附錄 18梁碧瑩第 11 頁,共 21 頁1 引言隨著網(wǎng)絡(luò)的不斷壯大,用戶數(shù)量、信息量的需求不斷增加,網(wǎng)絡(luò)負荷越來越重。此時,我們迫切需要一種機制來控制網(wǎng)絡(luò)的流量,減少網(wǎng)絡(luò)擁堵的幾率,提高傳輸?shù)男?。因此,一種名為滑動窗口的協(xié)議應(yīng)運而生?;瑒哟翱趨f(xié)議,是TCP 使用的一種流量控制方法。該協(xié)議允許發(fā)送方在停止并等待確認前可以連續(xù)
7、發(fā)送多個分組。由于發(fā)送方不必每發(fā)一個分組就停下來等待確認,因此該協(xié)議可以加速數(shù)據(jù)的傳輸。經(jīng)測試證明,該協(xié)議還能有效地解決 TCP 的高協(xié)議處理開銷和UDP 的低可靠性之間的矛盾,1.1 滑動窗口協(xié)議概述滑動窗口協(xié)議,是TCP 使用的一種流量控制方法?;瑒哟翱趨f(xié)議也稱為Go-Back-N(GBN)協(xié)議。在該協(xié)議中,允許發(fā)送方傳輸多個分組(當(dāng)有多個分組時) 而不需等待確認,但它也受限于在流水賬中未確認的分組數(shù)不能超過最大允許數(shù)N。只有在接收窗口向前滑動時(與此同時也發(fā)送了確認),發(fā)送窗口才有可能向前滑動。收發(fā)兩端的窗口按照以上規(guī)律不斷地向前滑動,因此這種協(xié)議又稱為滑動窗口協(xié)議。當(dāng)發(fā)送窗口和接收窗口
8、的大小都等于1 時,就是停止等待協(xié)議。當(dāng)發(fā)送窗口大于1,接收窗口等于1 時,就是回退N步協(xié)議。當(dāng)發(fā)送窗口和接收窗口的大小均大于1 時, 就是選擇重發(fā)協(xié)議。協(xié)議中規(guī)定,對于窗口內(nèi)未經(jīng)確認的分組需要重傳。這種分組的數(shù)量最多可以等于發(fā)送窗口的大小,即滑動窗口的大小n 減去1(因為發(fā)送窗口不可能大于(n-1 ),起碼接收窗口要大于等于1)。1.2 本次設(shè)計任務(wù)本次的設(shè)計任務(wù)是根據(jù)滑動窗口協(xié)議的工作原理,在Visual C+ 6.0 的平臺上用C+語言編寫一個基于TCP滑動窗口協(xié)議的模擬程序。要求該程序能夠?qū)崿F(xiàn)滑動窗口協(xié)議的發(fā)送和接收數(shù)據(jù)幀功能,在此功能上體現(xiàn)滑動窗口協(xié)議的運作,如: 發(fā)送幀被接收與否的
9、判斷,幀超時重發(fā),幀緩存等。精選2 滑動窗口協(xié)議介紹2.1 滑動窗口協(xié)議工作原理TCP 協(xié)議在工作時,如果發(fā)送端的TCP 協(xié)議軟件每傳輸一個數(shù)據(jù)分組后,必須等待接收端的確認才能夠發(fā)送下一個分組,由于網(wǎng)絡(luò)傳輸?shù)臅r延,將有大量時間被用于等待確認,導(dǎo)致傳輸效率低下。為此TCP 在進行數(shù)據(jù)傳輸時使用了滑動窗口機制。TCP 滑動窗口用來暫存兩臺計算機間要傳送的數(shù)據(jù)分組。每臺運行TCP 協(xié)議的計算機有兩個滑動窗口:一個用于數(shù)據(jù)發(fā)送,另一個用于數(shù)據(jù)接收。發(fā)送端待發(fā)數(shù)據(jù)分組在緩沖區(qū)排隊等待送出。被滑動窗口框入的分組,是可以在未收到接收確認的情況下最多送出的部分?;瑒哟翱谧蠖藰酥綳的分組, 是已經(jīng)被接收端確認收
10、到的分組。隨著新的確認到來,窗口不斷向右滑動。TCP 協(xié)議軟件依靠滑動窗口機制解決傳輸效率和流量控制問題。它可以在收到確認信息之前發(fā)送多個數(shù)據(jù)分組。這種機制使得網(wǎng)絡(luò)通信處于忙碌狀態(tài),提高了整個網(wǎng)絡(luò)的吞吐率,它還解決了端到端的通信流量控制問題,允許接收端在擁有容納足夠數(shù)據(jù)的緩沖之前對傳輸進行限制。在實際運行中,TCP 滑動窗口的大小是可以隨時調(diào)整的。收發(fā)端TCP 協(xié)議軟件在進行分組確認通信時,還交換滑動窗口控制信息,使得雙方滑動窗口大小可以根據(jù)需要動態(tài)變化,達到在提高數(shù)據(jù)傳輸效率的同時,防止擁塞的發(fā)生。稱窗口左邊沿向右邊沿靠近為窗口合攏,這種現(xiàn)象發(fā)生在數(shù)據(jù)被發(fā)送和確認時。當(dāng)窗口右邊沿向右移動時將
11、允許發(fā)送更多的數(shù)據(jù),稱之為窗口張開。這種現(xiàn)象發(fā)生在另一端的接收進程讀取已經(jīng)確認的數(shù)據(jù)并釋放了TCP 的接收緩存時。當(dāng)右邊沿向左移動時,稱為窗口收縮。Host Requirements RFC強烈建議不要使用這種方式。但TCP必須能夠在某一端產(chǎn)生這種情況時進行處理。如果左邊沿到達右邊沿,則稱其為一個零窗口。2.2 滑動窗口算法滑動窗口算法工作過程如下:首先,發(fā)送方為每1 幀賦一個序號(sequence number) ,記作SeqNum?,F(xiàn)在,我們忽略SeqNum是由有限大小的頭部字段實現(xiàn)的事實,而假設(shè)它能無限增大。發(fā)送方維護3 個變量:發(fā)送窗口大小(send window size) ,記作S
12、WS,給出發(fā)送方能夠發(fā)送但未確認的幀數(shù)的上界;LAR 表示最近收到的確認幀(lastacknowledgement received)的序號;LFS 表示最近發(fā)送的幀(last frame sen)的t序號,發(fā)送方還維持如下的不變式:LAR-LFS SWS2-1 滑動窗口算法的時間線當(dāng)一個確認到達時,發(fā)送方向右移動LAR ,從而允許發(fā)送方發(fā)送另一幀。同時,發(fā)送方為所發(fā)的每個幀設(shè)置一個定時器,如果定時器在ACK 到達之前超時,則重發(fā)此幀。注意:發(fā)送方必須存儲最多SWS 個幀,因為在它們得到確認之前必須準備重發(fā)。接收方維護下面3 個變量:接收窗口大小(receive windowsize),記為R
13、WS,給出接收方所能接收的無序幀數(shù)目的上界;LAF 表示可接收幀(largest acceptable frame)的序號;LFR 表示最近收到的幀(last frame received)的序號。接收方也維持如下不變式:LFS-LAR SWS2-2 接收方的滑動窗口當(dāng)一個具有順序號SeqNum 的幀到達時,接收方采取如下行動:如果SeqNum LFR或 SeqNum> LAF, 那么幀不在接收窗口內(nèi),于是被丟棄;如果 LFR< SeqNum LAF ,那么幀在接收窗口內(nèi),于是被接收?,F(xiàn)在接收方需要決定是否發(fā)送一個ACK。 設(shè) SeqNum To ACK表示未被確認幀的最大序號,則
14、序號小于或等于 SeqNum To ACK 的幀都已收到。即使已經(jīng)收到更高序號的分組,接收方仍確認 SeqNum To ACK的接收。這種確認被稱為是累積的( cumulative) 。然后它設(shè)置 LFA = SeqNum To ACK,并調(diào)整LFA = LFR + RWS。2-3 接收方的滑動窗口窗口協(xié)議算法有三個功能:在不可靠鏈路上可靠地傳輸幀 保持幀的傳輸順序支持流量控制3 設(shè)計方案及分析3.1 窗口機制總體設(shè)計及分析3-1 發(fā)送方和接收方狀態(tài)示意圖設(shè)計分析:1) 初始態(tài), 發(fā)送方?jīng)]有幀發(fā)出,發(fā)送窗口前后沿相重合。接收方 0 號窗口打開,等待接收0 號幀;2) 發(fā)送方打開0 號窗口, 表
15、示已發(fā)出0 幀但尚未確認返回信息。此時接收窗口狀態(tài)不變;3) 發(fā)送方打開0、 1 號窗口,表示0、 1 號幀均在等待確認之列。至此,發(fā)送方打開的窗口數(shù)已達規(guī)定限度,在未收到新的確認返回幀之前,發(fā)送方將暫停發(fā)送新的數(shù)據(jù)幀。接收窗口此時狀態(tài)仍未變;4) 接收方已收到0 號幀, 0 號窗口關(guān)閉,1 號窗口打開,表示準備接收1 號幀。此時發(fā)送窗口狀態(tài)不變;5) 發(fā)送方收到接收方發(fā)來的0 號幀確認返回信息,關(guān)閉 0 號窗口, 表示從重發(fā)表中刪除0 號幀。此時接收窗口狀態(tài)仍不變;6) 發(fā)送方繼續(xù)發(fā)送2 號幀, 2 號窗口打開,表示2 號幀也納入待確認之列。至此, 發(fā)送方打開的窗口又已達規(guī)定限度,在未收到新
16、的確認返回幀之前,發(fā)送方將暫停發(fā)送新的數(shù)據(jù)幀,此時接收窗口狀態(tài)仍不變;7) 接收方已收到1 號幀, 1 號窗口關(guān)閉,2 號窗口打開,表示準備接收2 號幀。此時發(fā)送窗口狀態(tài)不變;8) 發(fā)送方收到接收方發(fā)來的1 號幀收畢的確認信息,關(guān)閉 1 號窗口, 表示從重發(fā)表中刪除1 號幀。此時接收窗口狀態(tài)仍不變。3.2 協(xié)議選擇及分析在設(shè)計過程中,我主要運用了選擇重傳協(xié)議,該協(xié)議能很好地彌補了1 比特滑動窗口協(xié)議和后退n 協(xié)議的缺點,是比較完善的滑動窗口協(xié)議。在選擇重傳協(xié)議中,當(dāng)接收方發(fā)現(xiàn)某幀出錯后,其后繼續(xù)送來的正確的幀雖然不能立即遞交給接收方的高層,但接收方仍可收下來,存放在一個緩沖區(qū)中,同時要求發(fā)送方
17、重新傳送出錯的那一幀。一旦收到重新傳來的幀后,就可以原已存于緩沖區(qū)中的其余幀一并按正確的順序遞交高層。這種方法稱為選擇重發(fā)(SELECTICE REPEAT),其工作過程如圖所示。顯然,選擇重發(fā)減少了浪費,但要求接收方有足夠大的緩沖區(qū)空間。3-2 選擇重傳協(xié)議原理圖3.3 發(fā)送方與接收方設(shè)計流程由于我設(shè)計的程序為模擬程序,因此我把發(fā)送方和接收方集合在同一版面上。 它們各自的功能同時在同一版面上實現(xiàn)及顯示。在程序?qū)崿F(xiàn)后,我們可以通過在同一版面根據(jù)提示輸入相關(guān)信息,即可得到模擬過程。雖然只有一個版面,但是發(fā)送方和接收方的功能是清晰的、相對齊全的。發(fā)送方和接收方的設(shè)計流程如下:3-3 發(fā)送方與接收方
18、設(shè)計流程根據(jù)流程圖的實現(xiàn)步驟,我編寫了以下的代碼。( 1)發(fā)送方程序:本程序設(shè)有四個變量:一是窗口大小變量,二是第一幀序列號變量,三是最近發(fā)送的幀變量,最后一個是最近收到的確認幀變量。swpstate1.head=NULL;/變量初始值為空swpstate1.sendq=sendq_rear=(structsendq_slot*)malloc(sizeof(structsendq_slot);if(!swpstate1.sendq) exit(1);sendq_rear->next=NULL;printf(" 請輸入窗口大小:");scanf("%ld&qu
19、ot;,&swpstate1.sws); /輸入窗口大小swpstate1.rws=swpstate1.sws; /把窗口大小的值賦給變量if (swpstate1.sws>0)printf("請輸入第一幀的序列號:");scanf("%ld",&swpstate1.hdr.seqnum); /輸入第一幀序列號swpstate1.nfe=swpstate1.hdr.seqnum; /把第一幀的值放進緩沖池內(nèi)sendp=(struct sendq_slot*) malloc (size of(struct sendq_slot);if
20、(!sendp) exit(1);sendp->msg=swpstate1.hdr.seqnum;sendp->timeout=1;sendp->next=NULL;sendq_rear->next=sendp;sendq_rear=sendp;-swpstate1.sws;swpstate1.lfs=swpstate1.hdr.seqnum; /最近發(fā)送的幀取值swpstate1.lar=swpstate1.hdr.seqnum; /最近收到的確認幀取值dowhile(swpstate1.sws>0) /當(dāng)窗口大小大于0 時,執(zhí)行以下的循環(huán)sendp=(stru
21、ct sendq_slot*)malloc(sizeof(struct sendq_slot);if(!sendp) exit(1);sendp->msg=swpstate1.lfs+1; /如果輸入的幀序號大于之前幀序號,那么窗口向前滑動sendp->timeout=1; /時延為 1sendp->next=NULL;sendq_rear->next=sendp;sendq_rear=sendp;-swpstate1.sws;+swpstate1.lfs;swpstate1.hdr.acknum=0; /ACK 清空swpstate1.hdr.flags=0;/存儲緩
22、沖池清空printf(" 最近收到的ACK的幀序號: %ldn",swpstate1.lar);/輸出最近收到的ACK幀序號printf(" 最近發(fā)送的幀序號(發(fā)送新幀后) : %ldn",swpstate1.lfs);/輸出最近發(fā)送幀序號梁碧瑩第 16 頁,共 21 頁接收方的接收原則從總體上看是先判斷輸入的數(shù)據(jù)幀是否在接收范圍之內(nèi),若是,則繼續(xù)判斷是否符合其他接收條件;若不是,則馬上丟棄該數(shù)據(jù)幀,不再進行其他條件的判斷。struct sendq_slot *sendq_rear,*sendp,*p3,*p4; /設(shè)定變量struct recvq_sl
23、ot *recvp,*recvq_rear,*p1,*p2;if(swpstate1.hdr.flags=0)/上次輸入的數(shù)據(jù)幀被放置在緩存區(qū),輸入?yún)^(qū)被清空do /如果繼續(xù)接收數(shù)據(jù)幀則實施下面循環(huán)printf("請輸入收到的數(shù)據(jù)幀號:");scanf("%ld",&a);if(a>=swpstate1.nfe&&a<=swpstate1.lfs) /判斷數(shù)據(jù)幀應(yīng)被接收或緩存 if(swpstate1.head=NULL)recvp=recvq_rear=(structrecvq_slot*)malloc(sizeof(
24、structrecvq_slot);recvp->next=NULL;swpstate1.head=recvp;elseif(swpstate1.head!=NULL)recvp=(struct recvq_slot*)malloc(sizeof(struct recvq_slot);recvp->next=NULL;recvq_rear->next=recvp;recvq_rear=recvp;elseprintf(" 所輸數(shù)據(jù)不在接收窗口內(nèi)!");break; /跳出該循環(huán)若輸入數(shù)據(jù)幀在接收范圍內(nèi)則繼續(xù)判斷并進行以下循環(huán)。recvp->msg=a
25、;if(recvp->msg=swpstate1.nfe) /是否放入緩存判斷recvp->received=1;elserecvp->received=0;-swpstate1.rws;if(recvp->received=1) /數(shù)據(jù)幀被接收,則進行下面語句 a=a-1;doa=a+1;if(swpstate1.head=NULL)break;p1=swpstate1.head;flag=0;while(a!=p1->msg)&&(p1->next!=NULL)p2=p1;p1=p1->next;if(a=p1->msg)fl
26、ag=1;if(p1=swpstate1.head)swpstate1.head=swpstate1.head->next;else p2->next=p1->next;swpstate1.nfe=a+1;swpstate1.hdr.acknum=a+1;swpstate1.hdr.flags=1;while(flag=1);printf(" ACK號(期待的下一幀的序號) : %ldn",swpstate1.nfe);printf(" 沒按序接受的序號:n");p1=swpstate1.head;while(p1!=NULL)prin
27、tf("%ldt",p1->msg);p1=p1->next;當(dāng)接收完一個數(shù)據(jù)幀時,我們可以選擇終止下面的繼續(xù)接收,也可以選擇繼續(xù)接收。如果繼續(xù)接收,那么程序跳到判斷循環(huán),繼續(xù)判斷是否接收下一個數(shù)據(jù)幀,原理與上面相當(dāng)。while(swpstate1.rws>0)&&(b=1);if(swpstate1.hdr.flags=1) p3=swpstate1.sendq->next;flag=0;while(swpstate1.hdr.acknum)!=p3->msg&&p3->next!=NULL)p4=p3;
28、p3=p3->next;if(swpstate1.hdr.acknum=p3->msg)flag=1;if(p3->msg=swpstate1.sendq->next->msg)swpstate1.sendq->next=p3;else swpstate1.sendq->next=p3;swpstate1.sws=swpstate1.sws+(swpstate1.sendq->next->msg-swpstate1.lar);swpstate1.lar=swpstate1.sendq->next->msg;swpstate1.h
29、dr.seqnum=swpstate1.hdr.acknum;printf(" 最近收到的ACK的幀序號(收到ACK后 ) : %ldn",swpstate1.lar);printf("最近發(fā)送的幀序號(此時還未發(fā)送新的數(shù)據(jù)) : %ldn",swpstate1.lfs);4 程序測試11,第一幀序列號為3,做程序的測試。精選圖 4-1 程序測試整體圖1)整體窗口展示,命令行界面4-2 整體窗口展示第 17 頁,共 21 頁2) 輸入窗口大小及第一幀序列號圖 4-3 信息設(shè)置輸入3)當(dāng)輸入的接收幀并不是ACK期待的幀,那么根據(jù)滑動窗口協(xié)議該幀不被接收,且
30、把該幀存放在緩沖區(qū)。圖 4-4 幀不被接收的情況4) 當(dāng)前面輸入的都不是系統(tǒng)所期待的幀,那么這些幀會一直被存放在緩沖區(qū)。直到輸入下一個輸入的幀的序號比前面輸入的幀的序號大,且是系統(tǒng)所期待的幀時,之前和當(dāng)前輸入的幀會一并被接收,緩沖區(qū)清空。繼續(xù)接收命令,進行新的幀的檢測及接收。精選梁碧瑩第 27 頁,共 21 頁圖 4-5 幀被接收的情況5)若輸入的幀超過了窗口大小,那么系統(tǒng)會顯示該幀不在接收范圍內(nèi),并拒絕接收。精選4-6 幀超出窗口大小范圍5 總結(jié)5.1 程序改進與完善該滑動窗口協(xié)議模擬程序還有進一步完善的余地,例如可以對以下一些地方進行改進:( 1)改模擬程序通過命令行來實行,缺少形象直觀的
31、界面,希望日后可以設(shè)計比較簡單明了的界面來展示程序的主要模擬功能。( 2)現(xiàn)在我們模擬的只是一些用序號代名的簡單的幀,建議可以改善程序,使該系統(tǒng)可以模擬更接近真實的數(shù)據(jù)幀。這樣可以聯(lián)系實際更直觀地去驗證滑動窗口協(xié)議。( 3)整體來說,滑動窗口在實驗中是固定的,這樣便于處理幀號和ack 的確認以及存儲。但建議可以在日后改進使其變成動態(tài)的。5.2 設(shè)計總結(jié)以上為我所設(shè)計的滑動窗口模擬程序,它經(jīng)過多次修改和整理,已是一個比較不錯的設(shè)計,可以基本實現(xiàn)所需功能,但因為水平有限,此程序中也存在一定的問題,這需要以后更進一步的改進。參考文獻1 謝希仁 . 計算機網(wǎng)絡(luò)M. 4 版 . 北京 : 電子工業(yè)出版社
32、, 2003.2 李仁發(fā) , 何彥 . 基于虛擬實驗方法的滑動窗口協(xié)議分析J. 系統(tǒng)仿真學(xué)報,2002, 8 (14) : 1026 - 1063.3 李建中 , 張冬冬 . 滑動窗口規(guī)模的動態(tài)調(diào)整算法J. 軟件學(xué)報, 2004, 12(15) : 1800 - 1814.4 王栩 , 李建中 , 王偉平 . 基于滑動窗口的數(shù)據(jù)流壓縮技術(shù)及連續(xù)查詢處理方法 J . 計算機研究與發(fā)展, 2004, 10 (41) : 1639- 1644.5 特南鮑姆 . 計算機網(wǎng)絡(luò)(第四版). 清華出版社附錄#include<stdio.h>#include<stdlib.h>#inc
33、lude<malloc.h>main()struct swphdrunsigned long seqnum;unsigned long acknum;unsigned short flags; /*flag=0 表示這是一個數(shù)據(jù)幀,flag=1 表示這是一個ACK幀 */;struct sendq_slotunsigned short timeout;/*1 時表示計時啟動,0時表示已收到確認*/unsigned long msg;struct sendq_slot *next;struct recvq_slotunsigned short received;/*1 表示順序接收,
34、0 表示錯序接受*/unsigned long msg;struct recvq_slot *next;struct swpstateunsigned long lar;unsigned long lfs;unsigned long sws;struct swphdr hdr;unsigned long rws;struct sendq_slot *sendq;unsigned long nfe;struct recvq_slot *head;swpstate1;unsigned long a;int flag,b;/* 發(fā)送 */struct sendq_slot *sendq_rear,*
35、sendp,*p3,*p4;struct recvq_slot *recvp,*recvq_rear,*p1,*p2;swpstate1.head=NULL;swpstate1.sendq=sendq_rear=(structsendq_slot*)malloc(sizeof(structsendq_slot);if(!swpstate1.sendq) exit(1);sendq_rear->next=NULL;printf(" 請輸入窗口大?。?quot;);scanf("%ld",&swpstate1.sws);swpstate1.rws=swp
36、state1.sws;if (swpstate1.sws>0)printf(" 請輸入第一幀的序列號:");scanf("%ld",&swpstate1.hdr.seqnum);swpstate1.nfe=swpstate1.hdr.seqnum;sendp=(struct sendq_slot*)malloc(sizeof(struct sendq_slot);if(!sendp) exit(1);sendp->msg=swpstate1.hdr.seqnum;sendp->timeout=1;sendp->next=N
37、ULL;sendq_rear->next=sendp;sendq_rear=sendp;-swpstate1.sws;swpstate1.lfs=swpstate1.hdr.seqnum;swpstate1.lar=swpstate1.hdr.seqnum;dowhile(swpstate1.sws>0)sendp=(struct sendq_slot*)malloc(sizeof(struct sendq_slot);if(!sendp) exit(1);sendp->msg=swpstate1.lfs+1;sendp->timeout=1;sendp->nex
38、t=NULL;sendq_rear->next=sendp;sendq_rear=sendp;-swpstate1.sws;+swpstate1.lfs;swpstate1.hdr.acknum=0;swpstate1.hdr.flags=0;printf(" 最近收到的ACK的幀序號: %ldn",swpstate1.lar);printf(" 最近發(fā)送的幀序號(發(fā)送新幀后) : %ldn",swpstate1.lfs);/* 接收 */if(swpstate1.hdr.flags=0)doprintf(" 請輸入收到的數(shù)據(jù)幀號:&qu
39、ot;);scanf("%ld",&a);if(a>=swpstate1.nfe&&a<=swpstate1.lfs) if(swpstate1.head=NULL)recvp=recvq_rear=(structrecvq_slot*)malloc(sizeof(structrecvq_slot);recvp->next=NULL;swpstate1.head=recvp;elseif(swpstate1.head!=NULL) recvp=(struct recvq_slot*)malloc(sizeof(struct recvq_slot);recvp->next=NULL;recvq_rear->next=recvp;recvq_rear=recvp;elseprintf(" 所輸數(shù)據(jù)不在接收窗口內(nèi)!");break;recvp->msg=a;if(recvp->msg=swpstate1.nfe)recvp->received=1;elserecvp->received=0;-swpstate1.rws;if(recvp->received=1)a=a-1;
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電影票務(wù)平臺地區(qū)級代理合同
- 合同法修訂案:第一章 合同的訂立與生效
- 外資制造業(yè)-員工培訓(xùn)合同范本
- 木材采購與銷售合同模板
- 流動人口計劃生育協(xié)作合同
- 干股收益分配合同(范本)
- 企事業(yè)單位監(jiān)控布防合同模板
- 合同責(zé)任死亡賠償金額解析
- 學(xué)校食堂食材采購合同模板
- 人體解剖生理學(xué)教案
- 減少噪音保護聽力
- 網(wǎng)絡(luò)安全技術(shù)與應(yīng)用PPT完整全套教學(xué)課件
- 巖石力學(xué)與工程課后習(xí)題與思考解答
- 《民族樂器分類二》教案
- 生產(chǎn)車間管理制度辦法
- 機電企業(yè)管理導(dǎo)論第1章課件
- 水平一足球全冊教案
- 蘇教版科學(xué)二年級下冊全冊教案
- 約束評分標準
- GB 16780-2021水泥單位產(chǎn)品能源消耗限額
評論
0/150
提交評論