ipv4和ipv6的 udp/tcp CRC校验和算法

IPheader.length是总长度(占16比特包括 IP  后续的数据)

UDPHeader.Length:长度字段:占16比特。标明UDP头部和UDP数据的总长度字节。

IPv4

1.fcs实际上是32位的crc校验

2.udp校验和首先要求和:

   求和是16位高低位取反求和:比如\x1000要转化成\x0001,同时报文的长度不是16位的整数倍时,那么在末位添2字节的0,故而当报文为b'\x10\x00\x11',实际求和报文为b'\x10\x00\x11\x00',高低位取反后是b'\x00\x10\x00\x11'结果为16+17=33.

依次对"IPHeader.DestAddress""IPHeader.SourceAddress" "IPHeader.Protocol""UDPHeader.Length" “udp头部+playload"高低位取反求和,其中"IPHeader.Protocol"是8位的,要在高位补8位0,然后再高低位取反去和,将5个求和结果相加求和得到32位结果s

再投入以下公式:

s = (s >> 16) + (s &0xffff)

   s += s >> 16

   s = ~s

    s= s & 0xffff

最后的s取低16再高低位取反,就是udp的校验和。

3.IP的checksun是只对“IP头”反码求和,结果也要进行如下计算:

s = (s >> 16) + (s &0xffff)

   s += s >> 16

   s = ~s

    s= s & 0xffff

最后的s取低16,高低位取反,就是IP的校验和。

3.tcp校验和首先要求和,与udp一样,只是tcp头部包含的字段更多

 

IPv6层

1、udp校验和首先要求和:

   求和是16位高低位取反求和:比如\x1000要转化成\x0001,同时报文的长度不是16位的整数倍时,那么在末位添2字节的0,故而当报文为b'\x10\x00\x11',实际求和报文为b'\x10\x00\x11\x00',高低位取反后是b'\x00\x10\x00\x11'结果为16+17=33.

依次对" IPv6Header.DestAddress " "IPv6Header.SourceAddress " " IPv6Header.NextHead " "UDPHeader.Length" “udp头部+playload"高低位取反求和,其中" IPv6Header.NextHead "是8位的,要在高位补8位0,然后再高低位取反去和,将5个求和结果相加求和得到32位结果s

再投入以下公式:

s = (s >> 16) + (s &0xffff)

   s += s >> 16

   s = ~s

    s= s & 0xffff

最后的s取低16再高低位取反,就是udp的校验和。

3.IP的checksun是只对“IP头”反码求和,结果也要进行如下计算:

s = (s >> 16) + (s &0xffff)

   s += s >> 16

   s = ~s

    s= s & 0xffff

最后的s取低16,高低位取反,就是IP的校验和。

2、tcp校验和首先要求和,与udp一样,只是tcp头部包含的字段更多

你可能感兴趣的:(网络协议)