Blocks Extensible Exchange Protocol
# Blocks Extensible Exchange Protocol

Blocks Extensible Exchange Protocol (BEEP) (davor BXXP) ist ein generisches Netzwerkprotokoll. BEEP bietet grundlegende Funktionen für verbindungs- und nachrichtenorientierte Peer-to-Peer (P2P) Protokolle und unterstützt asynchrone Vollduplex-Kommunikation.

BEEP-Profile definieren Syntax und Semantik von Nachrichten und können innerhalb einer Session mit einem oder mehreren Kanälen verbunden werden. Jeder BEEP-Kanal verhält sich dabei wie eine Vollduplex-Pipe. Ein Frame-Mechanismus ermöglicht eine gleichzeitige und unabhängige Kommunikation zwischen Peers.

BEEP ist in RFC 3080 unabhängig vom Transport-Mechanismus definiert. Wie BEEP auf unterschiedlichen Transport-Mechanismen aufsetzt, wird in anderen Dokumenten beschrieben.

## Überblick

BEEP verwendet Profile, Kanäle und einen Frame-Mechanismus, um verschiedene Arten von Nachrichten auszutauschen. Für Inhaltstyp und Kodierung wird die Voreinstellung durch die BEEP-Spezifikation vorgegeben. Der Protokoll-Designer legt fest, ob entweder ein binäres oder ein beliebiges textbasiertes Nachrichtenformat verwendet wird. Profile definieren Syntax und Semantik des Nachrichtenformats und bestimmen die Funktionalität des Protokolls. Kanäle sind Vollduplex-Pipes, die mit einem Profil verbunden sind. Nachrichten, die über verschiedene Kanäle gesendet werden, sind unabhängig voneinander (asynchron). Es können beliebig viele Kanäle mit einem Profil verbunden werden.

BEEP stellt darüber hinaus TLS für Verschlüsselung und SASL für Authentifizierung zur Verfügung.

## Geschichte

Marshall T. Rose, der ebenfalls an Protokollen wie POP3, SMTP, und SNMP mitgearbeitet hat, begann 1998 mit der Arbeit an BXXP, dem Vorgänger von BEEP, und übergab die Spezifikation im Sommer 2000 an eine Arbeitsgruppe der Internet Engineering Task Force (IETF) zur Bearbeitung. Die IETF veröffentlichte 2001 BEEP (RFC 3080) und BEEP über TCP (RFC 3081) mit einigen Erweiterungen gegenüber BXXP. Drei der Erweiterungen sind:

* Verwendung von application/octet-stream als Voreinstellung für Content-Type.
* Unterstützung von mehreren Antworten auf eine Anfrage (multi-reply) für Nachrichten.
* Der Name wurde von BXXP in BEEP geändert.

## BEEP Session

Eine BEEP-Session wird gestartet, wenn sich ein Peer (Initiator) mit einem anderen (Listener) verbindet. Beide Peers schicken sofort und gleichzeitig eine Nachricht (RPY) mit einer Begrüßung (greeting). Das greeting-Element kann bis zu drei Elemente enthalten:

* features optional: Funktionen für die Kanalverwaltung, die der Peer unterstützt.
* localize optional: Bevorzugte Sprache für Fehlermeldungen und Nachrichten.
* profile notwendig: Profile, die der Peer unterstützt.

Ein Beispiel für den Austausch von Begrüßungen:

## Profile

Profile legen das Nachrichtenformat fest und definieren die Funktionalität des BEEP basierten Protokolls. Eine BEEP-Session kann mehrere Profile gleichzeitig zur Verfügung stellen. Um ein Profil eindeutig identifizieren zu können, wird jedem eine Zeichenkette (Profil ID) zugewiesen. Die Profil ID hat das Format eines Uniform Resource Identifier (URI) oder eines Uniform Resource Name (URN). In der Vergangenheit führte das URI-Format, wegen seiner Ähnlichkeit zu einer Internetadresse, zu Verwirrung. Um Missverständnisse zu vermeiden sollten neue Profile das URN-Format verwenden.

Beispiele für Profil-IDs:

| urn:ietf:params:xml:ns:geopriv:held:beep | Eine BEEP Version des HELD Protokolls |
| - | - |
| http://iana.org/beep/xmlrpc | RFC 3529 XML-RPC über BEEP |

## Nachrichten und Frames

Für BEEP-Nachrichten wird das MIME-Format verwendet. Nachrichten transportieren einen Inhalt, dessen Format vom Profil-Designer festgelegt wird. Textbasierte Formate wie JSON oder XML wie auch binäre Formate sind möglich. Die Kanalverwaltung über Channel 0 und das TLS-Profil verwenden eine Untermenge von XML, die für den Profil-Designer transparent ist.

Beispiel aus RFC 3080 – Schließen eines BEEP-Kanals:

Größere Nachrichten werden über mehrere Frames (Sequence Frames) verteilt.

### Nachrichten-Typen

BEEP definiert 5 Nachrichtentypen für die häufigsten Muster in Anwendungsprotokollen:

| Message | MSG | Eine Nachricht mit Inhalt. |
| - | - | - |
| Reply | RPY | Eine einzelne Antwort auf eine empfangene Nachricht mit Inhalt. |
| Error | ERR | Eine einzelne Antwort auf eine empfangene Nachricht mit Inhalt und Fehlerbeschreibung. |
| Answer | ANS | Eine Antwort auf eine empfangene Nachricht mit Inhalt. Es können 0 bis n Antworten auf eine Nachricht gesendet werden. |
| Nul | NUL | Eine abschließende Antwort auf eine empfangene Nachricht ohne Inhalt, um das Ende eines Nachrichtenaustauschs mit mehreren Antworten zu signalisieren. |

Einige der häufigsten Protokollmuster werden wie folgt implementiert:

* Request-reply Eine MSG-Nachricht wird mit jeweils einem RPY oder ERR beantwortet.
* Single request-multiple replies Eine MSG-Nachricht wird mit keiner, einer oder mehreren ANS-Nachrichten beantwortet und mit NUL oder ERR abgeschlossen.
* Unacknowledged notification Es werden MSG-Nachrichten gesendet die keine Antwort erwarten.

### Flusskontrolle

Für die Flusssteuerung in Kanälen verwendet BEEP Sequenz-Frames (SEQ). Sequenz-Frames sind in RFC 3081, Abschnitt 3.1 beschrieben. Für die gesamte Verbindung wird vom Transmission Control Protocol (TCP) ebenfalls einen Sequenz-Mechanismus zur Flusssteuerung verwendet. Damit jedoch ein Kanal oder eine große Nachricht nicht die gesamte Bandbreite beansprucht, wird eine Flusskontrolle für einzelne BEEP-Kanäle benötigt. Sequenz-Frames werden für die Unterstützung von Quality of Service (QoS) und zur Staukontrolle verwendet.

