Den Empfänger verstehen
AFB I–IIGegeben ist die Empfängerfunktion eines Stop-and-Wait-Protokolls. Rahmen haben das Format #nr;daten$.
def empfangen(rahmen, erwartet, daten): inhalt = rahmen[1:-1] nr_text, nutz = inhalt.split(";", 1) nr = int(nr_text) if nr == erwartet: daten.append(nutz) erwartet = erwartet + 1 return f"ACK{nr}", erwartet
- Beschreiben Sie die Arbeitsweise der Funktion.
- Stellen Sie in einer Tracetabelle dar, was bei den Rahmen
#0;SO$,#1;NN$,#1;NN$,#2;E$geschieht (Start:erwartet = 0,daten = []). - Entwickeln Sie eine Funktion
ist_rahmen(r), dieTrueliefert, wennrmit#beginnt, mit$endet, ein Semikolon enthält und vor dem Semikolon nur Ziffern stehen.
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
startswith, endswith, isdigit().Entwerfen/Entwickeln: Nach vorgegebenen Bedingungen ein Modell oder einen Algorithmus selbstständig planen bzw. erarbeiten.Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
Start- und Endzeichen werden abgeschnitten, der Rest am ersten Semikolon in Nummer und Nutzdaten geteilt. Ist die Nummer die erwartete, werden die Daten angehängt und die erwartete Nummer erhöht. In jedem Fall wird eine Quittung mit der empfangenen Nummer zurückgegeben.
Erwartungshorizont zu Aufgabe b)
| Rahmen | nr | nr == erwartet | daten | erwartet | Rückgabe |
|---|---|---|---|---|---|
| #0;SO$ | 0 | wahr | ['SO'] | 1 | ACK0 |
| #1;NN$ | 1 | wahr | ['SO','NN'] | 2 | ACK1 |
| #1;NN$ | 1 | falsch | ['SO','NN'] | 2 | ACK1 |
| #2;E$ | 2 | wahr | ['SO','NN','E'] | 3 | ACK2 |
Erwartungshorizont zu Aufgabe c)
def ist_rahmen(r): if not (r.startswith("#") and r.endswith("$")): return False inhalt = r[1:-1] if ";" not in inhalt: return False nr_text = inhalt.split(";", 1)[0] return nr_text.isdigit()
Ein Sender mit begrenzten Versuchen
AFB II–IIIEin Objekt kanal bietet kanal.schicke(rahmen) und kanal.warte_auf_ack(sekunden); die zweite Methode liefert die empfangene Quittung als Zeichenkette oder None, wenn in der Zeit nichts kam.
- Implementieren Sie eine Funktion
senden(pakete, kanal)nach Stop-and-Wait, die jedes Paket höchstens fünfmal versucht undFalsezurückgibt, wenn ein Paket nie bestätigt wird; sonstTrue. - Schätzen Sie die Dauer für 100 Pakete ab, wenn ein Paket samt Quittung 0,2 s braucht — ohne Verluste und wenn jedes zehnte Paket einmal verloren geht (Timeout 3 s).
- Diskutieren Sie die Eignung von Stop-and-Wait für eine Satellitenverbindung, bei der ein Signal 0,25 s für eine Richtung braucht.
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
def senden(pakete, kanal): for nr in range(len(pakete)): bestaetigt = False versuch = 0 while not bestaetigt and versuch < 5: kanal.schicke(f"#{nr};{pakete[nr]}$") antwort = kanal.warte_auf_ack(3) bestaetigt = antwort == f"ACK{nr}" versuch = versuch + 1 if not bestaetigt: return False return True
Erwartungshorizont zu Aufgabe b)
Ohne Verluste: \(100\cdot0{,}2=20\) s. Mit 10 Verlusten: \(20+10\cdot3=50\) s — der Timeout dominiert.
Erwartungshorizont zu Aufgabe c)
Je Paket vergehen mindestens 0,5 s (hin und zurück), in denen der Sender nichts tut. Selbst bei hoher Datenrate lassen sich höchstens zwei Pakete pro Sekunde übertragen — die Leitung liegt fast immer brach. Besser: mehrere Pakete unterwegs lassen und nummeriert quittieren (Schiebefenster-Verfahren wie bei TCP). Stop-and-Wait eignet sich nur bei kurzen Laufzeiten oder sehr kleinen Datenmengen.
