# MQTT CONNACK: Packet identifier exhausted (reason code 0x93)

- **ID:** `communication/mqtt-packet-identifier-exhausted`
- **Domain:** communication
- **Category:** resource_error
- **Error Code:** `0x93`
- **Verification:** ai_generated
- **Fix Rate:** 81%

## Root Cause

MQTT broker runs out of available packet identifiers (0-65535) because too many unacknowledged PUBLISH/QoS>0 or SUBSCRIBE messages are in flight, typically due to slow consumers or network congestion.

## Version Compatibility

| Version | Status | Introduced | Deprecated |
|---------|--------|------------|------------|
| MQTT 3.1.1 | active | — | — |
| MQTT 5.0 | active | — | — |
| Mosquitto 2.0.15 | active | — | — |
| EMQX 5.0.0 | active | — | — |
| HiveMQ 2023.1 | active | — | — |

## Workarounds

1. **Increase the packet identifier pool size on the broker (if configurable): for Mosquitto, set 'max_inflight_messages' to a higher value (e.g., 65535) to allow more concurrent in-flight messages.** (85% success)
   ```
   Increase the packet identifier pool size on the broker (if configurable): for Mosquitto, set 'max_inflight_messages' to a higher value (e.g., 65535) to allow more concurrent in-flight messages.
   ```
2. **Implement flow control on the client: limit the number of unacknowledged PUBLISH messages by using a sliding window (e.g., max 10 in-flight per topic) and wait for PUBACK before sending the next.** (90% success)
   ```
   Implement flow control on the client: limit the number of unacknowledged PUBLISH messages by using a sliding window (e.g., max 10 in-flight per topic) and wait for PUBACK before sending the next.
   ```
3. **Upgrade to MQTT 5.0 and use the 'Topic Alias' and 'Receive Maximum' properties to reduce identifier consumption by allowing the broker to limit client send rate.** (80% success)
   ```
   Upgrade to MQTT 5.0 and use the 'Topic Alias' and 'Receive Maximum' properties to reduce identifier consumption by allowing the broker to limit client send rate.
   ```

## Dead Ends

- **** — Increasing the MQTT client's keepalive interval only delays disconnection; the packet identifier pool remains exhausted. (70% fail)
- **** — Setting QoS=0 (fire-and-forget) reduces reliability and may cause message loss; it also doesn't fix the root cause if the broker's identifier pool is globally exhausted across all clients. (75% fail)
- **** — Restarting the broker clears the pool temporarily but the same pattern will recur if the underlying slow-consumer issue isn't addressed. (60% fail)
