Eigenes Netzwerkprotocoll

ENNEMMEE

Member
Hallo, ich hab mal wieder ein Problem... allerdings eher ein theoretisches oder besser gesagt ein Verständnisproblem.
Zunächst mal was ich möchte: ich würde gerne ein Netzwerkprotokoll entwickeln, das aber nicht auf Text basiert, sondern "reale" Werte überträgt... d.h. ich möchte eine Zahl (z.B. 6784343) nicht als String übertragen, sondern z.B. nur die 4 Byte, die der Datentyp umfasst... soweit ja kein Problem... nun möchte ich aber eine variable Anzahl solcher Zahlen und auch noch 2 Zeichenketten variabler Länge dazupacken und daraus ein Paket schnüren. Logische Folge: Ich brauch sowas wie nen Header, wo mir die Anzahl der Zahlenwerte und die Länge des Pakets mitgeteilt wird.
Das alles ist auch völlig logisch und ist soweit ja auch kein Problem!

Vielleicht denke ich jetzt auch im Kreis und hab ein Brett vorm Kopf:
Wie erkenne ich nun einen Fehler, wenn z.B. ein Client z.B. ein Byte "vergisst" oder sogar "absichtlich weglässt"? Dann lese ich doch ein Byte des folgenden Paketheaders mit aus und beginne dann beim folgenden Paket auch nicht am Anfang, sondern um 1 Byte versetzt und bekomme ja absolut nichts anderes als Müll oder hab ich da irgendwo nen Fehler in meiner "Logik"?

Beispiel:
(Paketlänge aus dem Header ausgelesen = 5Byte) (Datenteil, 4 Byte lang)
im darauffolgenden Paket lese ich doch dann nur Müll aus oder nicht?

Klar, der Client darf sowas nicht vergessen, aber ich möchte das Protokoll "rock steady" haben und auch ein bösartiger Client soll da kein Durchkommen haben... vielleicht denke ich auch einfach zuviel nach ;-)

Hat da jemand schon etwas mehr Erfahrung als ich und kann mir vielleicht weiterhelfen oder mir ein paar Sachen sagen, wo ich mich schlau machen kann? Seiten mit Beispielen zu solchen Sachen? Bin auf diesem Gebiet leider ein absoluter Anfänger, denn eigene Protokolle entwickeln ist halt doch was neues :rolleyes:

Meine Ideen beschränken sich bislang ziemlich... das einzige was mir einfällt wäre ne Hash-Prüfsumme des Pakets im Header... die Wahrscheinlichkeit, dass im darauffolgenden Paket ein Kombination aus Bytes zu finden ist, die dann im Zusammenspiel wieder einen richtigen Hash ergeben ist wohl sehr nahe an 0... aber vielleicht gibt es ja Techniken und Vorgehensweisen um sowas noch eleganter zu lösen?
 
aehm... wo genau ist dein problem?
was hast du vor? warum reicht dir tcp/ip nicht aus?

du solltest am besten mal nach sogenannten "escape"-sequenzen suchen.
und "paritaet", ausserdem noch nach "nachrichtentechnik" und "viterbi"
 
ich versteh das problem nicht ganz....
"eigenes netzwerkprotokoll" auf welcher osi ebene willst du ein eigenes machen? warum benutzt du nicht UDP?
ENNEME schrieb:
(Paketlänge aus dem Header ausgelesen = 5Byte) (Datenteil, 4 Byte lang)
im darauffolgenden Paket lese ich doch dann nur Müll aus oder nicht?
hä? meinst du jetzt, was passiereren würde wenn die länge der daten nicht der im header angegebenen größe entspricht? prüf doch einfach vor dem auslesen der daten, deren größe...
und was hat das mit dem nächsten paket zu tun? bei so geringen paketgrößen kannst du ohne probleme das dont_frag flag im ip-header setzen (ich denk mal am transport layer wirst du nicht schrauben) dann werden pakete nicht zerstückelt und jeder header betrifft nur ein paket. hash funktionen hat ip übrigens auch da brauchst nichts mehr selber machen...
 
Naja Protokoll und Paket sind Begriffe, die leider etwas überladen sind :-( Mir fiel nur nichts besseres ein... Beim OSI-Modell wär das Layer-7, also garnicht auf Netzwerkebene rumgepfuscht sondern einfach nur eine festgelegte Form der Kommunikation zwischen einem Server und einem Client... also garnichtmal runterbrechen auf tcp/ip oder udp, denn das ist ja nur die zugrundeliegende "Übermittlungsart"... den Tipp mit den Escape-Sequenzen werd ich mir mal anschauen - den Begriff hab ich zumindest als ich studiert hatte damals schon des öftern gehört... mal kucken ;-)
Also danke für die schnellen Antworten und die Tipps... ich werd's mir mal anschauen, ob das in diesem Fall was bringt...

Hab mir auch ein Thema rausgesucht, dass irgendwie schwer zu erklären ist, was ich genau meine... ich möchte einfach nur 3-5 Zahlenwerte und 2 oder 3 Zeichenketten vom Server an den Client übermitteln, allerdings die Zahlen nicht als Zeichenketten, sondern als tatsächlichen Wert übermitteln... vielleicht versteht man mich ja jetz besser ;-)

So, und jetz geh ich mal Googlen und nachlesen ;-)
 
das lässt sich sehr simpel mit udp gestalten. ich würde zum testen, die beiden programme tcpdump und sendip empfehlen, les dir die man seiten mal durch wenn das klappt sollte was du machen willst ein klacks in c++ sein... (wenn es grafisch seien soll kannst du dir auch mal die netzwerk klassen von qt angucken, die machen das ganze noch einfacher)
 
Naja ich brauch im Prinzip beides sowohl TCP/IP als auch UDP...

Vielleicht mal ein Beispiel ;-) Ich empfange folgendes (2 Byte Header):

03 0A 42 A2 7A 00 06 DD ...Zeichenkette1... 01 1E 45 01 ...Zeichenkette2

03 Zahlenwerte - "42 A2", "7A 00" und "06 DD" - und eine Zeichenkette der Länge 0A
und im Anschluss ein neues "Paket" aus 01 Zahlenwerten ("45 01") und einer Zeichenkette der Länge 1E

So und jetzt kommt ein "bösartiger" Client und sendet in diesem Beispiel beim ersten Mal statt der Länge 0A einfach mal 0B und hängt trotzdem ne Zeichenkette der Länge 0A dran, was dann? Alles was ich danach aus dem Datenstrom auslese ist unbrauchbar und schlicht falsch... vor einem solchen Fall möchte ich mich aber absichern, weiß nur nicht wie ;-)

So, jetzt hab ich mir aber richtig Mühe gegeben mein Problem zu erklären ;-) Gut, dass ich kein Lehrer geworden bin - ich kann wohl nicht rüberbringen was ich meine ;-)
 
Ich hab zwar nicht alles gelesen, aber empfehle dir einfach mal ethereal zu installieren und zu schauen wie es vorhandene Protokolle so machen.
 
Hallo!

Warum generierst Du über deine Daten nicht einfach einen Hash und überträgst ihn mit?
Wenn du es noch sicherer haben möchtest dann nimm auch noch einen Packetcounter hinzu, so dass
du dich for Replayattacken schützt.

Gruß, Dox.
 
Jo über Prüfsummen bzw. Hashes hab ich mir das auch gedacht... dachte nur vielleicht geht's ja doch nochmal einfacher... hätte ja auch sein können, dass ich damit völlig auf dem Holzweg bin und es wesentlich einfacher ginge ;-)

Aber danke für die Hilfe Jungs!!! ;-)
 
Wenn du binärdaten überträgst kannst du die Gültigkeit von Daten nur über zulässige Werte eingrenzen, weil jeder beliebige Zustand eine gültige Zahl repräsentiert. Der einzige Ansatz für dein Problem ist also die Vertrauenswürdigkeit des Clients sicherzustellen.
 
also... die uebertragung ist IMMER in der form, die du dir vorstellst.
selbst wenn du die zeichenkette "2342" hast, wird diese erstmal auf die vier bytes "32 33 34 32" heruntergebrochen.
wenn du jetzt also die zahl 2342 hast, dann zerlegst du sie durch folgenden (einfachen) code in die einzelnen bytes:

Code:
unsigned long x;
unsigned char a,b,c,d;

x=2342;

a=x&0xff;
b=(x>>8)&0xff;
c=(x>>16)&0xff;
d=(x>>24)&0xff;


das was ich mit den ascii-sequenzen meinte ist das hier: nehmen wir mal an, dass dein escape-zeichen der backslash ist.
dann wuerde ich dein paket so einpacken:
Code:
\DiesIstEinHeaderDieLaengeIst4.32.33.34.32 \DiesIstDasEndeUndDiePruefsummeIstx
da logischerweise in deinem paket auch der ascii-wert fuer \ auftauchen kann musst du dir auch noch ein
Code:
\DiesIstWirklichEinBackslash
definieren.
boese clients koennen dann eine boese laenge schicken. durch die escape-sequenz am ende ist dein paket redundant verpackt.
 
Oha... danke, dass ihr einem Anfänger wie mir da so sehr auf die Sprünge helft ;-) Dann war das Brett vor'm Kopf wohl doch nicht so groß wie ich dachte ;-)
Ich denke ich werd das Ganze über Prüfsummen lösen - sollte dann irgendwo mal was nicht passen muss ich halt schauen was ich dann weiter mach...
Auf jeden Fall schon mal ein großes Danke ;-)
 
Zurück
Oben