Protokolle zur Netzwerk-Kommunikation
- Fragestellung:
- Wie kann man eine große Datei sicher über das
Internet verschicken?
- Grundprinzip
- Datei in Blöcke zerlegen
- Blöcke verschicken (ggf. auf verschiedenen Wegen)
- beim Empfänger einsammeln und auf Vollständigkeit
prüfen
- ggf. fehlende Blöcke nachfordern
- Grundsätzlicher Modell-Aufbau:
- Generator erzeugt große Datei
- Zerleger macht daraus viele Einzelblöcke und schickt
sie weiter
- Router schickt Blöcke weiter, wählt einen von
mehreren Wegen
- Empfänger sammelt Blöcke ein und erzeugt komplette
Nachricht
- Stark vereinfacht, es fehlt z. B.:
- dynamische Wahl des Weges durch komplexes Netzwerk
- Verlorengehen von Blöcken
- → keine Nachforderung fehlender Blöcke
- volle Komplexität in den Protokollen TCP und IP
- Interessierende Größen:
- Durchsatz (MB/s) bei kleinen/großen Dateien
- Zeit Sender - Empfänger
- Verhalten bei mehreren Dateien, z. B.
- zwei große Dateien parallel
- eine große Datei + viele kleine
- Grundbeispiel sendmessage1A:
- eine Nachricht auf zwei Wegen
- Generator
- erzeugt eine große Nachricht
- ≙ eine Entität mit Attributen messageId,
size (in Blöcken), destination,
blockId (für später)
- Maske mit Parametern für messageId,
size, destination,
Erzeugungszeit t0
- Berechnung der Intergeneration
time
- persistent index;
if isempty(index)
index = 1;
end
times = [t0, inf];
dt = times(index);
index = index + 1;
- Fragmentation
- zerlegt Nachricht in Blöcke
- Entity Replicator
erzeugt size Kopien
- Server mit fester Zeit 0.1s → Blöcke kommen in
kurzen Zeitabständen
- Queue als Zwischenspeicher, setzt blockId
in Entry action
- Router
- verteilt Blöcke auf zwei Wege
- verwendet Verteilmethode Equiprobable
- hat eigenen Zwischenspeicher
- Leitung (Line)
- Server mit unendlicher Kapazität
- feste, aber pro Line unterschiedliche Servicezeit
(= Laufzeit)
- Anzeige der blockIds
(Path1a etc.)
- Display-Variante mit Masken-Parameter attrib
zur Auswahl des angezeigten Attributs
- Eigenschaft Evaluate
von attrib ist off
- Masken-Initialisierung setzt Entry
action des Servers
- varName = ['entity.',
strtrim(attrib)];
block = [gcb, '/EntityServer'];
set_param(block, 'PostArrivalFunction', ['showValue(' varName
');']);
- Assembler
- Standard-Komponente Entity
Batcher
- sammelt feste Zahl von Entitäten in einer
einzelnen Batch-Entität
- Batch-Entität intern Array der Einzel-Entitäten
- Ergebnis
- Dynamischer Assembler (sendmessage1B):
- Problem: Entity Batcher
verwendet feste Zahl von Blocks, nicht aus Message
- besser: Länge N der Message aus Message-Attribut
- Idee: N-1 ankommende Blöcke vernichten, N-ten
durchlassen
- letzter Block repräsentiert dann komplette
Message
- wir sind nicht an der genauen Nachbildung der
Message interessiert, sondern nur am Routing-/Zeitverhalten
- Implementierung
- Queue steuert Output Switch
über Entry Action
- persistent count;
if isempty(count)
count = 1;
end
if count == entity.size
port = 1;
else
port = 2;
end
count = count + 1;
createMessage(port);
- Queue sammelt nicht, aber es gibt keinen
"Durchlauf"-Block mit Entry oder Exit Action
- Simulink Function createMessage erzeugt Message (wie
oben)
- Verhalten identisch zu vorher bei n = 10, klappt auch
bei n = 20
- Problem bei n = 30: nur 25 Blöcke werden erzeugt
- Ursache: FIFO bei Fragmentation zu klein
- sendmessage1C hat großen
FIFO → alles ok
- Erweiterung des Leitungsmodells:
- Komponente Line
- Durchlaufzeiten exponentiell verteilt
- maximale Kapazität als Parameter
- zusätzlich Ausgabe der momenten Auslastung
- Problem: viele Blöcke mit Zufallswerten
- verwenden alle verschiedene Zufalls-Streams
(wegen Übersetzung nach C++)
- brauchen verschiedene Seeds
- häufiger Trick: eine generelle Seed, andere
Blöcke addieren Konstanten
- bei vielen Blöcken unübersichtlich und
fehleranfällig
- bessere Lösung
- ein globaler Stream im Modell
- in Action-Funktionen Matlabs rand-Funktion
verwenden: coder.extrinsic('rand');
- modell-globale Seed setzen per InitFcn()
- Gesamtmodell sendmessage2A
- Router verwendet Methode round-robin
- Ergebnis
- Schicken einer längeren Nachricht:
- andere Parameter (sendmessage2B)
- unterer Weg langsamer, kleinere Kapazität
- Ergebnis
- Analyse
- untere (rote) Leitung ausgelastet, blockiert
- → alle anderen Leitungen warten (wegen
round-robin)
- Übertragungszeit 17.1 s
- Routing umstellen auf First port
that is not blocked (sendmessage2C)
- Blöcke verwenden Line1,
bis die voll ist, dann auch Line2
- besser: Lines gleichmäßig auslasten
- Übertragungszeit 12.4 s
- Verbessertes Routing (sendmessage2D):
- adaptiver Routing-Algorithmus
- Auslastungen der Lines werden an Router gemeldet
- Router wählt immer Leitung mit kleinster
Auslastung
- Gesamtmodell
- aktuelle Auslastungen der Lines gehen zum Router
- Router
- Matlab-Funktion liefert Index des kleinsten Werts
- [~, y] = min(u);
- erzeugt Message zur Steuerung des Output
Switch
- Ergebnis
- Übertragungszeit wie vorher, da kein Engpass
- Leitungen gleichmäßig ausgelastet
- Störung in einer Leitung (sendmessage2E):
- ab t > 10s Transportzeit auf Line1
5x so lang
- Implementierung
- Berechnung der Service Time
- coder.extrinsic('rand');
dt = 1.0; % tell coder type of result
if getTime() < 10
dt = -delay*log(rand());
else
dt = -5*delay*log(rand());
end
- verwendet Simulink-Funktion getTime()
- Ergebnis
- Übertragung dauert etwas länger
- Auslastungen bleiben gleichmäßig
- Aufgaben: