【发布时间】:2020-10-01 08:52:13
【问题描述】:
我正在尝试使用此link 实现校验和计算算法 这是一个字节切片及其校验和的示例。 还有我的实现代码,告诉我我做错了什么。
//https://gist.github.com/david-hoze/0c7021434796997a4ca42d7731a7073a
func chksum(iph *ipv4.Header,payload []byte)uint16{
// https://github.com/mikioh/-stdyng/blob/master/afpacket.go
var htons = func(i uint16) uint16 {return (i<<8)&0xff00 | i>>8}
tcpLen := iph.TotalLen - iph.Len
src := iph.Src
dst := iph.Dst
var csum uint32
for i := 0; i < 16; i += 2 {
csum += uint32(src[i]) << 8
csum += uint32(src[i+1])
csum += uint32(dst[i]) << 8
csum += uint32(dst[i+1])
}
csum += uint32(htons(6)) // TCP PROTO
csum += uint32(htons(uint16(tcpLen)))
// old chksum
payload[16] = 0
payload[17] = 0
var i int
for tcpLen > 1 {
csum += uint32(payload[i]) << 8
csum += uint32(payload[i+1])
tcpLen -= 2
i++
}
if tcpLen % 2 == 1 {
csum += uint32(payload[tcpLen - 1]) << 8
}
for csum > 0xffff{
csum = (csum >> 16) + (csum & 0xffff)
}
return ^uint16(csum)
}
// output
[69 0 0 60 179 32 64 0 64 6 108 0 192 168 77 61 192 168 77 13 203 50
0 22 69 21 146 157 0 0 0 0 160 194 250 240 65 21 0 0 2 4 5 180 4 2 8
10 38 105 38 58 0 0 0 0 1 3 3 7]
src chkSumOriginaltcp = 0x4115 calc chkSumFaketcp = 0x72e8
请告诉我哪里可能错了,这对我很重要
【问题讨论】:
-
RFC 1071, Computing the Internet Checksum 解释了算法并有一些代码。
-
@RonMaupin 我显然没有正确理解某些内容,因此我在这里寻求帮助。
标签: linux algorithm go networking tcp