『壹』 校驗和cks怎麼計算
如下圖所示,就是求補碼。
『貳』 校驗和怎麼計算
檢驗和(checksum),在數據處理和數據通信領域中,用於校驗目的地一組數據項的和。它通常是以十六進制為數製表示的形式。如果校驗和的數值超過十六進制的FF,也就是255. 就要求其補碼作為校驗和。通常用來在通信中,尤其是遠距離通信中保證數據的完整性和准確性。
這些數據項可以是數字或在計算檢驗的過程中看作數字的其它字元串。校驗和(checksum)是指傳輸位數的累加,當傳輸結束時,接收者可以根據這個數值判斷是否接到了所有的數據。如果數值匹配,那麼說明傳送已經完成。TCP和UDP傳輸層都提供了一個校驗和與驗證總數是否匹配的服務功能。[1]
它通常是以十六進制為數製表示的形式
發送方生成檢驗和
1.將發送的進行檢驗和運算的數據分成若干個16位的位串,每個位串看成一個二進制數,這里並不管字元串代表什麼,是整數、浮點數還是點陣圖都無所謂。
2.將IP、UDP或TCP的PDU首部中的檢驗和欄位置為0,該欄位也參與檢驗和運算。
3.對這些16位的二進制數進行1的補碼和(one'scomplementsum)運算,累加的結果再取反碼即生成了檢驗碼。將檢驗碼放入檢驗和欄位中。
其中1的補碼和運算,即帶循環進位(end round carry)的加法,最高位有進位應循環進到最低位。反碼即二進制各位取反,如0111的反碼為1000。
接收方校驗檢驗和
1.接收方將接收的數據(包括檢驗和欄位)按發送方的同樣的方法進行1的補碼和運算,累加的結果再取反碼。
2.校驗,如果上步的結果為0,表示傳輸正確;否則,說明傳輸有差錯。
『叄』 校驗和求計算計算過程最好給我講下
校驗和演算法
unsignedshortcheck_sum(unsignedshort*addr,intlen)
{
registerintnleft=len;
registerintsum=0;
registershort*w=addr;
shortanswer=0;
while(nleft>1)
{
sum+=*w++;
nleft-=2;
}
if(nleft==1)
{
*(unsignedchar*)(&answer)=*(unsignedchar*)w;
sum+=answer;
}
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
answer=~sum;
return(answer);
}
首先,IP、ICMP、UDP和TCP報文頭都有檢驗和欄位,大小都是16bit,演算法基本上也是一樣的。
在發送數據時,為了計算數據包的檢驗和。應該按如下步驟:
1、把校驗和欄位設置為0;
2、把需要校驗的數據看成以16位為單位的數子組成,依次進行二進制反碼求和;
3、把得到的結果存入校驗和欄位中
在接收數據時,計算數據包的檢驗和相對簡單,按如下步驟:
1、把首部看成以16位為單位的數字組成,依次進行二進制反碼求和,包括校驗和欄位;
2、檢查計算出的校驗和的結果是否為0;
3、如果等於0,說明被整除,校驗和正確。否則,校驗和就是錯誤的,協議棧要拋棄這個數據包。
雖然說上面四種報文的校驗和演算法一樣,但是在作用范圍存在不同:IP校驗和只校驗20位元組的IP報頭;而ICMP校驗和覆蓋整個報文(ICMP報頭+ICMP數據);UDP和TCP校驗和不僅覆蓋整個報文,而且還有12個位元組的IP偽首部,包括源IP地址(4位元組)、目的IP地址(4位元組)、協議(2位元組)、TCP/UDP包長(2位元組)。另外UDP、TCP數據報的長度可以為奇數位元組,所以在計算校驗和時需要在最後增加填充位元組0(填充位元組只是為了計算校驗和,可以不被傳送)。
在UDO傳輸協議中,校驗和是可選的,當校驗和欄位為0時,表明該UDP報文未使用校驗和,接收方就不需要校驗和檢查了!那如果UDP校驗和的計算結果是0時怎麼辦?書上有一句話:「如果校驗和的計算結果為0,則存入的值為全1(65535),這在二進制反碼計算中是等效的」
那麼校驗和到底怎麼計算了?
1、什麼是二進制反碼求和
對一個無符號的數,先求其反碼,然後從低位到高位,按位相加,有益處則向高位進1(和一般的二進製法則一樣),若最高位有進位,則向最低位進1.
首先這里的反反碼好像和以前學的有符號反碼不一樣,這里不分正負數,直接每個為都取反。
上面加粗的那句話和我們平時的加法法則不一樣,最高位有進位,則向最低位進1。確實有些疑惑,為什麼要這樣呢?自習分析一下,上面的這種操作,使得在發送加法進位溢出時,溢出值並不是10000,而是1111.也即是當相加結果滿1111時溢出,這樣也可以說明為什麼0000和1111都表示0了。
下面是兩種二進制反碼求和的運算:
原碼加法運算:3(0011)+5(0101)=8(1000)
8(1000)+9(1001)=1(0001)
反碼加法運算:3(1100)+5(1010)=8(0111)
8(0111)+9(0110)=2(1101)
從上面的例子中,當加法未發生溢出時,原碼與反碼加法運算結果一樣;當有溢出時,結果就不一樣了,原碼是滿10000溢出,而反碼是滿1111溢出,所以相差正好是1.
詳細代碼
『肆』 如何校驗和是通過一定的演算法掃描一個數據計算出的一個數值。用C語言
#include<stdio.h>
intQuicksum(char*str)//用指針做校驗函數的參數,來接收被校驗的字元串A;
{
intsum=0,loc=1,i,n;//sum代表校驗和,loc代表每個字元在字元串A里的位置;
char*p;
p=str;//將被校驗字元串A的地址賦值給字元指針p,用p表示位置;
n=strlen(p);//用strlen函數求出A的有效長度;
for(i=0;i<n;i++)//注意循環的次數。體會i<n的意思,保證能計算到每個字元
{
if((*p)==''){p++;loc++;continue;}//如果遇到空格,就將位置指針向後移動一個,跳過空格
//注意loc也要增加一,為了正確記錄每個字元的位置
sum+=((*p-'A')+1)*loc;//如果此處不是空格,就根據校驗計算該位置所代表的和,進行累加
loc++;//將位置指針移動到下一個字元,同時loc也跟著變化
p++;
}
returnsum;//返回校驗和
}
voidmain()
{
intjiaoyanhe;
char*string;
printf("Pleaseinput(A-Z):");
gets(string);//使用gets函數輸入字元串;
jiaoyanhe=Quicksum(string);//調用Quicksum函數進行校驗和的計算。
printf("jiaoyanhe:");
printf("%d ",jiaoyanhe);
}
上機運行的時候,把注釋全刪了吧,要不然可能運行出錯,多體會一下吧,這只是其中的一種方法而已,多上機運行代碼,理解下裡面的邏輯,好運。
『伍』 計算校驗和函數,解析每句的意思
/**
input :
USHORT *pBuf:數據指針
int iSize :數據長度
*/
USHORT checksum(USHORT *pBuf,int iSize)
{
unsigned long cksum=0; //累加和初始值
while(iSize>1) //多少個USHORT型數據
{
cksum+=*pBuf++; //算計累加和
iSize-=sizeof(USHORT); //個數-1
}
if(iSize) //如果有非對齊的下余數據
{
cksum+=*(UCHAR *)pBuf; //+餘下的數值
}
cksum=(cksum>>16)+(cksum&0xffff); //高16位+低16位
cksum+=(cksum>>16); // >=10000再+1
return (USHORT)(~cksum); // 返回它的反(USHORT型)
//這里是把cksum做個轉換,防止別人反向操作?
}
『陸』 java 如何計算校驗和,比如如下這段代碼如何修改
您好,1、 編寫一個計算機程序用來計算一個文件的16位效驗和。最快速的方法是用一個32位的整數來存放這個和。記住要處理進位(例如,超過16位的那些位),把它們加到效驗和中。
要求:1)以命令行形式運行:check_sum infile
其中check_sum為程序名,infile為輸入數據文件名。
2)輸出:數據文件的效驗和
附:效驗和(checksum)
原理:把要發送的數據看成二進制整數序列,並計算他們的和。若數據位元組長度為奇數,則在數據尾部補一個位元組的0以湊成偶數。
例子:16位效驗和計算,下圖表明一個小的字元串的16位效驗和的計算。
為了計算效驗和,發送計算機把每對字元當成16位整數處理並計算效驗和。如果效驗和大於16位,那麼把進位一起加到最後的效驗和中。
『柒』 CS校驗和 如何計算 請高手詳細解釋,急需,謝謝!
看時間挺久了,閑著也是閑著,隨便寫寫:
起始字元 68H
長度L
長度L
起始字元 68H
【控制域C
地址域A
鏈路用戶數據】
校驗和CS
所謂校驗和CS就是在第二個起始字元和校驗和之間的所有數據按16進制相加,取所得值的後兩位即為校驗和
『捌』 什麼是校驗和
其實這是一種加密技術用於對文件內容進行審計的方法,使用 精通讀文件把文件讀到內存中,再對文件內容作一個 MD5 校驗得到一串密碼,就是校驗和。
補充:
1、IP首部校驗和欄位是根據IP首部計算的校驗和碼,它不對首部後面的數據進行計算。ICMP、IGMP、UDP和TCP在它們各自的首部中均含有同時覆蓋首部和數據校驗和碼。
2、IP首部校驗和計算:
為了計算一份數據報的IP檢驗和,首先把檢驗和欄位置為0。然後,對首部中每個16bit進行二進制反碼求和(整個首部看成是由一串16bit的字組成),結果存在檢驗和欄位中。當收到一份IP數據報後,同樣對首部中每個16bit進行二進制反碼的求和。由於接收方在計算過程中包含了發送方存在首部中的檢驗和,因此,如果首部在傳輸過程中沒有發生任何差錯,那麼接收方計算的結果應該為全1。如果結果不是全1(即檢驗和錯誤),那麼IP就丟棄收到的數據報。但是不生成差錯報文,由上層去發現丟失的數據報並進行重傳。
3、TCP和UDP校驗和計算(兩者相同)
校驗和還包含—個96位的偽首標,理論上它位於TCP首標的前面。這個偽首標包含了源地址、目的地址、協議和TCP長度等欄位,這使得TCP能夠防止出現路由選擇錯誤的數據段。這些信息由網際協議(IP)承載,通過TCP/網路介面,在IP上運行的TCP調用參數或者結果中傳遞。
偽首部並非UDP數據報中實際的有效成分。偽首部是一個虛擬的數據結構,其中的信息是從數據報所在IP分組頭的分組頭中提取的,既不向下傳送也不向上遞交,而僅僅是為計算校驗和。
這樣的校驗和,既校驗了UDP用戶數據的源埠號和目的埠號以及UDP用戶數據報的數據部分,又檢驗了IP數據報的源IP地址和目的地址。(偽報頭保證UDP和TCP數據單元到達正確的目的地址。因此,偽報頭中包含IP地址並且作為計算校驗和需要考慮的一部分。最終目的端根據偽報頭和數據單元計算校驗和以驗證通信數據在傳輸過程中沒有改變而且到達了正確的目的地址。)
『玖』 在計算機網路中什麼是crc校驗和,怎麼計算
計算機網路原理的計算題(crc校驗和數據傳輸問題)第1題:設要發送的二進制數據為10110011,若採用crc校驗方法,生成多項式為x^4+x^3+1,度求出實際發送的二進制數字序列。(要求寫出計算
計算機網路原理的計算題(crc校驗和數據傳輸問題)
第1題:設要發送的二進制數據為10110011,若採用crc校驗方法,生成多項式為x^4+x^3+1,度求出實際發送的二進制數字序列。(要求寫出計算過程)
這是自考08年四月份的試題,我總是跟答案算的不一樣。
答案是:待發送的序列m=10110011,除數p=11001,m*2^5與除數p進行模2除法運算,得余數r=1000,所以要發送的二進制序列為:101100111000
我不明白為什麼m要乘以2的5次方,我是用101100110000除以11001得到的余數是100。
第2題:一條長度為100km的點對點鏈路,對於一個100位元組的分組,帶寬為多大時傳播延遲等於發送延遲?(信道傳輸速度為2*10^8m/s)
答案是:
傳播延遲為:100km/(2*10^8m/s)=50ms
發送延遲等於傳播延遲時:100/c=50ms
則信道傳輸速率:c=200kbps
『拾』 IP數據報首部校驗和演算法
普通的IP首部長20個位元組,除非含有選項欄位。
第一幀:4位版本
4位首部長度
8位服務類型(TOS)
16位總長度(位元組數)
第二幀:16位標識
3位標志
13位片偏移
第三幀:8位生存時間(TTL)
8位協議
16位首部校驗和
第四幀:32位源IP地址
第五幀:32位目的IP地址
第六幀:選項(如果有)
第七幀:數據
1.4位版本:IP所用版本,有IPv4, IPv6
2.4位首部長度:指的是佔32bit字的數目,包含任何選項。由於它是一個4bit欄位,因此首部最長為60個位元組。
3.服務類型(TOS)包括一個3bit的優先權子欄位(忽略),4bit的TOS子欄位和1bit未用位但須置0。4bit的TOS分別代表:最小延時、最大吞吐量、最高可靠性和最小費用。4bit中只能置其中一位,如4位均為0,則意味著是一般服務。
4.總長度欄位指整個IP數據報的長度,以位元組為單位。利用首部長度欄位和總長度欄位,就可以知道IP數據報中數據內容的起始位置和長度。由於該欄位長為16bit,所以IP數據報最長可達65535(超級通道的MTU為65535。它的意思其實不是一個真正的MTU,它使用了最長的IP數據報)。當數據報被分片時,該欄位的值也隨著變化。
盡管可以傳一個長達65535位元組的IP數據報,但是大多數的鏈路層都會對它進行分片,而且主機也要求不能接收超過576位元組的數據報。由於TCP把用戶數據分成若乾片,因此一般來說這個限制不會影響TCP。UDP的應用(如RIP,TFTP,BOOTP,DNS,及SNMP),它們都限制用戶數據報長度為512位元組,小於576位元組從而避免IP數據報分片。
但是現在大多數的實現(支持網路文件系統(NFS)的實現)允許超過8192位元組(8K)的IP數據報。
總長度欄位是IP首部中必要的內容,因為一些數據鏈路(如乙太網)需要填充一些數據以達到最小長度。盡管乙太網最小幀長為46位元組,但是IP數據可能會更短。如果沒有總長度欄位,那麼IP層就不知道46位元組中有多少是IP數據報的內容。
5.標識欄位唯一地標識主機發送的每一份數據報。通常每發送一份報文它的值就會增1。
6.TTL(time-to-live)生存時間欄位設置了數據報可以經過的最多路由器數。它指定了數據報的生存時間。TTL的初始值由源主機設定(通常為32或64)一旦經過一個處理它的路由器,它的值就減1。當該欄位值為0時,數據報就被丟棄,並發過ICMP報文通知源主機。
7.首部校驗和欄位是根據IP首部計算檢驗和碼。它不對後面的數據進行計算。ICMP、IGMP、UDP和TCP在它們各自的首部中均包含有同時覆蓋首部和數據檢驗和碼。為了計算一份數據報IP校驗和,首先把校驗欄位置為0。然後對首部中每個16bit進行二進制反碼求和,結果存放檢驗的欄位中。當收到一份數據報後,同樣對首部中的每個16bit進行二進制反碼求和。由於接收方在計算過程中包含了發送方存在首部中的校驗和,因此如果在傳輸過程中沒發生任何差錯,那麼接收方計算的校驗和結果應全為1。如果不全為1(即校驗和錯誤),那麼IP就丟棄收到的數據報。但不生成差錯報文,由上層去發現丟失的數據報並進行重傳。
ICMP,IGMP,TCP和UDP都採用相同校驗和演算法,盡管TCP和UDP除了本身的首部和數據外,在IP首部中還包含不同的欄位。
由於路由器經常只修改TTL欄位(減1),因此當路由器轉發一份報文時可以增加它的校驗和,而不需要對IP整個首部進行重新計算。
8.每一份IP數據報都包含源IP地址和目的IP地址。
9、選項:是數據報中一個可變長的信息。目前這些選項定義如下:
。安全和處理限制(用於軍事領域)
。記錄路徑(讓每個路由器都記錄下它的IP地址)
。時間戳 (讓每個路由器都記錄下它的IP地址和時間)
。寬松的源站選路 (為數據報指定一系列必須經過的IP地址)
。嚴格的源站選路(與寬松源站選路類似,但是要求只能經過這些指定的地址,不能經
過其它地址)。
這些選項很少被使用,並非所有的主機和路由都支持這些選項。
選項欄位一直都是以32bit作為界限,在必要時必須插入值為0的填充位元組。這樣就保證IP首部始終是32bit的整數倍速(這是首部長度欄位所要求的