校驗和

校驗和

檢驗和(checksum),在數據處理和數據通信領域中,用於校驗目的地一組數據項的和。它通常是以十六進制為數制表示的形式。如果校驗和的數值超過十六進制的FF,也就是255. 就要求其補碼作為校驗和。通常用來在通信中,尤其是遠距離通信中保證數據的完整性和準確性。

基本介紹

  • 中文名:校驗和
  • 外文名:checksum
  • 適用領域數據處理和數據通信領域
  • 用途:用於校驗目的地一組數據項的和
  • 數值:0~255
  • 套用學科:計算機原理
校驗和簡介,步驟,表示,檢驗和程式,

校驗和簡介

這些數據項可以是數字或在計算檢驗的過程中看作數字的其它字元串。校驗和(checksum)是指傳輸位數的累加,當傳輸結束時,接收者可以根據這個數值判斷是否接到了所有的數據。如果數值匹配,那么說明傳送已經完成。TCP和UDP傳輸層都提供了一個校驗和與驗證總數是否匹配的服務功能。
它通常是以十六進制為數制表示的形式,如:
十六進制串:
1
0102030405060708
的校驗和是: 24 (十六進制)
如果校驗和的數值超過十六進制的FF,也就是255,就要求其補碼作為校驗和。
通常用來在通信中,尤其是遠距離通信中保證數據的完整性和準確性。

步驟

傳送方生成檢驗和
1.將傳送的進行檢驗和運算的數據分成若干個16位的位串,每個位串看成一個二進制數,這裡並不管字元串代表什麼,是整數、浮點數還是點陣圖都無所謂。
2.將IPUDPTCP的PDU首部中的檢驗和欄位置為0,該欄位也參與檢驗和運算。
3.對這些16位的二進制數進行1的補碼和(one's complement sum)運算,累加的結果再取反碼即生成了檢驗碼。將檢驗碼放入檢驗和欄位中。
其中1的補碼和運算,即帶循環進位(end round carry)的加法,最高位有進位應循環進到最低位。反碼即二進制各位取反,如0111的反碼為1000。
接收方校驗檢驗和
1.接收方將接收的數據(包括檢驗和欄位)按傳送方的同樣的方法進行1的補碼和運算,累加的結果再取反碼。
2.校驗,如果上步的結果為0,表示傳輸正確;否則,說明傳輸有差錯。
檢驗和算法示例
圖5.7所示為一個只包含4個16位二進制數進行檢驗和運算的簡單例子。圖5.7(a)所示為傳送方的運算,①、②、③是3個數據,④是檢驗和,先置0,也參加檢驗和運算。⑤是它們的一的補碼和,⑥是⑤的反碼。傳送方將⑥放到檢驗和欄位和數據一起發出。圖5.7(b)所示為接收方的運算,如果沒有傳輸差錯,最後結果應為0。
校驗和

表示

如:
十六進制串: 0102030405060708
的校驗和是: 24 (十六進制)
IP首部校驗和計算
IP首部校驗和欄位是根據IP首部計算的校驗和碼,它不對首部後面的數據進行計算。ICMP、IGMP、UDP和TCP在它們各自的首部中均含有同時覆蓋首部和數據校驗和碼。
為了計算一份數據報的IP檢驗和,首先把檢驗和欄位置為0。然後,對首部中每個16bit進行二進制反碼求和(整個首部看成是由一串16bit的字組成),結果存在檢驗和欄位中。當收到一份IP數據報後,同樣對首部中每個16bit進行二進制反碼的求和。由於接收方在計算過程中包含了傳送方存在首部中的檢驗和,因此,如果首部在傳輸過程中沒有發生任何差錯,那么接收方計算的結果應該為全1。如果結果不是全1(即檢驗和錯誤),那么IP就丟棄收到的數據報。但是不生成差錯報文,由上層去發現丟失的數據報並進行重傳。
TCP和UDP校驗和計算
校驗和還包含一個96位的偽首標,理論上它位於TCP首標的前面。這個偽首標包含了源地址、目的地址、協定和TCP長度等欄位,這使得TCP能夠防止出現路由選擇錯誤的數據段。這些信息由網際協定(IP)承載,通過TCP/網路接口,在IP上運行的TCP調用參數或者結果中傳遞。
偽首部並非UDP數據報中實際的有效成分。偽首部是一個虛擬的數據結構,其中的信息是從數據報所在IP分組頭的分組頭中提取的,既不向下傳送也不向上遞交,而僅僅是為計算校驗和。
這樣的校驗和,既校驗了UDP用戶數據的源連線埠號和目的連線埠號以及UDP用戶數據報的數據部分,又檢驗了IP數據報的源IP位址和目的地址。(偽報頭保證UDP和TCP數據單元到達正確的目的地址。因此,偽報頭中包含IP位址並且作為計算校驗和需要考慮的一部分。最終目的端根據偽報頭和數據單元計算校驗和以驗證通信數據在傳輸過程中沒有改變而且到達了正確的目的地址。)
檔案校驗和
在Windows中,exe校驗和是沒有必要的,因為系統會負責檢查,錯誤的exe將無法運行。但是sys檔案和關鍵的dll檔案是被要求要校驗和的。

檢驗和程式

#include<stdio.h>int main(){ int a[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; int i,sum=0; for (i=0;i<8;i++)     sum+=a[i];//將每個數相加     if(sum>0xff)     {        sum=~sum;                         sum+=1;                         } sum=sum&0xff;  printf("0x%x\n",sum);}

相關詞條

熱門詞條

聯絡我們