Back to blog Connectivity

SMPP Session Health: How to Detect Degradation Before Messages Are Lost

An operational guide to distinguishing a connected SMPP session from a genuinely healthy one, interpreting transport signals, and acting without confusing connectivity with deliverability.

Operations dashboard showing the status and latency of several SMPP sessions

A connected session is not always a healthy session

SMPP session health must be evaluated in layers. First, there is a network connection, usually TCP/IP. Then, the ESME sends a Bind request to open the SMPP session in the required mode. An established TCP connection and an accepted Bind confirm that those two stages were completed, but they do not prove that the session responds normally under load or that future messages will be accepted or delivered.

A session can retain an apparently active bind while response times increase, unanswered requests accumulate, or socket closures and resets occur. Therefore, the “connected” signal is necessary but insufficient. Operations must observe the actual ability to exchange correlated PDUs within expected timeframes.

Session health must not be equated with the final outcome of an SMS. Admission of a submit_sm is observed in its submit_sm_resp and command_status. The subsequent stage, if delivery receipts are requested, is observed through DLRs carried in deliver_sm or data_sm. A successful bind, an open socket, or an enquire_link_resp do not replace that evidence.

  • TCP available: confirms the transport layer, not the opening of an SMPP session.
  • Bind accepted: confirms that the SMSC accepted the session and requested mode.
  • Operational responses: show whether PDUs, including submit_sm, receive correlated responses.
  • DLRs: provide subsequent information about the status reported by the SMSC; they must not be confused with independent proof of handset receipt.
A connected session is not always a healthy session

Observable components: transport, bind, pending requests, and responses

SMPP operates through request and response PDUs. Except for alert_notification, every operation must have its associated response. The sequence_number field makes it possible to correlate a request with its response and should be the primary identifier for measuring response time and counting pending operations.

Responses should not be matched by arrival order. SMPP allows them to arrive out of order, so an implementation must resolve correlation by sequence_number. This precaution is particularly important in sessions with multiple simultaneous operations.

The protocol does not establish a universal maximum for pending operations. That limit depends on the SMSC implementation; the specification provides guidance not to exceed ten simultaneous pending operations. In production, the operating limit should be agreed with the provider where possible and validated against the actual behavior of each session.

  • Session identifier and remote endpoint.
  • TCP status: connected, closed, error, or reset.
  • Bind result and duration.
  • sequence_number, command_id, and command_status.
  • Timestamp for sending and receiving each PDU.
  • Number of pending requests by operation type.
  • enquire_link RTT and submit_sm_resp RTT, stored separately.
Observable components: transport, bind, pending requests, and responses

Bind modes and their operational implications

The bind mode defines the permitted direction of traffic in a session. bind_transmitter is used for traffic from the ESME to the SMSC. bind_receiver is used for traffic from the SMSC to the ESME. bind_transceiver allows bidirectional exchange in a single session.

If an ESME uses separate sessions for sending and receiving, it needs two network connections and two SMPP sessions: one Transmitter and one Receiver. Operationally, both must be monitored independently. A healthy sending session does not confirm that the receiving session is available to receive DLRs or other incoming PDUs.

In a Transceiver session, sharing a connection does not remove the need to measure both directions. Outbound requests, their responses, incoming PDUs, and the responses returned by the ESME to those PDUs when applicable must all be observed separately.

  • Transmitter: monitor submit_sm and its submit_sm_resp responses.
  • Receiver: monitor receipt of deliver_sm or data_sm and the response returned by the ESME.
  • Transceiver: monitor both directions and do not reduce health to a single aggregated metric.
  • Verify that the bind mode matches the operational function required for the route or connection.

enquire_link: a session probe, not a deliverability test

enquire_link allows an ESME or SMSC to check the communication path at the SMPP application level. When an enquire_link_resp arrives with the same sequence_number, there is evidence that the session was able to exchange that check at that point in time.

This signal is useful for monitoring inactivity, detecting RTT deterioration, and discovering a half-open connection earlier. In TCP, one endpoint can close or abort a connection without the other immediately knowing; the issue may become visible when data is transmitted and a reset is received. An SMPP probe helps create application activity, but it does not eliminate all uncertainty.

Do not use enquire_link as a substitute for submit_sm. An enquire_link_resp does not confirm that the SMSC accepts sending traffic, can process it on a particular route, or that a final recipient receives a message. Measure enquire_link RTT separately from submit_sm_resp RTT to prevent a healthy probe from masking degradation in message admission.

In addition, a single probe failure should not automatically lead to the conclusion that the peer is down. The decision must account for recurrence, duration, socket signals, bind status, and the behavior of real requests.

  • What it checks: SMPP application exchange on the active session.
  • What it does not check: submit_sm acceptance, route capacity, DLRs, or final delivery.
  • What to measure: sending, receipt of enquire_link_resp, RTT, timeout, and sequence_number.
  • What to avoid: declaring unavailability based on one failed probe without additional signals.

Early degradation signals to monitor

The first signal is usually a persistent change from the session's own baseline, rather than an explicit error. A sustained increase in enquire_link_resp RTT can indicate that the session is responding more poorly. A sustained increase in submit_sm_resp RTT, or in errors reflected in command_status, indicates a problem closer to traffic admission.

Growth in the inventory of pending sequence_numbers is another critical signal. Until the corresponding response arrives, the originator must assume that the PDU was not received at the destination. However, this lack of confirmation must not be treated as proof that a remote action never occurred: after a failure or lost response, operational uncertainty may exist and require duplicate controls.

Repeated transaction timer timeouts, socket errors, unexpected closures, and TCP resets justify raising severity. A reset aborts the TCP connection; by itself, it does not provide the outcome of the PDUs that were pending. Those PDUs must be marked as uncertain for investigation and subsequent handling.

Bind errors or rejections are a direct signal that there is no usable session in the requested mode. Even with a successful bind, a buildup of pending requests or deterioration in submit_sm_resp may justify limiting admission of new sends before the session fails completely.

  • High enquire_link_resp latency over a sustained period.
  • High latency or errors in submit_sm_resp.
  • Persistent growth in pending requests.
  • Recurring transaction timeouts.
  • Socket closures, errors, and resets.
  • Bind failures or rejections.
  • Absence of responses where there was previously a normal activity pattern.

Operational states: healthy, degraded, unavailable, and recovering

Defining explicit states prevents alerts from turning into improvised reactions. Exact criteria must be adjusted for each provider, session, and traffic pattern, because SMPP does not impose universal timing values or a fixed maximum number of pending operations.

A healthy session combines available transport, an active bind for the required role, responses within its normal baseline, and no abnormal buildup of pending requests. A degraded session retains some communication capability but shows persistent deterioration: higher latency, more timeouts, more pending requests, or increasing errors.

An unavailable session cannot safely be used for the required role. This may be due to a bind failure or rejection, socket closure or reset, or repeated transaction expirations without response recovery. Recovery should be a separate state: transport and bind may have been restored, but traffic admission should remain paused or limited until stability is observed.

  • Healthy: TCP available, valid bind, normal responses, and controlled pending requests.
  • Degraded: active session with persistent signs of worsening.
  • Unavailable: no usable transport or bind, or repeated failures without recovery.
  • Recovering: connectivity restored, but under observation before returning to normal operation.

How to design thresholds and alerts without relying on a single event

Thresholds should start with a session-specific baseline for each connection and PDU type. Compare, for example, the normal distribution of enquire_link RTT with that of submit_sm_resp, and observe sustained changes in high percentiles rather than averages alone. An average can hide a tail of slow responses that is already consuming the pending request window.

Add a time dimension. An alert for a single timeout or one missed probe can create noise and unnecessary action. It is safer to combine intensity, duration, and recurrence: sustained deterioration, multiple expirations, continuous pending growth, or a transport event accompanied by lack of recovery.

Alerts should include actionable context: affected session, bind mode, remote endpoint, PDU type, latency evolution, pending requests, latest socket error, and latest bind result. Without that context, a team may mistake a DLR reception issue for a submit_sm admission issue.

  • Use baselines by session, provider, and operation type.
  • Observe percentiles and trends in addition to averages.
  • Require duration or recurrence before escalating an isolated signal.
  • Differentiate transport, bind, submit_sm response, and DLR receipt alerts.
  • Review thresholds after incidents and configuration changes.

Safe actions for each signal

When initial degradation appears, reduce risk before attempting aggressive reconnection. You can limit new admissions, reduce the sending rate, and allow requests already sent to receive a response within the configured timer. The decision depends on the session capacity and the agreed traffic policy, but it should prevent the pending window from growing without control.

When a closure, reset, or bind failure occurs, mark the session as unavailable and record which requests remained pending. Reconnect in a controlled manner: restore transport, perform the required bind, and maintain an observation period of normal responses before fully reopening admission.

Escalation to the provider is appropriate when there is traceable evidence of persistent failure or degradation: start time, remote endpoint, bind mode, bind results, timeout sequence, command_status, socket events, and pending-request evolution. The goal is not to assign a cause without proof, but to share reproducible observations.

Do not automatically resend every request affected by a timeout or failure. The absence of a response confirms a lack of correlated confirmation, but the remote result may remain indeterminate. Any retry must follow an idempotency or duplicate-control policy defined by the business.

  • Mild degradation: limit admissions and monitor pending requests and RTT.
  • Increasing timeouts: reduce pressure and avoid expanding the pending window.
  • Closed socket or reset: remove the session from sending and classify pending requests as uncertain.
  • Failed bind: do not admit traffic for that role until a valid session is restored.
  • Recovery: validate transport, bind, and a period of normal responses before fully reopening.
  • Escalation: share correlated evidence, not only a claim that the connection is down.
FAQ

Frequently asked questions

Does a successful SMPP bind guarantee that SMS messages will be delivered?

No. A successful bind indicates that the SMSC accepted the opening of an SMPP session in the requested mode. Acceptance of a specific message is observed in submit_sm_resp and command_status. Subsequent delivery information, if requested, arrives through DLRs and must be interpreted as the status reported by the SMSC.

What exactly does enquire_link confirm?

It confirms that the session communication path is working at the SMPP application level at the time a correlated enquire_link_resp is received. It does not confirm submit_sm acceptance, route availability, or final SMS delivery.

Why should I record sequence_number?

Because it is the field that correlates an SMPP request with its response. It allows you to measure RTT, detect pending requests, and handle responses that arrive out of order.

How many pending SMPP requests can I have?

There is no universal maximum defined by SMPP; it depends on the SMSC implementation. The specification provides guidance not to exceed ten simultaneous pending operations. You should use the limit agreed or validated for each connection and monitor the session's actual behavior.

Does a TCP reset mean that pending messages failed?

No. A reset aborts the transport, but it does not determine the outcome of pending PDUs. If the associated response is missing, there is no correlated confirmation of receipt. Treat them as uncertain operations and apply a controlled policy to avoid duplicates.

What should I review before attributing an incident to an SMS route?

First review TCP status, bind result, enquire_link and submit_sm_resp RTTs separately, command_status, pending requests, timeouts, socket events, and DLR availability. A degraded SMPP session can explain admission or visibility problems before concluding that there is a route issue.

Sources consulted

  1. SMPP Protocol Specification v3.4, Issue 1.2SMPP Developers Forum
  2. RFC 9293: Transmission Control Protocol (TCP)Internet Engineering Task Force / RFC Editor
  3. RFC 1122: Requirements for Internet Hosts -- Communication LayersInternet Engineering Task Force / RFC Editor