code: @Override
  	public boolean canHandle(byte[] data, int length, int offset) {
  		/*
  		 * All STUN messages MUST start with a 20-byte header followed by zero
  		 * or more Attributes.
  		 */
  		if(length >= 20) {
  			// The most significant 2 bits of every STUN message MUST be zeroes.
  			byte b0 = data[offset];
  			boolean firstBitsValid = ((b0 & 0xC0) == 0);
  			
  			// The magic cookie field MUST contain the fixed value 0x2112A442 in network byte order.
  			boolean hasMagicCookie = data[offset + 4] == StunMessage.MAGIC_COOKIE[0]
  					&& data[offset + 5] == StunMessage.MAGIC_COOKIE[1]
  					&& data[offset + 6] == StunMessage.MAGIC_COOKIE[2]
  					&& data[offset + 7] == StunMessage.MAGIC_COOKIE[3];
  			return firstBitsValid && hasMagicCookie;
  		}
  		return false;
  	}
docs: /*
  All STUN messages MUST start with a 20-byte header followed by zero or more Attributes.
  The STUN header contains a STUN message type, magic cookie, transaction ID, and message length.
  
  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |0 0|     STUN Message Type     |         Message Length        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                         Magic Cookie                          |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                                                               |
  |                     Transaction ID (96 bits)                  |
  |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  
  @param data
  @param length
  @return
  @see <a href="http://tools.ietf.org/html/rfc5389#page-10">RFC5389</a>