docs: def start(self):
          """Initiate the download."""
          log.info("Sending tftp download request to %s" % self.host)
          log.info("    filename -> %s" % self.file_to_transfer)
          log.info("    options -> %s" % self.options)
  
          self.metrics.start_time = time.time()
          log.debug("Set metrics.start_time to %s" % self.metrics.start_time)
  
          # FIXME: put this in a sendRRQ method?
          pkt = TftpPacketRRQ()
          pkt.filename = self.file_to_transfer
          pkt.mode = "octet" # FIXME - shouldn't hardcode this
          pkt.options = self.options
          self.sock.sendto(pkt.encode().buffer, (self.host, self.port))
          self.next_block = 1
          self.last_pkt = pkt
  
          self.state = TftpStateSentRRQ(self)
  
          while self.state:
              try:
                  log.debug("State is %s" % self.state)
                  self.cycle()
              except TftpTimeout as err:
                  log.error(str(err))
                  self.retry_count += 1
                  if self.retry_count >= TIMEOUT_RETRIES:
                      log.debug("hit max retries, giving up")
                      raise
                  else:
                      log.warning("resending last packet")
                      self.state.resendLast()
              except TftpFileNotFoundError as err:
                  # If we received file not found, then we should not save the open
                  # output file or we'll be left with a size zero file. Delete it,
                  # if it exists.
                  log.error("Received File not found error")
                  if self.fileobj is not None and not self.filelike_fileobj:
                      if os.path.exists(self.fileobj.name):
                          log.debug("unlinking output file of %s", self.fileobj.name)
                          os.unlink(self.fileobj.name)
  
                  raise