Docs/Guides/SMPP Protocol Guide — SMPP v3.4 Overview
Technical12 min readUpdated 2025-11-15

SMPP Protocol Guide — SMPP v3.4 Overview

A comprehensive technical overview of the Short Message Peer-to-Peer (SMPP) protocol v3.4, covering connection setup, PDU types, error codes, and best practices.

What is SMPP?

SMPP (Short Message Peer-to-Peer) is an open, industry-standard protocol used to exchange SMS messages between SMS service centres (SMSCs) and external applications (ESMEs — External Short Message Entities). It's the protocol of choice for high-throughput, enterprise-grade SMS sending. BulkSMSRates supports SMPP v3.4 with TLS encryption on port 2775 (plain) and port 2776 (TLS). Our gateway supports transmitter, receiver, and transceiver bind modes.

SMPP Architecture

In an SMPP setup, your application (ESME) connects to our SMPP gateway (SMSC) over TCP/IP. The connection is persistent — unlike HTTP, you maintain an open socket and can send messages at high throughput without connection overhead. Key components: • ESME (External Short Message Entity): Your application • SMSC (Short Message Service Centre): BulkSMSRates gateway • PDU (Protocol Data Unit): The binary message format • Bind: Authentication handshake to establish a session • TPS (Transactions Per Second): Throughput rate per bind

Connection Details

Use the following parameters to connect to the BulkSMSRates SMPP gateway:
ParameterValue
Hostsmpp.bulksmsrates.com
Port (plain)2775
Port (TLS)2776
SMPP Version3.4
System IDYour API username
PasswordYour SMPP password
System TypeLeave empty or use "SMPP"
Max TPS100 (upgradeable)
Max Binds5 per account

Bind Types

SMPP supports three bind types: • bind_transmitter: Send-only mode. Used if you only need to submit messages. • bind_receiver: Receive-only mode. Used to receive DLR (delivery reports) and MO (mobile-originated) messages. • bind_transceiver: Send and receive. Recommended — single connection for both outbound and inbound traffic. For most integrations, use bind_transceiver to handle outbound SMS and incoming DLRs on the same session.
// Example bind_transceiver PDU (hex)
00 00 00 27  // command_length: 39
00 00 00 09  // command_id: bind_transceiver
00 00 00 00  // command_status: 0 (OK)
00 00 00 01  // sequence_number: 1
// Body:
"myusername"    // system_id (null-terminated)
"mypassword"    // password (null-terminated)
"SMPP"          // system_type
34               // interface_version: 0x34 = v3.4
00               // addr_ton
00               // addr_npi
""             // address_range

Key PDU Types

SMPP communication uses Protocol Data Units (PDUs) — binary packets with a fixed header and variable body.
PDUDirectionPurpose
bind_transceiverESME→SMSCAuthenticate and open session
bind_transceiver_respSMSC→ESMEAuthentication response
submit_smESME→SMSCSubmit a message for delivery
submit_sm_respSMSC→ESMEAcknowledge message submission
deliver_smSMSC→ESMEInbound MO or DLR callback
deliver_sm_respESME→SMSCAcknowledge delivery receipt
enquire_linkEitherKeepalive (every 30–60s)
enquire_link_respEitherKeepalive response
unbindEitherGracefully close session

Sending a Message (submit_sm)

To send an SMS via SMPP, construct a submit_sm PDU. Key fields:
submit_sm fields:
- service_type:     "" (empty)
- source_addr_ton:  5  (alphanumeric) or 1 (international)
- source_addr_npi:  0
- source_addr:      "YourBrand" or "+447700900001"
- dest_addr_ton:    1  (international)
- dest_addr_npi:    1
- destination_addr: "447700900000" (no + prefix)
- esm_class:        0  (default, no UDH)
                    64 (0x40, UDH present for multipart)
- data_coding:      0  (GSM-7)
                    8  (UCS-2)
- registered_delivery: 1 (request DLR)
- short_message:    "Hello World" (up to 254 bytes)

Receiving Delivery Reports (DLR)

When registered_delivery=1, you receive a deliver_sm PDU from the SMSC containing the delivery status. Parse the short_message body to extract the DLR: DLR format: id:MSGID sub:001 dlvrd:001 submit date:YYMMDDHHMM done date:YYMMDDHHMM stat:DELIVRD err:000 text:FIRST20CHARS Stat values: DELIVRD (delivered), UNDELIV (undelivered), EXPIRED, DELETED, UNKNOWN, REJECTED. See our DLR Codes guide for a complete list of error codes.

Best Practices

1. Use enquire_link keepalives every 30–60 seconds to prevent connection timeouts. 2. Implement reconnection logic with exponential backoff (retry after 1s, 2s, 4s, 8s, etc.). 3. Process incoming PDUs asynchronously — don't block the read loop on business logic. 4. Use window size appropriately — submit up to 10 messages without waiting for responses (async). 5. Handle submit_sm_resp errors — check command_status and log failures. 6. Use TLS (port 2776) in production to protect message content in transit. 7. Test with our sandbox endpoint before going live: smpp-sandbox.bulksmsrates.com:2775.

Related Guides

Ready to get started?

Start sending SMS in minutes. No monthly fees. Free test credits.

Create Free Account →