1 IPv6的icmp,tcp,udp的checksum需要添加虚拟头,结构如下
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
+
+
|
|
+
Source Address
+
|
|
+
+
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
+
+
|
|
+
Destination Address
+
|
|
+
+
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
Upper-Layer Packet Length
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
zero
|
Next Header
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2 checksum 的计算代码
USHORT Checksum(USHORT *buffer, int size, int more)
{
unsigned long cksum=0;
while(size >1)
{
cksum+=ntohs(*buffer);
buffer ++;
size -=sizeof(USHORT);
}
if(size)
cksum += *(UCHAR*)buffer;
cksum += more;
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
//return (USHORT)(cksum);
return (USHORT)(~cksum);
}
3 赋值到bit流时,需要
icmp->checksum = htons(icmp->checksum);
花费 8个小时。