code: func (rt *routingTable) Fresh() {
  	now := time.Now()
  
  	for e := range rt.cachedKBuckets.Iter() {
  		bucket := e.Value.(*kbucket)
  		if now.Sub(bucket.LastChanged()) < rt.dht.KBucketExpiredAfter ||
  			bucket.nodes.Len() == 0 {
  			continue
  		}
  
  		i := 0
  		for e := range bucket.nodes.Iter() {
  			if i < rt.dht.RefreshNodeNum {
  				no := e.Value.(*node)
  				rt.dht.transactionManager.findNode(no, bucket.RandomChildID())
  				rt.clearQueue.PushBack(no)
  			}
  			i++
  		}
  	}
  
  	if rt.dht.IsCrawlMode() {
  		for e := range rt.clearQueue.Iter() {
  			rt.Remove(e.Value.(*node).id)
  		}
  	}
  
  	rt.clearQueue.Clear()
  }
docs: // Fresh sends findNode to all nodes in the expired nodes.