在進行計算之前先補充一下基礎知識。
原碼是計算機機器數中最簡單的一種形式,數值位就是真值的絕對值,符號位位「0」時表示正數,符號位為「1」時表示負數,原碼又稱帶符號的絕對值。為了方便整數和小數區別,整數的符號位與數值位之間用「,」隔開,小數的符號位與數值位之間用「.」隔開。
舉例:以8位機器數為例,整數的「+0」原碼為0,0000000;整數的「-0」原碼為1,0000000;小數的「+0」原碼為0.0000000,小數的「-0」原碼為1.0000000
正數的反碼就等於原碼,負數的反碼相當於除了符號位之外,其他位取反。
舉例:整數的「+0」反碼為0,0000000;整數的「-0」原碼為1,1111111;小數的「+0」原碼為0.0000000,小數的「-0」原碼為1.1111111
正整數的補碼是其二進位制表示,與原碼相同;
負整數的補碼為反碼加1;
舉例:+1的補碼為0,0000001;
-1的補碼為1,111 1111
這個字段用來檢驗資料報的首部,不包括資料部分。資料報每經過乙個路由器,路由器都要重新計算首部檢驗和。不檢驗資料部分可以減小計算量。
計算方法: 先把ip資料報首部化為許多16位的序列,並把檢驗和字段置零。用反碼運算把所有16字相加後,將得到的和的反碼寫入檢驗和字段。接收方收到資料後,將首部的所有16位子序列再使用反碼算術符相加一次,將得到的和取反碼。如果首部未發生任何變化,那麼這個和肯定為0。否則認為出差錯,並將此資料報丟棄。
反碼相加:從低位向高位計算,0 0 得0 ,0 1 得1 ,1 1 得0 進1,如果最高位相加後產生進製,最後得到的結果加1。
例題:設ip資料報使用固定首部,其個字段的數值如圖。計算下列ip資料報首部的檢驗和,各字段的數值如圖
反碼運算:
01110100 01001110
取反,得到檢驗和字段:
10001011 10110001
使用16進製制演算法(每16位二進位制數字,轉換為4個十六進製制數字表示)
4 5 0 —>4500
28 ---->001c
1 --------->0001
0 0 —>0000
4 17 ---->0411
10.12.14.5 —> 0a0c 0e05
12.6.7.9 -->0c06 0709
加法結果:744e
反碼:8bb1
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 最後用...
Linux 核心IP和UDP檢驗和計算
ip checksum a.接收報文 struct iphdr iph ip hdr skb if unlikely ip fast csum u8 iph,iph ihl goto checksum error b.傳送報文 ip send check iph udp checksum a.網絡卡...
IP資料報格式
版本字段長度為4,用來表明建立資料報的ip版本,目前的ip版本是ipv4,ipv6正在發展中。ipv4的字段為0100 首部長度 報頭長度 指的是首部佔32 bit字的數目,包括任何選項。由於它是乙個4位元字段,因此首部最長為60個位元組。15x32 8 60位元組.ip首部始終是32 bit的整數...