# SMPP-PDU-Anatomie: Header und Body

> Jede SMPP-Nachricht ist eine PDU (Protocol Data Unit) mit einem festen 16-Byte-Header, gefolgt von einem operationsspezifischen Body. Der Header besteht aus vier 4-Byte-Ganzzahlen im Big-Endian-Format: command_length, command_id, command_status und sequence_number. command_length zählt die gesamte PDU einschließlich des Headers, sodass ein Empfänger zuerst 4 Bytes liest und dann den Rest.

- Kanonische URL: https://www.broadnet.me/de/reference/smpp-pdu-anatomy
- Sprache: de
- Zuletzt aktualisiert: 2026-07-18
- Herausgeber: BroadNet (https://www.broadnet.me)

Das exakte Byte-Layout einer SMPP-PDU: der 16-Byte-Header (command_length, command_id, command_status, sequence_number), der Body und wie Felder codiert werden.

## Der 16-Byte-Header

Jede PDU beginnt mit denselben vier vorzeichenlosen 32-Bit-Ganzzahlen in Netzwerk-Bytereihenfolge (Big-Endian). command_length ist die Gesamtzahl der Oktette der PDU einschließlich dieser 16 Header-Bytes — ein Parser liest die ersten 4 Bytes, erfährt die Gesamtlänge und liest dann den Rest. command_id identifiziert die Operation. command_status ist 0 (ESME_ROK) in Requests und trägt in Responses einen Fehlercode. sequence_number korreliert einen Request mit seiner Response.

*SMPP-Header-Felder (16 Bytes, Big-Endian)*

| Offset | Feld | Größe | Zweck |
|---|---|---|---|
| 0 | command_length | 4 Oktette | Gesamtlänge der PDU in Oktetten, einschließlich Header |
| 4 | command_id | 4 Oktette | Operations-Identifikator (z. B. submit_sm = 0x00000004) |
| 8 | command_status | 4 Oktette | 0 in einer Anfrage; Fehlercode in einer Antwort |
| 12 | sequence_number | 4 Oktette | Korreliert Anfrage↔Antwort (0x00000001–0x7FFFFFFF) |

## command_id und das Response-Bit

Jede Operation hat eine command_id. Die zugehörige Response verwendet denselben Wert mit gesetztem höchstwertigem Bit (logisches OR mit 0x80000000). So ist submit_sm 0x00000004 und submit_sm_resp 0x80000004. generic_nack (0x80000000) ist die Sammel-Fehlerantwort für eine nicht parsbare oder ungültige PDU.

*Gängige command_id-Werte*

| Operation | Request | Response |
|---|---|---|
| generic_nack | — | 0x80000000 |
| bind_receiver | 0x00000001 | 0x80000001 |
| bind_transmitter | 0x00000002 | 0x80000002 |
| query_sm | 0x00000003 | 0x80000003 |
| submit_sm | 0x00000004 | 0x80000004 |
| deliver_sm | 0x00000005 | 0x80000005 |
| unbind | 0x00000006 | 0x80000006 |
| replace_sm | 0x00000007 | 0x80000007 |
| cancel_sm | 0x00000008 | 0x80000008 |
| bind_transceiver | 0x00000009 | 0x80000009 |
| enquire_link | 0x00000015 | 0x80000015 |
| data_sm | 0x00000103 | 0x80000103 |

## Der Body und wie Felder codiert werden

Nach dem Header folgt der operationsspezifische Body aus Pflichtparametern, optional gefolgt von optionalen TLV-Parametern. SMPP verwendet drei Feldcodierungen. Ganzzahlen sind fester Größe, vorzeichenlos und Big-Endian. C-Octet Strings sind ASCII-Text, terminiert durch ein NULL (0x00), mit einer angegebenen Maximallänge, die den Terminator einschließt. Octet Strings sind rohe Byte-Felder, deren Länge durch ein vorangestelltes Längenfeld angegeben wird (zum Beispiel short_message, dessen Größe durch sm_length bestimmt wird).

*SMPP-Feldcodierungen*

| Typ | Kodierung |
|---|---|
| Integer | Feste 1/2/4 Oktette, vorzeichenlos, Big-Endian (Netzwerk-Byte-Reihenfolge) |
| C-Octet String | NUL-terminiertes ASCII; die maximale Länge schließt das 0x00-Abschlusszeichen ein |
| C-Octet String (Decimal/Hex) | Wie oben, jedoch beschränkt auf dezimale oder hexadezimale ASCII-Ziffern |
| Octet String | Rohbytes; Länge wird durch ein separates Längenfeld angegeben, kein Abschlusszeichen |

## Ein durchgerechnetes Beispiel: submit_sm auf der Leitung

Eine minimale submit_sm-PDU. Die command_length des Headers (0x0000003D = 61) ist die Gesamt-Byte-Zahl; command_id 0x00000004 ist submit_sm; command_status 0 kennzeichnet einen Request; sequence_number 0x0000000F korreliert die Response. Der Body folgt dann in der festen Feldreihenfolge, die die Spezifikation definiert.

*submit_sm-Header + Beginn des Body (kommentiert)*

```hex
00 00 00 3D   command_length = 61
00 00 00 04   command_id     = submit_sm
00 00 00 00   command_status = ESME_ROK (request)
00 00 00 0F   sequence_number = 15
-- body --
00            service_type    = "" (NULL)
05            source_addr_ton = 5 (alphanumeric)
00            source_addr_npi = 0 (unknown)
42 4E 00      source_addr     = "BN" + NULL
01            dest_addr_ton   = 1 (international)
01            dest_addr_npi   = 1 (E.164/ISDN)
...           destination_addr, esm_class, ... short_message
```

## Häufige Fragen

### Schließt command_length den Header ein?

Ja. command_length ist die Gesamtlänge der gesamten PDU in Oktetten, einschließlich des 16-Byte-Headers. Ein Empfänger liest genau command_length Bytes, um eine vollständige PDU aus dem TCP-Stream zu entnehmen.

### Welche Bytereihenfolge verwendet SMPP?

Netzwerk-Bytereihenfolge — Big-Endian — für alle mehroktettigen Ganzzahlfelder, einschließlich jedes Feldes im Header. Ein 4-Byte-Wert von 61 wird als 00 00 00 3D übertragen.

### Wie werden Textfelder terminiert?

Textfelder sind C-Octet Strings: ASCII-Zeichen, terminiert durch ein einzelnes NULL-Byte (0x00). Ein leerer C-Octet String ist nur das NULL-Byte. Die angegebene Maximallänge schließt diesen Terminator ein.

### Was ist ein generic_nack?

generic_nack (command_id 0x80000000) ist die Antwort, die der Empfänger zurückgibt, wenn eine PDU nicht geparst werden kann oder grundlegend ungültig ist — zum Beispiel bei fehlerhafter command_length oder unbekannter command_id. Der zugehörige command_status trägt den Grund.

### Wie grenzt ein Empfänger PDUs im TCP-Stream ab?

TCP ist ein Byte-Stream ohne Nachrichtengrenzen, daher liest der Empfänger die ersten 4 Bytes, um die command_length zu ermitteln, und liest dann so viele Bytes insgesamt, um eine vollständige PDU zu isolieren, bevor er den Rest von Header und Body parst.

## Quellen

- [SMPP v3.4 specification — §2, §3 PDU format](https://smpp.org/SMPP_v3_4_Issue1_2.pdf)
- [SMPP v5.0 specification](https://smpp.org/SMPP_v5.pdf)

## Verwandte Seiten

- [SMPP-Protokollübersicht](https://www.broadnet.me/de/reference/smpp-protocol-overview)
- [SMPP-PDU-Decoder (kostenloses Tool)](https://www.broadnet.me/de/tools/smpp-pdu-decoder)
- [Optionale SMPP-TLV-Parameter](https://www.broadnet.me/de/reference/smpp-tlv-parameters)
- [SMPP command_status Fehlercodes](https://www.broadnet.me/de/reference/smpp-command-status-errors)
- [Entwicklerdokumentation](https://www.broadnet.me/de/developers)
