校驗算法:將cksum字段填0,然後以每16位爲單位將各個單元相加,得到的值一般會長於16位,則先取後16位記爲A,然後右移16位得到B,令A+B得到cksum,如果還長於16位則繼續上一步驟。最後將cksum填入相應字段。由於路由器通常只修改IP報文的TTL字段,那麼轉發時將其cksum+1即可,而不需重新計算。
- public static UInt16 SumOfCheck(UInt16[] buffer)
- {
- int cksum = 0;
- for(int i =0; i<buffer.Length; i++)
- cksum += (int) buffer[i];
- while(cksum >> 16 !=0) //調整爲16位
- cksum = (cksum >> 16) + (cksum & 0xffff);
- return (UInt16) (~cksum);//按位取反
- }