摘要1 課程設計目的 1
2 課程設計要求 1
3 相關知識 1
4 課程設計分析 1
5 程式** 1
6 執行結果與分析 1
7 參考文獻 1
校驗和是用於驗證資料傳輸正確性的一種方法。在網路體系結構的各層協議中,
很多網路協議都利用校驗和來實現差錯控制功能。本課程設計主要目的是通過完
成乙個簡單例子,了解網路協議中的校驗和計算過程。
根據校驗和的演算法,編寫程式為給定資料計算校驗和
1)以命令列形式執行:
checksum input_file
其中checksum為程式名,input_file為輸入資料檔名
2)輸出內容:資料檔案的校驗和
1校驗和的概念
網路上的資料最終都是通過物理傳輸線路進行傳輸的,如果高層沒有採用差錯控制,那
麼物理層傳輸的線路可能有差錯。為了保證傳輸資料的正確性,在物理層的基礎上設計
了資料鏈路層。設計資料鏈路層的主要目的就是在原始的,有差錯的物理傳輸線路的基
礎上,採用差錯檢測,差錯控制和流量控制等方法。
目前,進行差錯檢測和控制的主要方法是:傳送方在需要傳送的資料後面增加一定的
冗餘資訊,這些冗餘資訊通常是通過對傳送的資料進行某種演算法計算而得到的。接收方
對接收資料進行同樣的計算,然後與資料後面附加的冗餘資訊進行比較,如果比較結果
不同就說明在傳輸**現了差錯,並要求傳送方重新傳送該資料,以此達到確保資料準確
性的目的。在普遍使用的網路協議中,通常都設定了校驗和字段以儲存這些冗餘資訊,計算
這些校驗和的演算法,就是將被校驗的資料按16位進行累加,然後取反碼,如果資料位元組長
度為奇數,則資料尾部補乙個位元組的0以湊成偶數。關於計算校驗和演算法的詳細資訊請參考
rfc1071.
2計算校驗和
有很多數學方法可以提高校驗和的速度。
1)交換性和結合性
因為校驗和主要考慮被校驗資料中所包含位元組的數量是奇數還是偶數,所以校驗和的計算可
以以任意順序進行,甚至可以把資料進行分組後再計算。
例如,用a,b,c,d,……,y,z分別表示一系列八位組,用[a,b]這樣的位元組來表示a*256+b的整數,那麼16位校驗和就可以通過以下形式給出:
[a,b]+』[c,d]+』……+』[y,z] [1]
[a,b]+』[c,d]+』……+』[z,0] [2]
在這裡+』代表1補數加法,即將前面的16位校驗和和按位取反。
[1]可以以
[a,b]+』[c,d]+』……+』[j,0]+』([0,k]+』……+』[y,z]) [3] 的形式進行計算。
2)位元組順序的自主性
打破被校驗資料中的位元組順序仍可以計算正確的16位校驗和。
例如,我們交換位元組組中兩位元組的順序,得到
[b,a]+』[d,c]+』……+』[z,y]
所得到的結構與[1]式是相同的(當然結果也是要進行一次反轉的)。為什麼會是這樣呢?我們發現兩種順序獲得的進製是相同的,都是從第15位到第0位進製以及從第7位到第8位進製。
這也就是說,交換位元組位置只是改變高低位位元組的排列順序但並沒有改變他們的內在聯絡。因此無論底層的硬體設定中對位元組的接收順序如何,校驗和都可以被準確地校驗出來。例如,假設校驗和是以主機序(高位位元組在前低位位元組在後)計算的資料幀,但以網路序(低位位元組在前高位位元組在後)存放在記憶體中。
每乙個16位的字中的位元組在傳送過程中都交換了順序,在計算校驗和之後仍會先交換位置再存入記憶體,這樣就與接受到的原本以網路序儲存的資料幀中的校驗和項保持一致了。
3)平行計算
某些機器的字處理長度是16位的倍數,這樣可以提高他的計算速度。由於加法所具有的
結合性,我們沒有必要按照順序對每個位元組進行累加。相反,我們可以利用這一特點對他們進行並行累加。並行地計算校驗和只是增加了每次累加資訊的長度,例如,在乙個32 位的機器上,我們可以一次增加4個位元組,即【a,b,c,d】+...。
計算結束後再把累加和「摺疊」起來,把乙個32位的數值變成16位,這樣產生的新的進製也要迴圈累加起來。
此外,在此仍不需要考慮位元組順序問題,通過交換16位校驗和中的位元組序來得到正確的值。這些改變順序的方法都是為了所有的偶數位元組進入乙個校驗和位元組,所有的奇數位元組進入乙個校驗和位元組。?
3一些編碼技術可以提高校驗和的計算速度
1)延遲進制法
這種方法在主要的累加迴圈結束之後再把進製累加進和值。?
其實現方式就是用32位的累加器獲得16位校驗和,這樣溢位就產生在高16位上。這種方法避免了累加器中進製感測器機構的設定,但是它要求的容量是原來的累加器容量的兩倍,因此它更多地依賴於硬體條件。
2)反向迴圈法
這種方法可以減少由迴圈而產生的負荷,有效地展開內部的累加迴圈,把迴圈過程中的一系列加法命令複製下來。這種技術通常可以節省大量的時間,但是程式的邏輯設計會比較複雜。
3)合併資料拷貝法
計算校驗和以及讀入資料都需要將資料從記憶體的乙個位置轉移到另乙個位置,這樣會占用記憶體匯流排的頻寬,而記憶體匯流排的傳輸效率是提高校驗和?
計算速度的瓶頸,尤其是對於某些機器(如一些簡單的慢速的微型機)來說,這一問題尤為嚴重。?
為了解決這個問題,可以把資料讀入的過程與校驗的過程合二為一,也就是在讀入資料的同時計算校驗和,這樣就可以省去一次資料移動的過程,從而提高校驗和的計算速度。
校驗和的計算過程主要分為三個步驟:資料檔案的輸入、校驗和的計算和校驗結果的輸出。其中,主要的是輸入和校驗和的計算。
資料輸入的方式
輸入資料可能是由字元型式儲存的,而校驗和的計算則要採取資料形式,所以在檔案讀取資料時,都要進行字元到資料的相互轉換。
將讀入的ascii碼轉化為相應的整型變數。
if(ch>=』0』&&ch<=』9』)
ch-=』0』;
else
在使用c++程式設計時直接使用16進製制的方式開啟輸入檔案。
ifstream in(ar**[1],ios::nocreate);
校驗和的計算
校驗和演算法是本程式的核心部分,應用最普遍的是端迴圈進制法。
端迴圈進制法的演算法如下:將資料按一定位數進行累加,最高位的進製則迴圈加入最低位。待校驗的資料按16位為乙個單位相加,採用端迴圈進製,最後對所得16位的資料取反碼。
因為待校驗的資料是以位元組方式分隔的,所以為了方便,將16位的資料分成高8位和低8位分別處理。該演算法的**如下:
endaroundcarry(int&highbyte,int&lowbyte)
程式流程圖
是否圖4-1
圖4-2
傳送端#include
#include
#include
#include//開啟檔案操作
using std::string;
using std::cin;
using std::cout;
using std::endl;
using std::fstream;
int sum(int &ans, int& p, string str);//宣告計算校驗和函式
void main()
{ cout << "請輸入資料" << endl;
string in, out;
cin >> in;
int ans = 0, p = 0;
sum(ans, p, in);
ans = 65535 - ans;//計算校驗和,取反碼
cout << "校驗和為" << ans << endl;
//將資料輸出到檔案
fstream file(, std::ios::binary|std::ios::out);
計算機網路設計和規劃
一 填空題 1 常見的拓撲結構有星狀拓撲 匯流排型拓撲 環狀拓撲 樹狀拓撲和網狀拓撲 2 響應時間分為主從結構的響應時間和客戶機 伺服器結構的響應時間 3.在網路分析和設計過程中,產生的檔案有需求分析說明書 通訊規範說明書 邏輯網路設計說明書和物理網路說明書 4.按照文件的提出和使用的範圍,大致可以...
計算機網路
杜拉拉三年以上工作經驗 女 27歲 1982年10月18日 居住地 北京 139 手機 e mail 最近工作 3 年10個月 公司 xx銀行軟體開發 北京 行業 金融 投資 職位 高階軟體工程師 最高學歷 學歷 碩士 專業 計算機網路 學校 英國桑德蘭大學 自我評價 外資銀行工作經驗,有ibm主機...
計算機網路
務。它包括群體工作方式研究和支援群體工作的相關技術研究兩部分。通過建立協同工作環境,改善人們通訊的方式,消除或減少在時間和空間上的障礙,從而節省工作人員的時間和精力,提高群體工作質量和效率。計算機協同工作將計算機技術 網路通訊技術 多 技術及各項社會科學緊密結合起來,可向人們提供一種全新的交流方式。...