private boolean send(Packet packet, Address target, SendTask sendTask) {
    Connection connection = getConnection(target);
    if (connection != null) {
      return connection.write(packet);
    }

    if (sendTask == null) {
      sendTask = new SendTask(packet, target);
    }

    int retries = sendTask.retries;
    if (retries < RETRY_NUMBER && ioService.isActive()) {
      getOrConnect(target, true);
      // TODO: Caution: may break the order guarantee of the packets sent from the same thread!
      scheduler.schedule(sendTask, (retries + 1) * DELAY_FACTOR, TimeUnit.MILLISECONDS);
      return true;
    }
    return false;
  }