210 likes | 408 Views
BEEP The Blocks Extensible Exchange Protocol Core. KM-/VS-Seminar Wintersemester 2002/2003 Betreuer: Frank Strauß. Übersicht. Einleitung Konzeption von BEEP Core Nachrichtaustausch Frame der Nachrichten Sitzungsverwaltung Abbildung auf TCP
E N D
BEEPThe Blocks Extensible Exchange Protocol Core KM-/VS-Seminar Wintersemester 2002/2003 Betreuer: Frank Strauß
Übersicht • Einleitung • Konzeption von BEEP Core • Nachrichtaustausch • Frame der Nachrichten • Sitzungsverwaltung • Abbildung auf TCP • Implementierung der Konzeption mit Java BEEP • Client • Server • Zusammenfassung
1. Einleitung • BEEP – Ein standardisierter Rahmenwerk für Internet-Protokoll • RFC 3080 und RFC 3081 - Marshall Rose • Zielsetzung des BEEPs • Verbindungsorientierung, • Nachrichtenorientierung, • Asynchronisation
2. Konzept von BEEP Core • BEEP ist ein Anwendungsprotokoll nach dem Peer-to-Peer-Prinzip. • Funktionalitäten von BEEP: • Trennen einer Nachricht von der Nächsten (Frame), • Kodierung der Nachrichten, • Unterstützung mehrfacher logischer Kommunikationskanäle, • Berichten über Störungen, • Aushandlung von Verschlüsselungsparametern, • Aushandlung von Authentisierungsparametern.
2.1 Nachrichtaustausch • Rolle • Listening-Rolle – auf eine eingehende Verbindung wartet. • Initiating-Rolle – eine Verbindung zum Listener erstellen will. • Client und Server. • Austauscharten • message/reply • message/error • message/answer
2.2 Frame der Nachrichten • Die BEEP-Nachrichten sind in der Regel durch MIME [8] strukturiert. • Text oder • binärer Code. • Beschreibung der Inhalttypen durch MIME-Kopf - „entity-headers“. Defaultwerte: • „Content-Type“ - „application/octet-stream“, • „Content-Transfer-Encoding“ - „binary“. • Beschreibung der Nachrichten durch XML.
2.2 Frame der Nachrichten • Syntax eines BEEP-Frames message frame frame header payload trailer header SP SP SP SP type channel megno more SP CR LF seqno size payload OCTET frame CR LF END
2.2 Frame der Nachrichten • Kopf eines Frames • channelidentifiziert, auf welchem Kanal die BEEP-Peers miteinander kommunizieren sollen. • msgno identifiziert die Nummern der Nachrichten. • more ist ein Fortsetzungsindikator, der entweder mit „*“ oder mit „.“ gekennzeichnet wird. • seqno identifiziert die Sequenznummer des ersten Oktetts in der Nutzlast. • size kennzeichnet die Anzahl der Oktetts in der Nutzlast eines Frames.
2.2 Frame der Nachrichten • Nutzlast • Besteht aus null oder mehren Oktetts, • Zugeordnet durch Sequenznummer. • Abschluss • besteht aus der Zeichenkette END <CR> <LF> • Ein Beispiel
session . . . channel 0 (management) channel 1 (profile A) channel n (profile P, Q) 2.3 Sitzungsverwaltung • Verteilung der Sitzung in verschiedenen Kanäle • Kanal 0 - Verwaltungskanal • Regelung durch Profile
2.3 Sitzungsverwaltung • Nachrichtenelement • Nachrichten wird präsentiert durch Nachrichtenelement (XML-Element). • Fünf Grundtypen von Nachrichtenelement für Sitzungsverwaltung, • Beziehungen zwischen Rolle, Nachrichtenarten und Nachrichtenelement:
2.3 Sitzungsverwaltung • Greeting-Nachrichten L: RPY 0 0 . 0 110 L: Content-Type: application/beep+xml L: <greeting> L: <profile uri=’http://iana.org/beep/TLS’ /> L: </greeting> L: END I: RPY 0 0 . 0 110 I: Content-Type: application/beep+xml I: <greeting /> I: END • Start-Nachrichten C: RPY 0 1 . 30 120 C: Content-Type: application/beep+xml C: C: <start number=’1’> C: <profile uri=’http://iana.org/beep/SASL/OTP’ /> C: <profile uri=’http://ibr.cs.tu-bs.de/fangming/contact’ /> C: </start> C: END
2.3 Sitzungsverwaltung • Error-Nachrichten C: RPY 0 2 . 390 80 C: Content-Type: application/beep+xml C: <close number=’1’ code=’200’ /> C: END S: RPY 0 2 . 211 27 S: Content-Type: application/beep+xml S: <error code=’550’>still working</error> S: END • Close-Nachrichten und OK-Nachrichten C: RPY 0 2 . 390 80 C: Content-Type: application/beep+xml C: C: <close number=’1’ code=’200’ /> C: END S: RPY 0 2 . 210 257 S: Content-Type: application/beep+xml S: S: <ok /> S: END
2.3 Sitzungsverwaltung • Profile • Ein Profile stellt dar, welche Nachrichten über den Kanal übertragen werden sollen/können. • Ein Profile ist durch einen URI identifiziert und regelt die Syntax und Semantik zugelassener Nachrichten. • Vordefinierte Profile für: • Kanalmanagement, • TLS – „Transport Layer Security“ – und • Authentisierung.
BEEP Peer A BEEP Peer B TCP A TCP B Initiator Listener CLOSED CLOSED OPEN-Active OPEN-Passive SYN, … SYN+ACK, … OPEN-Success OPEN-Success ACK, … ESTABLISHED ESTABLISHED . . . SEND (<close>) RECEIVE (<close>) …, <close number=’1’> SEND (<ok>) …, <ok> RECEIVE (<ok>) CLOSE FIN, … CLOSING ACK, … CLOSE TERMINATE FIN, … TERMINATE ACK, … CLOSED CLOSED 2.4 Abbildung auf TCP • Sitzungsverwaltung
BEEP Peer A BEEP Peer B TCP A TCP B . . . Client Server ESTABLISHED ESTABLISHED SEND (<greeting>) …, <greeting> RECEIVE (<greeting>) SEND (<greeting>) RECEIVE (<greeting>) …, <greeting> SEND (<start>) RECEIVE (<start>) …, <start number=’1’> initialchannel 1 successful SEND (<profile>) RECEIVE (<profile>) …, <profile url=’…’> . . . SEND (<start>) RECEIVE (<start>) …, <start number=’2’> initialchannel 2 unsuccessful SEND (<error>) RECEIVE (<error>) …, <error code=’550’> SEND (<query>) RECEIVE (<query>) …, <query uid=’fm007’> search person RECEIVE (<person>) …, <person tel#=’…’> . . . 2.4 Abbildung auf TCP • Nachrichtenaustausch
Message ... getChannel() getMsgno() getAnsno() sendMSG() sendRPY() sendANS() sendERR() sendNUL() ... Channel ... sendMSG() getProfile() getSession() ... Reply ... getNextReply() hasNext() receiveRPY() receiveERR() receiveANS() receiveNUL() 3. Implementierung der Konzeption mit Java BEEP • Bestandteil der BEEP Konzeption – Klassenabstraktion Session ... startChannel() firedChannelClose() firedChannelStarted() firedChannelReceived() sendProfile() ... -zero channel -session TLSProfile Profile Init() ... Init() ...
3. Implementierung der Konzeption mit Java BEEP • Client import org.beepcore.beep.core.*; import org.beepcore.lib.Reply; import org.beepcore.transport.tcp.*; ... public static void main (String args[]) { Session session; try { session = AutomatedTCPSessionCreator.initiate( "dragon", 8888, new ProfileRegistry()); } catch (BEEPException e) { // exception handling } Channel channel; try { channel = session.startChannel( "http://ibr.cs.tu-bs.de/fangming/ADDRESSBOOK"); //profile uri } catch (BEEPError e) { // catch and deal with errors System.out.print("error code: "+ e.getCode()); } catch (BEEPException e) { // catch lower level exceptions } String message = "<person>"+ "<name>Fangming</name>" + "<tel>0049-531-2145611</tel>"+ "</person>"; ByteDataStream msgst = new ByteDataStream( request.getByes("utf-16")); msgst.setContentType("text/xml"); msgst.setTransferEncoding("utf-16"); Reply reply = new Reply(); channel.sendMSG(msgst, reply); while (true) { Message repmsg = reply.getNextReply(); DataStream ds = repmsg.getDataStream(); InputStream is = ds.getInputStream(); // the reply is a stream, not a string byte inputbuf[]=new byte[256]; int inputlen; String reptxt; while (ds.isComplete() == false || is.available() > 0) { inputlen = is.read(inputbuf); if (inputlen > 0) { reptxt = reptxt.concat(new String(inputbuf, 0, inputlen, "utf-16"); } } System.out.println("got back:" +reptxt); Thread.currentThread.sleep(6000); } // end while } // end main
3. Implementierung der Konzeption mit Java BEEP • Server public class AddressbookProfile implements Profile, StartChannelListener, MessageListener { ... public StartChannelListener init(String uri, ProfileConfiguration config) throws BEEPException { return this; } public void startChannel( Channel channel, String encoding, String data) throws StartChannelException { channel.setDataListener(this); } public void closeChannel(Channel channel) throws CloseChannelException { channel.setDataListener(null); } public void receiveMSG(Message message) throws BEEPError, AbortChannelException { DataStream ds = message.getDataStream(); AddressbookEntry newentry; String replytxt = "<person uid=\"" + String.valueOf(newentry.getUID()) + \""/>"; DataStream reply=new ByteDataStream( replytxt.getBytes("utf-16")); reply.setContentType("text/xml"); try { message.sendRPY(reply); } catch (BEEPException e) { // exception handling } } ... } // end class AddressbookProfile
4. Zusammenfassung • BEEP ist ein verbindungsorientiertes Protokoll und unterstützt die asynchrone Interaktion. • Die ausgetauschten Daten werden mit XML kodiert. • BEEP hat die Fähigkeit von Peer-to-Peer, Client-to-Server oder Server-to-Server. • Der „Missbrauch“ von HTTP für Anwendungsprotokolle kann durch BEEP elegant abgelöst werden.