計算機(jī)網(wǎng)絡(luò)課設(shè) 計算校驗和._第1頁
計算機(jī)網(wǎng)絡(luò)課設(shè) 計算校驗和._第2頁
計算機(jī)網(wǎng)絡(luò)課設(shè) 計算校驗和._第3頁
計算機(jī)網(wǎng)絡(luò)課設(shè) 計算校驗和._第4頁
計算機(jī)網(wǎng)絡(luò)課設(shè) 計算校驗和._第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 沈陽理工大學(xué)課程設(shè)計專用紙 No12學(xué)生姓名林娟班級學(xué)號1103050401專 業(yè)計算機(jī)科學(xué)與技術(shù)課程設(shè)計題目 計算校驗和評語組長簽字:成績?nèi)掌?2012 年 12 月3日課程設(shè)計任務(wù)書學(xué) 院信息科學(xué)與工程學(xué)院專 業(yè)計算機(jī)科學(xué)與技術(shù)學(xué)生姓名林娟班級學(xué)號1103050401課程設(shè)計題目計算校驗和實踐教學(xué)要求與任務(wù): 本課程設(shè)計的主要意圖是,通過計算機(jī)網(wǎng)絡(luò)中的計算校驗和來了解計算機(jī)是怎么樣判斷接收數(shù)據(jù)的正確與錯誤。同時也讓我們更進(jìn)一步的了解計算機(jī)的一般思想,從而了解計算校驗和的目的與作用。最后我們要學(xué)會計算校驗和,了解和擴(kuò)展計算機(jī)網(wǎng)絡(luò)的知識面。校驗和的作用就是保證數(shù)據(jù)傳送的正確性。本次課程設(shè)計的

2、主要內(nèi)容包括以下幾個方面:課程設(shè)計目的,通過這一點我們可以了解我們?yōu)槭裁匆嬎阈r灪停淖饔煤湍康氖鞘裁?,從而學(xué)會計算校驗和。課程設(shè)計的要求,根據(jù)下面課程設(shè)計中的計算方法編制程序為給定數(shù)據(jù)計算檢驗和。計算校驗和的相關(guān)知識,如交換性與結(jié)合性,字節(jié)順序的自主性,并行計算以及實例,以及給出一些編碼技術(shù)可以提高校驗和的速度。課程設(shè)計分析,主要是從數(shù)據(jù)的輸入方式,校驗和的計算流程圖。工作計劃與進(jìn)度安排:第15周星期一:設(shè)計任務(wù)分析和總體設(shè)計星期二:軟件算法和流程設(shè)計星期三:軟件編碼實現(xiàn)星期四:軟件總體調(diào)試星期五:交課程設(shè)計報告、答辯、驗收程序指導(dǎo)教師: 2012 年12月 日專業(yè)負(fù)責(zé)人:2012 年

3、12 月 日學(xué)院教學(xué)副院長:2012 年 12月 日 目 錄摘 要1 課程設(shè)計目的12 課程設(shè)計要求13相關(guān)知識54課程設(shè)計分析115程序代碼126運行結(jié)果與分析137 實驗體會.138參考文獻(xiàn)13沈陽理工大學(xué)1 課程設(shè)計目的網(wǎng)絡(luò)上的信號最終,都是通過物理傳輸進(jìn)行傳輸線路進(jìn)行傳輸?shù)模绻邔記]有采用差錯控制,那么物理層傳輸?shù)臄?shù)據(jù)信號是可能有差錯的。為了保證數(shù)據(jù)的正確性,在物理層的基礎(chǔ),計了數(shù)據(jù)層。設(shè)計數(shù)據(jù)鏈路層的主要作用就是在原始的、有差錯的線路改進(jìn)成邏輯上無差錯的數(shù)據(jù)鏈路,以向網(wǎng)絡(luò)層提供高質(zhì)量的服務(wù)。本課程設(shè)計主要通過一個簡單例子使學(xué)生了解網(wǎng)絡(luò)協(xié)議中校駔和的計算過程,以及設(shè)置校驗和的作用。

4、目前,進(jìn)行了差錯檢測和差錯控制的主要方法是:在需要傳輸?shù)臄?shù)據(jù)分組后面加上一定的冗余信息通常都是通過對所發(fā)送的數(shù)據(jù)應(yīng)用某種算法進(jìn)行計算而得到的。數(shù)據(jù)的接收方在接收到數(shù)據(jù)后進(jìn)行同樣的計算再與收到的冗余信息進(jìn)行比較不,如果結(jié)果不同說明出現(xiàn)了差錯,此時可以要求發(fā)送方重傳該組數(shù)據(jù),以此達(dá)到保證數(shù)據(jù)準(zhǔn)確性的目的。 在普通使用的網(wǎng)絡(luò)協(xié)議中都設(shè)置了校驗和項以保存冗余信息,例如IPV4、ICMPV4、IGMPV4、ICMPV6、UDP 和TCP等等。計算校驗和算法稱為網(wǎng)際協(xié)議和算法,簡單來說,就是把被校驗的數(shù)據(jù)按16位進(jìn)行累加,然后取反碼。若數(shù)據(jù)字節(jié)長度為奇數(shù),則在數(shù)據(jù)尾部補(bǔ)一個字節(jié)的0以湊成偶數(shù)。關(guān)于計算更詳

5、細(xì)的信息請參考RFC1071。2 課程設(shè)計要求根據(jù)前面介紹的算法,編制程序為給定數(shù)據(jù)計算校驗和。(1)、以命令行形式運行:check_sum infile其中check_sum為程序名,infile為輸入數(shù)據(jù)文件名。 (2)、輸出:數(shù)據(jù)文件的校驗和。3.相關(guān)知識3.1校驗和的概念 網(wǎng)絡(luò)上的數(shù)據(jù)最終都是通過物理傳輸線路進(jìn)行傳輸?shù)?,如果高層沒有采用差錯控制,那么物理層傳輸?shù)臄?shù)據(jù)的正確性,在物理層的基礎(chǔ)上設(shè)計了數(shù)據(jù)鏈路,以向網(wǎng)絡(luò)層提高質(zhì)量的服務(wù)。 目前,進(jìn)行差錯檢測和控制的主要方法是發(fā)送方在需要發(fā)送的數(shù)據(jù)后面增加一定的冗余信息,這些冗余信息通常是通過對發(fā)送的數(shù)據(jù)進(jìn)行某種算法計算而得到的。接收方對接收

6、數(shù)據(jù)進(jìn)行同樣的計算,然后與數(shù)據(jù)后面附加的冗余信息進(jìn)行比較,如果比較結(jié)果不同就說明在傳輸中出現(xiàn)了差錯,并要求發(fā)送方重新傳送該數(shù)據(jù),以此達(dá)到確保數(shù)據(jù)準(zhǔn)確性的目的。在普通使用的網(wǎng)絡(luò)協(xié)議(例如IP,ICMP,IGMP,UDP與TCP等)中,通常都設(shè)置了校驗和字段以保存這些冗余信息。計算這些校驗和的算法稱為網(wǎng)絡(luò)校驗和算法,就是將被校驗的數(shù)據(jù)按16位進(jìn)行累加,然后取反碼,如果數(shù)據(jù)字節(jié)長度為奇數(shù),則數(shù)據(jù)尾部補(bǔ)一個字節(jié)的0以湊成偶數(shù)。關(guān)于計算校驗和算法的詳細(xì)信息請參考。計算校驗和(1) 交換性與結(jié)合性因為校驗和主要考慮被校驗數(shù)據(jù)中所包含字節(jié)數(shù)量的是奇數(shù)還是偶數(shù),所以校驗和的計算可以以任意順序進(jìn)行,甚至可以把數(shù)

7、據(jù)進(jìn)行分組后再計算。例如,用A、B、C、D,Y,Z分別表示一系列八位組,用a,b這樣形式的字節(jié)來表示a*256+b的整數(shù),那么16位校驗和就可以通過以下形式給出:A,B+C,D+Y,Z 1A,B+C,D+Z,0 2在這里,+代表1補(bǔ)數(shù)加法,即將前面的16位校驗和按位取反。1可以以(A,B+C,D+J,0+(0,K+Y,Z) 3的形式進(jìn)行計算。(2) 字節(jié)順序的自主性打破被校驗數(shù)據(jù)中的字節(jié)順序仍可以計算出正確的16位校驗和。例如,我們交換字節(jié)組中兩字節(jié)的順序,得到B,A+D,C+Z,Y 4所得到的得結(jié)構(gòu)與1式是相同的(當(dāng)然結(jié)果也是要進(jìn)行一次反轉(zhuǎn)的)。為什么會是這樣呢?我們發(fā)現(xiàn)兩種順序獲得的進(jìn)位是

8、相同的,都是從第15位到第0位進(jìn)位以及從第7位到第8位進(jìn)位。這也就是說,交換字節(jié)位置只是改變高低位字節(jié)的排列順序,但并沒有改變它們的內(nèi)在聯(lián)系。因此,無論底層的硬件設(shè)置中對字節(jié)的接收順序如何,校驗和都可以被準(zhǔn)確地校驗出來。例如,假設(shè)校驗和是以主機(jī)序(高位字節(jié)在前低位字節(jié)在后)計算的數(shù)據(jù)幀,但以網(wǎng)絡(luò)序(低位字節(jié)在前高位字節(jié)在后)存放在內(nèi)存中。每一個16位的字中的字節(jié)在傳送過程中都交換了順序,在計算校驗和之后仍會先交換位置再存入內(nèi)存,這樣就與接受到的原本以網(wǎng)絡(luò)序存儲的數(shù)據(jù)幀中的校驗和項保持一致了。(3)并進(jìn)行計算某些機(jī)器的字處理長度是16位的倍數(shù),這樣可以提高它的計算速度。由于加法所具有的結(jié)合性,我

9、們沒有必要按照順序?qū)γ總€字節(jié)進(jìn)行累加。相反,我們可以利用這一特點對它們進(jìn)行并行累加。并行地計算校驗和只是增加了每次累加的信息長度。例如,在一個323位的機(jī)器上,我們可以一次增加4個字節(jié),即A,B,C,D+。計算結(jié)束后再把累加和“折疊”起來,把一個32位的數(shù)值變?yōu)?6位,這樣產(chǎn)生的新的進(jìn)位也要循環(huán)累積起來。此外,在此仍不考慮字節(jié)順序的問題,我們可以用D,C,B,A+或B,A,D,C+;這樣的順序來計算校驗和,最終再通過交換16位校驗和中的字節(jié)序來得到正確的值。這些改變順序的方法都是為了讓所有的偶數(shù)字節(jié)進(jìn)入一個校驗和字節(jié),所有的奇數(shù)字節(jié)進(jìn)入一個校驗和字節(jié)。3.3 示例下面將通過一個簡單的例子來演示

10、通過上述的幾種方法所得到的校驗和的情況16位按字節(jié)累加“正?!表樞蚪粨Q順序字節(jié)0/1:00 0100010100字節(jié)2/3:f2 03F20303f2字節(jié)4/5:f4 f5f4f5f5f4字節(jié)6/7:f6 f7f6f7f7f6- -合計1:2dc 1f02ddf01f2dcdc f0ddf0f2dc進(jìn)位:1 221- -合計2:dd f2ddf2f2dd最終結(jié)果:dd f2ddf2dd f232位按字節(jié)累加“正?!表樞蚪粨Q順序字節(jié)0/1/2/3:0001f203010003f203f20100字節(jié)4/5/6/7:f4f5f6f7f5f4f7f6f7 f6 f5f4-合計1:0f4f7e8fa0

11、f6f4fbe80fbe8f6f4進(jìn)位:000前半段:f4f7f6f4fbe8后半段:e8fafbe8f6f4-合計2:1ddf11f2dc1f2dcddf1f2dcf2dc進(jìn)位:111-合計3:ddf2f2ddf2dd最終結(jié)果:ddf2ddf2ddf2還有一個例子是把計算工作分為兩組,第二組是以奇數(shù)邊界起始的。按字節(jié)累加“正?!表樞蜃止?jié)0/1:00 010001字節(jié)2/:f2 (00)f200- -合計:f2 01f201字節(jié)4/5:03 f403f4字節(jié)6/7:f5 f6f5f6字節(jié)8/:f7 (00)f700- -合計2:1f0ea合計2:f0ea進(jìn)位:1-合計3:f0eb合計1:f20

12、1合計3(交換字節(jié)序):ebf0-合計41ddf1合計4ddf1進(jìn)位:1-合計5:ddf23.4 一些編碼技術(shù)可以提高校驗和的計算速度(1)延遲進(jìn)位法這種方法在主要的累加循環(huán)結(jié)束之后再把進(jìn)位累加進(jìn)和值。其實現(xiàn)方式就是用32位的累加器獲得16位校驗和,這樣溢出就產(chǎn)生在高16位上。這種方法避免了累加器中進(jìn)位傳感器機(jī)構(gòu)的設(shè)置,但是它要求的容量是原來的累加器容量的兩倍,因此它更多地依賴于硬件條件。(2)反向循環(huán)法這種方法可以減少由循環(huán)而產(chǎn)生的負(fù)荷,有效地展開內(nèi)部的累加循環(huán),把循環(huán)過程中的一系列加法命令復(fù)制下來。這種技術(shù)通常可以節(jié)省大量的時間,但是程序的邏輯設(shè)計會比較復(fù)雜。(3)合并數(shù)據(jù)拷貝法計算校驗和

13、以及讀入數(shù)據(jù)都需要將數(shù)據(jù)從內(nèi)存的一個位置轉(zhuǎn)移到另一個位置,這樣會占用內(nèi)存總線的帶寬,而內(nèi)存總線的傳輸效率是提高校驗和計算速度的瓶頸,尤其是對于某些機(jī)器(如一些簡單的慢速的微型機(jī))來說,這一問題尤為嚴(yán)重。為了解決這個問題,可以把數(shù)據(jù)讀入的過程與校驗的過程合二為一,也就是在讀入數(shù)據(jù)的同時計算校驗和,這樣就可以省去一次數(shù)據(jù)移動的過程,從而提高校驗和的計算速度。4 課程設(shè)計分析校驗和的計算過程主要分為三個步驟:數(shù)據(jù)文件的輸入,校驗和的計算和校驗結(jié)果的輸出。其中,主要的是數(shù)據(jù)的輸入和校驗和的計算過程。4.1 數(shù)據(jù)的輸入方式輸入數(shù)據(jù)可能是以字符形式存儲的,而校驗和的計算則要采用數(shù)據(jù)形式,所以在從文件讀取數(shù)

14、據(jù)時,都要進(jìn)行字符到數(shù)據(jù)的相互轉(zhuǎn)換。1)將讀入的ASCII碼轉(zhuǎn)化為相應(yīng)的整型變量。if(ch>=0&&<=9)ch-=0;elseif(ch>=a&&ch<=f)ch=ch-a+10;elseif(ch>=A&&ch<=F)ch=ch-A+10;2)在使用C+編程時直接使用16進(jìn)制的方式打開輸入文件。Ifstream in(argv1,ios:nocreate);i.setf(ios:hex);4.2 校驗和的計算校驗和算法是本程序的核心部分,在2.5節(jié)中我們介紹了一些相關(guān)的算法,而應(yīng)用最為普遍的是端循環(huán)進(jìn)位法

15、。端循環(huán)進(jìn)位的算法如下:將數(shù)據(jù)按一定數(shù)位進(jìn)行累加,最高位的進(jìn)位則循環(huán)加入最低位。待校驗的數(shù)據(jù)按16位為一個單位相加,采用端循環(huán)進(jìn)位,最后對所得16位的數(shù)據(jù)取反碼。因為待校驗的數(shù)據(jù)是以字節(jié)方式分隔的,所以為了方便,將16位的數(shù)據(jù)分成高8位和低8位分別處理。該算法的代碼如下:圖2-1給出了一個流程的參考方案。endaroundcarry(int &highyte,int &lowbyte)while(highbyte>0xff|lowbyt化e>0xff)0 /高8位或低8位中的任何一方產(chǎn)生了溢出(進(jìn)位)lowbyte+=(highbyte>>8); /低字

16、節(jié)加上高字節(jié)超過8位的進(jìn)位highbyte=highbutr&0xff; /清除高字節(jié)的進(jìn)位highbyte+=(lowbyte>>8); /高字節(jié)加上來自低字節(jié)的進(jìn)位lowbyte=lowbyte&0xff; Count /清除低字節(jié)的進(jìn)4.3 程序流程圖圖2-1給出了一個流程的參考方案開始,初始化 ch,count,sum,checksum 從文件讀取一個字符 Ch=EOF?Ch="? Ch轉(zhuǎn)換為相應(yīng)的8位數(shù)據(jù),count+ Count偶數(shù)? Ch低4位送入低四位 Ch低4位送入高4位得到p 值 將32位sum折疊到16位 求sum反碼并結(jié)束 (cou

17、nt/2)%2=1? 得到sum rp和sum低8位相加 rp和sum高8位相加 Y Y Y Y N N N N 4.4 相關(guān)擴(kuò)展前面我們提到,校驗和還有其他一些計算方法,下面我們就來簡要介紹以下利用延遲進(jìn)位法進(jìn)行計算的方法。延遲進(jìn)位法的算法描述:將進(jìn)位累加的過程延遲到整個累加循環(huán)結(jié)束之后進(jìn)行,這樣可以提高計算速度。3.1 主要的實現(xiàn)過程while(!infile.eof()/判斷文件是否結(jié)束,若否則對被校驗的16位數(shù)據(jù)進(jìn)行累加int h, 1;/分別表示16位數(shù)據(jù)的高8位和低8位infile>>hex>>h;/從文件中讀入一個16進(jìn)制表示的數(shù)據(jù),作為高8位if(inf

18、ile.eof() l=0;/若后面沒有其他數(shù)據(jù),將0作為低8位else infile>>hex>>1;/若后面還有數(shù)據(jù),讀入下一個作為低8位sum+=(h*256+l);/將組合好的16位數(shù)據(jù)累加到sum中infile.close();/關(guān)閉文件check_sum=short(sum&0xffff)+(sum>>16);/將32位累加和轉(zhuǎn)換為16位數(shù)據(jù)/若累加過程中有向高16位的進(jìn)位,則要將進(jìn)位部分加到低16位上check_sum=-check_sum;/對累加和取反碼 開始 命令行輸入正確? 創(chuàng)建輸入文件流,打開指定輸入文32位累加器sum置0

19、文件結(jié)束? 讀入下一個字節(jié)數(shù)據(jù)作為高8位 后面還有數(shù)據(jù)? 讀入下一個字節(jié)數(shù)據(jù)作為低8位 將組合好的16位數(shù)據(jù)加到sum中歐 輸出格式提示 退出 關(guān)閉文件 取sum的低16位sum&oxffff Sum高16位為0? 將sum高16位數(shù)據(jù)sum>>16加到低16位上 對所得數(shù)據(jù)取反,即為check_sum 輸出check_sum 結(jié)束 Y 低8位置0N N N Y Y N 5 程序代碼#include<stdio.h>#include<stdlib.h>void main(int arga, char *argb)/指針數(shù)組作為主函數(shù)參數(shù),用于函數(shù)帶參

20、數(shù)入/定義并初始化變量FILE *fp;char ch;unsigned char r1,r2;unsigned int count=0,checksum=0,rp=0;unsigned long int sum=0;/打開文件argb1if(fp=fopen("d:jiaoyan.txt","r")=NULL)printf("nn File can't be opened");exit(1);printf("nnthe type of output:data-sumnn");/從txt文件讀取字符,并進(jìn)行

21、數(shù)據(jù)處理while(1)if(ch=etc(ft)!=EOF)count+;if(ch!=' ')if(count%12=0)printf("n"); /將字符轉(zhuǎn)換成相應(yīng)的整形變量if(ch>='0'&&ch<='9')ch-='0'elseif(ch>='a'&&ch<='f')ch=ch-'a'+10;elseif(ch>='A'&&ch<='F')ch=ch-'A'+10; /

溫馨提示

  • 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

提交評論