ip校驗和字段是用來檢驗資料傳輸正確性的。在傳送資料時,為了計算
ip資料報的校驗和,按如下步驟:
(1)把ip
資料報的校驗和字段置為0;
(2)把首部看成以
16位為單位的數字組成,依次進行二進位制反碼求和;
(3)把得到的結果存入校驗和字段中。
在接收方,要驗證資料的正確性,按如下步驟:
(1)把首部看成以
16位為單位的數字組成,依次進行二進位制反碼求和,包括檢驗和字段;
(2)檢查計算出的校驗和的結果是否為0;
(3)如果等於零,說明檢驗和正確,否則,檢驗和是錯誤的,協議棧會拋棄這個資料報。
在一般的協議棧中,這個檢驗和演算法的實現大多為
c語言寫的,因為
c語言不光移植
性好,而且執行效率也高,演算法如下:
unsigned short checksum(unsigned short *buf,int nword)
舉個例子:
ip頭資料:
01000101 (
17664)
00000000
00000000 01001110
10010101 01010110
00000000 00000000
10000000
00100011
11000110 01100000
00001010 01101000 00000100 00011010
00001010 01101000 00000101 11111111
我們是要執行
checksum
函式,把返回的
sum結果填到
checksum
字段。
基本過程就是,將
ip頭部(包括可選項)以
32位為單位進行進製加法運算,將得到的結果的低
16位和高
16相加,然後最終結果取反即我們的
checksum。
然後接收方可進行校驗。
以上參考:
下面看看如何在
python
中實現:
#!usr/bin/python
import readpcapfile
import struct
def ip_headchecksum(ip_head):
checksum = 0
headlen = len(ip_head)
i=0while i
temp = struct.unpack('!h',ip_head[i:i+2])[0]
checksum = checksum+temp
i = i+2
checksum = (checksum>>16) + (checksum&0xffff)
checksum = checksum+(checksum>>16)
return ~checksum
packet_data =
readpcapfile.rdpcap('c:\\python25\\code\\pcap\\pcapreader\\pcap\\test_ether.pcap')
# get the first packet of ip field (20 bytes)
tem = packet_data[0][1][14:34]
result = ip_headchecksum(tem)
print result
結果是-65536
,是65535
的補碼。
其中的ip資料報用到了以前寫的讀取pcap檔案的模組。
ip檢驗和演算法分析與實現
為了計算乙份資料報的ip檢驗和,首先把檢驗和字段置為0。然後,對首部中每個16bit進 行二進位制反碼求和 整個首部看成是由一串16bit的字組成 結果存在檢驗和字段中。當收到乙份ip資料報後,同樣首部中每個16bit進行反碼求和。由於接收方在計算過程中 包含了傳送方存在首部中的檢驗和,因為如果首部...
Ip 首部檢驗和字段
ip icmp igmp tcp udp等協議的校驗和演算法都是相同的,演算法如下 在傳送資料時,為了計算數ip據報的校驗和。應該按如下步驟 1 把ip資料報的首部都置為0,包括校驗和字段。2 把首部看成以16位為單位的數字組成,依次進行二進位制反碼求和。3 把得到的結果存入校驗和字段中。在接收資料...
IP首部檢驗和計算
計算ip首部檢驗和 如上圖,計算?是多少?計算 從08 00之後開始計算到後面的08 00即 兩個位元組的相加 45 00 00 20 d5 56 00 00 80 01 de b7 45 5d c0 a8 00 dc 等於 3800f 然後溢位的再次加到後面即 800f 3 等於 8012 最後用...