Bitfehler einbauen
-
Hallo,
ich brauche soetwas wie einen Satellitensimulator.
Dieser Simulator soll bei den Daten, die zwischen 2 PCs ausgetauscht werden, Bitfehler einbauen.
Hierdurch möchte ich das SCTP-Protokoll testen.
Gibts da was fertiges oder kann ich irgendwie selber Bitfehler einbauen?
-
Du kannst ja einfach zufällig Bits verändern. rand()
brauchst du dazu und bitoperationen ( &-und |-oder ...).
Ich denke das ganze dürfte nicht schwer zu implementierens ein
-
Storm.Xapek.de schrieb:
Du kannst ja einfach zufällig Bits verändern. rand()
brauchst du dazu und bitoperationen ( &-und |-oder ...).
Ich denke das ganze dürfte nicht schwer zu implementierens einja aber die Checksumme darf ja nicht neu berechnet werden. Die Frage ist, wie kann ich Daten ändern, sodass Bitfehler entstehen und die Daten neu versendet werden müssten.
-
Du baust zwischen der Sende-Funktion und der Empfangsfunktion noch eine Funktion "kanal()" ein - die bestimmt per rand(), ob und welche Bits sie verändern will - und modifiziert diese dann:
void kanal(char& data) { int count = rand()%max;//max gibt die maximale Störung (0..8) an for(int i=0;i<count;++i) { int pos=rand()%8; data ^=1<<pos; } }
Diese Funktion lässt du auf jedes Byte des Datenstroms los, bevor es zum Empfänger kommt. Der ermittelt dann hoffentlich, daß dort etwas schiefgegangen ist - und kann den Fehler entweder korrigieren oder die Daten neu anfordern.
-
Woher soll das Protokoll denn wissen, dass dort nun Bitfehler sind?
ich müsste doch Daten ändern, bevor das Protokoll die Header entfernt und Checksummen überprüft.
Erst wenn die Checksumme der Daten mit der berechneten Checksumme nicht mehr übereinstimmt, würden die Daten neu angefordert werden oder?!Wäre raw-socket hier ein Stichwort ?
-
Airdamn schrieb:
ich müsste doch Daten ändern, bevor das Protokoll die Header entfernt und Checksummen überprüft.
Genau richtig. Und genau das passiert auch bei einer realen Verbindung (die du ja simulieren willst) - irgendwo zwischen dem Sender und dem Empfänger sitzt die Störung (Rauschen, fremde Signale, etc), die deine Signale verfälscht.
Zur Simulation könntest du den verwendeten Socket in der Mitte aufspalten und die Kanalstörung dazwischen setzen (Pseudocode):
socket s2k,k2e; //Sender: char data[len]; /*Datenpaket zusammenstellen*/ send(s2k,data,datalen); //Kanal: char data[len]; while(1) { size_t datalen=recv(s2k,data,len); for(size_t i=0;i<datalen;++i) kanal(data[i]);//<- das ist die Funktion kanal() aus meinem letzten Beitrag send(k2e,data,datalen); } //Empfänger: char data[len]; size_t datalen=recv(k2e,data,len); //Datenpaket auswerten
-
erstmal Danke CStoll.
Was mir aber noch nicht klar ist, ist folgendes.
Wenn ich die Daten beim Kanal empfange und neu verschicke, dann wird doch die Checksumme neu berechnet oder nicht?Genauso wie bei TCP, wird die Checksumme der zu sendenden Daten ermittelt, in den Header reingeschrieben und beim Empfänger verglichen.
Nun müsste ich doch die Daten ändern nachdem die Checksumme im Header eingetragen wurde ohne, dass das Protokoll die Checksumme neu berechnet.Also müsste ich doch unter dem Protokoll Layer die Daten verändern.
Aber wie?
-
Naja, die Verarbeitung im Kanal beschränkt sich auf ein Minimum (eventuell wäre da wirklich ein rwa-Socket passend), Checksummen auf Anwendungsebene werden davon nicht beeinflußt (also wenn du im Abschnitt "Datenpaket zusammenstellen" eine Prüfsumme berechnest und anhängst, läuft die unbeeinflußt durch den Kanal (von den Zufallsstörungen abgesehen) und kann auf Empfängerseite auch wieder ausgewertet werden). Und was für deine Ende-zu-Ende-Verbindung Header und Parity-Bits sind, ist für den drunterliegenden Nachrichtenkanal ganz normaler Bit-Salat.
(Randbemerkung: Darf man erfahren, auf welcher Abstraktionsebene du die Netz-Übertragung eigentlich betrachtest?)
-
Gut, dann werde ich mal was über raw-sockets suchen.
Da ich das SCTP-Protokoll testen/vorführen will, betrachte ich die Transport-Schicht (OSI-Layer 4).
Möchte den Datenverkehr mit Ethereal aufzeichnen und darstellen.
-
Falls es jemanden interessiert oder der Vollständigkeitshalber:
mit RAW-Sockets kann man Pakete mit Ethernet-IP-SCTP Header senden/empfangen.
Auf diese Weise kann ich dann ein Daten-Paket verändern, ohne dass die Checksumme neu berechnet wird, und weiter schicken.siehe SOCK_RAW, SOCK_PACKET, IP_HDRINCL