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个小时。
本文详细介绍了ICMPv6协议中校验和的计算方法,包括虚拟头部结构及其字段说明,并提供了具体的C语言实现代码示例。此外还提到了在位流中赋值时需要注意的操作。
969

被折叠的 条评论
为什么被折叠?



