• Как правильно посчитать контрольную сумму tcp пакета?

    @jajabin Автор вопроса
    Оставлю этот тут вдруг кому будет нужно.
    func chksum(data []byte, srcip, dstip []byte) uint16 {
    	data[16],data[17] = 0,0 //zero on original check sum
    	psheader := []byte{
    		srcip[0], srcip[1], srcip[2], srcip[3],
    		dstip[0], dstip[1], dstip[2], dstip[3],
    		0,
    		6,                  //  TCP
    		0, byte(len(data)), //  length (16 bits)
    	}
    
    	csum := make([]byte, 0, len(psheader)+len(data))
    	csum = append(csum, psheader...)
    	csum = append(csum, data...)
    
    
    	lenSumThis := len(csum)
    	var word uint16
    	var sum uint32
    	for i := 0; i+1 < lenSumThis; i += 2 {
    		word = uint16(csum[i])<<8 | uint16(csum[i+1])
    		sum += uint32(word)
    	}
    	if lenSumThis%2 != 0 {
    
    		sum += uint32(csum[len(csum)-1])
    	}
    
    	sum = (sum >> 16) + (sum & 0xffff)
    	sum = sum + (sum >> 16)
    
    	return uint16(^sum)
    }
    Ответ написан
    Комментировать