當前位置:首頁 » 網路連接 » 計算機網路怎麼計算首部校驗和例子

計算機網路怎麼計算首部校驗和例子

發布時間: 2022-06-08 06:23:03

❶ 首部檢驗和怎麼計算 能舉例說明嗎(可以舉計算機網路 第五版P176 13題)我真的想弄明白!

IP數據報是將首部每16bit的數據相加求反碼和,反碼和計算就是將高位進位循環加到低位上,直到高位沒有溢出,TCP UDP校驗包括偽首部和數據報的校驗

❷ 計算機網路的一個習題求解,解答看不懂,題目和解答如下!關於首部檢驗和的計算。

首部檢驗的方法是,吧首部分成一些16字的序列,將首部檢驗置0,然後對這些序列進行反碼算數運算。求出來的這個和的反碼放入首部檢驗位(16位)。收到數據報時進行檢驗:就是把首部再反碼求和一遍,然後再取反碼,這時應該得到0。

所以說前五行就是首部的前五行。
然後接下來的五行就是,換算成2進制的序列。
將這些序列16位的取反碼合(包括和檢驗欄位)得出來首部檢驗和發送前的值。
0111010001001110
然後再取反碼放入首部檢驗位
1000101110110001
沒有算,不過算出來應該就是這樣。
反碼求和時最高位相加產生進位的話結果要+1.

❸ tcp頭部校驗和計算方法的實現需要什麼軟體來實現

以前看計算機網路相關的書,每次看到IP或者UDP報頭校驗和時,都一瞥而過,以為相當簡單,不就是16bit數據的相加嗎。最近在研究《TCP/IP詳解 卷1:協議》這本書,看到校驗和是16bit字的二進制反碼和(暈,以前都沒注意原來是反碼和,看來以前看書不仔細啊!罪過,罪過~~),覺得很奇怪,為什麼會用反碼和,而不是直接求和呢?(因為我認為TCP/IP協議裡面的演算法和思想一般都是非常經典的,人家這么做一定有原因的)下面就來探索一下這個校驗和演算法具體怎麼實現的。 首先,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位元組,第一位元組補0)和TCP/UDP包長(2位元組)。另外UDP、TCP數據報的長度可以為奇數位元組,所以在計算校驗和時需要在最後增加填充位元組0(注意,填充位元組只是為了計算校驗和,可以不被傳送)。 這里還要提一點,UDP的校驗和是可選的,當校驗和欄位為0時,表明該UDP報文未使用校驗和,接收方就不需要校驗和檢查了!那如果UDP校驗和的計算結果是0時怎麼辦呢?書上有這么一句話:如果校驗和的計算結果為0,則存入的值為全1(65535),這在二進制反碼計算中是等效的。 講了這么多,那這個校驗和到底是怎麼算的呢? 1. 什麼是二進制反碼求和 對一個無符號的數,先求其反碼,然後從低位到高位,按位相加,有溢出則向高位進1(跟一般的二進制加法規則一樣),若最高位有進位,則向最低位進1。 首先這里的反碼好像跟我們以前學的有符號數的反碼不一樣(即正數的反碼是其本身,負數的反碼是在其原碼的基礎上,符號位不變,其餘各位取反),這里不分正負數,直接每個位都取反! 下面再舉例兩種二進制反碼求和的運算: 原碼加法運算 反碼加法運算 3(0011)+ 5(0101)= 8(1000) 3(1100)+ 5(1010)= 8(0111) 8(1000)+ 9(1001)= 1(0001) 8(0111)+ 9(0110)= 2(1101) 從上面兩個例子可以看出,當加法未發生溢出時,原碼與反碼加法運算結果一樣;當有溢出時,結果就不一樣了,原碼是滿10000溢出,而反碼是滿1111溢出,所以相差正好是1。舉例只是為了形象地觀察二進制反碼求和的運算規則,至於為什麼要定義這樣的規則以及該運算規則還存在其它什麼特性,可能就需要涉及代數理論的東西的了(嗚嗚~~數學理論沒學好啊,只能從表面上分析分析)。 另外關於二進制反碼求和運算需要說明的一點是,先取反後相加與先相加後取反,得到的結果是一樣的!(事實上我們的編程演算法里,幾乎都是先相加後取反。) 2. 校驗和演算法的實現 講了什麼是二進制反碼求和,那麼校驗和的演算法實現就簡單多了。廢話少說,直接上代碼: 復制代碼代碼如下: [cpp] view plain //計算校驗和 USHORT checksum(USHORT *buffer,int size) { unsigned long cksum=0; while(size1) { cksum+=*buffer++; size-=sizeof(USHORT); } if(size) { cksum+=*(UCHAR *)buffer; } //將32位數轉換成16 while (cksum16) cksum=(cksum16)+(cksum 0xffff); return (USHORT) (~cksum); } buffer是指向需校驗數據緩存區的指針,size是需校驗數據的總長度(位元組為單位) 4~13行代碼對數據按16bit累加求和,由於最高位的進位需要加在最低位上,所以cksum必須是32bit的unsigned long型,高16bit用於保存累加過程中的進位;另外代碼10~13行是對size為奇數情況的處理! 14~16行代碼的作用是將cksum高16bit的值加到低16bit上,即把累加中最高位的進位加到最低位上。這里使用了while循環,判斷cksum高16bit是否非零,因為第16行代碼執行的時候,仍可能向cksum的高16bit進位。有些地方是通過下面兩條代碼實現的:cksum = (cksum 16) + (cksum 0xffff); cksum += (cksum 16);這里只進行了兩次相加,即可保證相加後cksum的高16位為0,兩種方式的效果一樣。事實上,上面的循環也最多執行兩次! 17行代碼即對16bit數據累加的結果取反,得到二進制反碼求和的結果,然後函數返回該值。

❹ 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的整數倍速(這是首部長度欄位所要求的

❺ IP首部檢驗和

一個一個的來解答樓主的問題吧。
(1)反碼求和是先求反碼再求和,而正數的反碼是本身,上面的IP首部轉換成二進制如下:
0100 0101 0000 0000 0000 0000 0010 1110
1011 1110 0101 0101 0000 0000 0000 0000
0111 1010 0001 0001 0000 0000 0000 0000
1101 1110 1011 0111 0111 1110 1110 0011
0011 0000 1010 1000 0001 0010 0111 1010
因為是每16bit進行二進制反碼求和,所以轉換如下:
0100 0101 0000 0000
0000 0000 0010 1110
1011 1110 0101 0101
0000 0000 0000 0000
0111 1010 0001 0001
0000 0000 0000 0000
1101 1110 1011 0111
0111 1110 1110 0011
0011 0000 1010 1000
0001 0010 0111 1010
對這10個16Bit的二進制碼進行求和就可以得到3ae50的結果,二進制求和比較簡單,在這邊略過。
(2)為什麼要3+ae50=ae53?
因為IP 、UDP、ARP、TCP的檢驗和是16bit,而3ae50是18bit,所以需要對3ae50進行轉換,即3+ae50。我的理解是這樣的,不知樓主是否贊同?
(3) 為什麼要進行 ae53+51ac=ffff?
檢驗和分為發送端的檢驗和與接收端的檢驗和。發送端校驗和為ae53,接收端收到數據之後將按照同樣地方法計算校驗和,如果發送端校驗和加上接收端校驗和為FFFF,則表示部首傳輸沒有發生錯誤。

❻ 怎麼計算UDP檢驗和(最好是有詳細例子分析)

首先,把偽首部、首部、和數據部,按順序劃分成多個雙位元組單元;最後不足兩個位元組補一個全零位元組。
其次,對這些雙位元組單元進行二進制反碼運算求和;
最後,對求得的和取反,放入檢驗和欄位。

二進制反碼求和運算:對應列相加,1 + 0 =1 ;0+0= 0 ; 1+1 =0 ,產生進位;最高位進位加到和的末尾。

❼ 首部檢驗和怎麼計算

IP首部校驗和的計算方法:

把校驗和欄位清零,對每16位(2位元組)進行二進制反碼求和, 反碼求和的意思是先對每16位求和,再將得到的和轉為反碼。

IP數據報校驗只對首部進行校驗,不對數據部分進行校驗。把首部看成16位為單位的數字組成,依次進行二進制反碼求和,再把結果依次存入校驗和欄位中即可。

(7)計算機網路怎麼計算首部校驗和例子擴展閱讀:

將發送的進行檢驗和運算的數據分成若干個16位的位串,每個位串看成一個二進制數,這里並不管字元串代表什麼,是整數、浮點數還是點陣圖都無所謂。將IP、UDP或TCP的PDU首部中的檢驗和欄位置為0,該欄位也參與檢驗和運算。

對這些16位的二進制數進行1的補碼和(one's complement sum)運算,累加的結果再取反碼即生成了檢驗碼。將檢驗碼放入檢驗和欄位中。

其中1的補碼和運算,即帶循環進位(end round carry)的加法,最高位有進位應循環進到最低位。反碼即二進制各位取反,如0111的反碼為1000。

如何計算UDP/TCP檢驗和checksum

如何計算UDP/TCP檢驗和checksum

一、下面的圖是一個UDP的檢驗和所需要用到的所有信息,包括三個部分:
1.UDP偽首部
2.UDP首部
3.UDP的數據部分(切記不要遺漏該部分,否則就~吐血了~)

首先解釋下偽首部的概念,偽首部包含IP首部一些欄位。其目的是讓UDP兩次檢查數據是否已經正確到達目的地,只是單純為了做校驗用的。
還有一個概念十分重要,那就是16位UDP總長度,請注意該長度不是報文的總長度,而只是UDP(包括UDP頭和數據部分)的總長度(之前就是因為這個概念沒弄清楚,走了不少彎路,吐血~~)。

二、計算檢驗和(checksum)的過程很關鍵,主要分為以下幾個步驟:
1.把偽首部添加到UDP上;
2.計算初始時是需要將檢驗和欄位添零的;
3.把所有位劃分為16位(2位元組)的字

4.把所有16位的字相加,如果遇到進位,則將高於16位元組的進位部分的值加到最低位上,舉例,0xBB5E+0xFCED=0x1 B84B,則將1放到最低位,得到結果是0xB84C
5.將所有字相加得到的結果應該為一個16位的數,將該數取反則可以得到檢驗和checksum。

三、事實勝於雄辯,還是舉個例子來分析一下吧,該例子計算的是一個TCP的檢驗和(和UDP的演算法一致)
TCP計算檢驗和的報文結構如下所示:

抓包工具抓了一個TCP 的syn報文做研究,呵呵,下面就是整個報文:

1.首先將檢驗和部分添零;
2.然後將TCP偽首部部分,TCP首部部分,數據部分都劃分成16位的一個個16進制數;
3.將這些數逐個相加,記得溢出的部分加到最低位上,這是循環加法:
0xc0a8+ 0x0166+……+0x0402=0x9b49
4.最後將得到的結果取反,則可以得到檢驗和位0x64B6

按照上述步驟進行計算就可以得到檢驗和為0x64B6,大家也可以試試看
IP數據報只檢驗IP數據報的首部,但UDP檢驗的是把首部和數據部分一起都檢驗。

❾ 計算機網路,UDP數據報的校驗和欄位是通過什麼來校驗源和目的IP的呢

其實這是一種加密技術用於對文件內容進行審計的方法,使用 精通讀文件把文件讀到內存中,再對文件內容作一個 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