docs: async def check_start(self, pair):
          """
          Starts a check.
          """
          self.check_state(pair, CandidatePair.State.IN_PROGRESS)
  
          request = self.build_request(pair)
          try:
              response, addr = await pair.protocol.request(
                  request, pair.remote_addr,
                  integrity_key=self.remote_password.encode('utf8'))
          except exceptions.TransactionError as exc:
              # 7.1.3.1. Failure Cases
              if exc.response and exc.response.attributes.get('ERROR-CODE', (None, None))[0] == 487:
                  if 'ICE-CONTROLLING' in request.attributes:
                      self.switch_role(ice_controlling=False)
                  elif 'ICE-CONTROLLED' in request.attributes:
                      self.switch_role(ice_controlling=True)
                  return await self.check_start(pair)
              else:
                  self.check_state(pair, CandidatePair.State.FAILED)
                  self.check_complete(pair)
                  return
  
          # check remote address matches
          if addr != pair.remote_addr:
              self.__log_info('Check %s failed : source address mismatch', pair)
              self.check_state(pair, CandidatePair.State.FAILED)
              self.check_complete(pair)
              return
  
          # success
          self.check_state(pair, CandidatePair.State.SUCCEEDED)
          if self.ice_controlling or pair.remote_nominated:
              pair.nominated = True
          self.check_complete(pair)