Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Netzwerkprotokoll mit Verschlüsselung, Kompression, Prioritätssystem und vielem mehr (https://www.delphipraxis.net/170565-netzwerkprotokoll-mit-verschluesselung-kompression-prioritaetssystem-und-vielem-mehr.html)

Zacherl 24. Sep 2012 00:02


Netzwerkprotokoll mit Verschlüsselung, Kompression, Prioritätssystem und vielem mehr
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo zusammen,

in diesem Thread habe ich ein paar Anregungen für ein Netzwerkprotokoll gesucht. In der Hoffnung, dass mir ein paar Leute beim Testen helfen und vielleicht noch einige Verbesserungsvorschläge auftauchen, präsentiere ich hier schonmal den aktuellen (voll funktionsfähigen) Fortschritt.

Die wichtigsten Features im Überblick:
  • :arrow: Trennung von Datenpaketen
    • Jedes Paket kommt unverändert und korrekt getrennt beim Empfänger an.
    • Zwei schnell aufeinander gefolgte Datenpakete kommen so beispielsweise nicht in einem Rutsch an, wie es normalerweise bei TCP die Regel ist.
  • :arrow: Simultane Übertragungen
    • Durch dieses Feature ist es möglich, mehrere Übertragungen gleichzeitig über eine einzelne Verbindung ablaufen zu lassen.
    • Die maximale Anzahl an gleichzeitigen Übertragungen kann individuell festgelegt werden.
  • :arrow: Einfaches Prioritätssystem
    • Priorisierte Übertragungen sind auch dann aktiv, wenn die maximale Anzahl an gleichzeitigen Übertragungen bereits erreicht ist. So kann man beispielsweise Steuerbefehlen einen Vorrang vor Dateitransfers einräumen.
  • :arrow: Transparente Verschlüsselung
    • Über einfache Encryption Provider Klassen können sämtliche Benutzerdaten vollständig transparent verschlüsselt übertragen werden.
  • :arrow: Transparente Kompression
    • Analog zur Verschlüsselung können die Benutzerdaten automatisch blockweise komprimiert werden.
  • :arrow: Transferkontrolle
    • Sowohl Sender als auch Empfänger kann über einfache Methoden eine Übertragung pausieren, fortsetzen oder abbrechen.
  • :arrow: Eventbasierte Funktionalität
    • Verschiedene Events, wie beispielsweise OnTransferInit, OnTransferWork, OnTransferData und OnTransferFinish bieten dem Entwickler eine komfortable Schnittstelle.
  • :arrow: Einfache Dateiübertragungen
    • Integrierte Unterstützung für Dateiübertragungen. Hierdurch müssen Dateien nicht erst vollständig in den Speicher geladen werden, um sie verschicken zu können.
  • :arrow: Intelligenter Datenempfang
    • Der Empfänger kann pro Übertragung seperat entscheiden, ob er über die eingehenden Daten bei jedem Block, oder erst am Ende der Übertragung informiert werden will.
    • Erstere Möglichkeit bietet sich beispielsweise für Dateiübertragungen an. Bei der zweiten Variante sorgt IDTP automatisch für das Sammeln der Daten im Speicher.
  • :arrow: Meta Informationen
    • Jeder Übertragung können Meta Daten hinzugefügt werden, welche dem Empfänger (und Sender) sofort beim Start des Transfers in den Events zur Verfügung stehen. Diese Daten werden auch dann sofort gesendet, wenn die eigentlichen Benutzerdaten z.b. aufgrund der maximalen Anzahl an gleichzeitigen Übertragungen noch nicht gesendet werden.

Weitere Informationen:
  • Hagen Reddmanns RCx Unit, welche im TdxIDTPEncryptionProviderRCx verwendet wird, findet ihr hier:
  • Die ZLibEx Unit für den TdxIDTPCompressionProviderZLib gibt es hier:

Eine (einfache) Demo Anwendung habe ich als Anhang hinzugefügt. Ich würde mich über jeden Test und vor allem auch über Verbesserungsvorschläge sehr freuen :)

Viele Grüße
Zacherl

ByTheTime 8. Okt 2012 20:28

AW: Netzwerkprotokoll mit Verschlüsselung, Kompression, Prioritätssystem und vielem m
 
Uff... ich schau mir das gearde an. Hast du auch dazu eine Demo :D Dann würde ich mir erstmal schneller einen Überblick schaffen können. Eventuell würde ich sie dann in mein bestehendes Protkoll einbinden, ich war die ganze Zeit auf der Suche nach soetwas, denn im Moment kommt in meinem Projekt der Punkt, wo es um das übertragen von Dateien geht, und da wird es schon ziemlich schwierig selbst was auf die Beine zu stellen. Ein ordentliches Protkoll kommt mir da sehr recht :) Und ich arbeite auch gearde mit der Verschlüsselung... Da läuft im Moment auch nicht alles rund :S

Zacherl 9. Okt 2012 02:15

AW: Netzwerkprotokoll mit Verschlüsselung, Kompression, Prioritätssystem und vielem m
 
Hatte im Moment leider noch ein paar andere Sachen zu tun, deshalb ist die Entwicklung der Demo etwas eingeschlafen. Werde die Tage mal dran weiterarbeiten, bzw. kann dir gerne die unfertige Demo schonmal vorweg per PM schicken, wenn du magst. Ist soweit eigentlich alles drinnen, was man braucht, um sich einzuarbeiten.

Zacherl 10. Okt 2012 12:11

AW: Netzwerkprotokoll mit Verschlüsselung, Kompression, Prioritätssystem und vielem m
 
Hier mal ein kleines Update:
  • Jeder Transfer hat nun eine eigene Instanz des Encryption- und Compression Providers
  • Der MetaData Provider wurde entfernt
  • Neue Helfer Klassen für einfaches Senden und Empfangen von Daten- oder MetaDaten Paketen wurden hinzugefügt
  • Verschiedene Bugfixes

Die meisten Anregungen aus dem Konzept Thread habe ich aus Zeitgründen noch nicht eingebaut, allerdings habe ich jetzt mal eine kleine Demo Anwendung hinzugefügt.

DP-Maintenance 10. Okt 2012 12:26

Dieses Thema wurde am "10. Oct 2012, 13:26 Uhr" von "SirThornberry" aus dem Forum "Netzwerke" in das Forum "Software-Projekte der Mitglieder" verschoben.

MrMooed 15. Okt 2012 15:08

AW: Netzwerkprotokoll mit Verschlüsselung, Kompression, Prioritätssystem und vielem m
 
Bin auch gerade auf der Suche nach einer Möglichkeit Daten zu übermitteln - wobei dein Projekt für mich wohl ein Paar Größenordnungen zu überdimensioniert ist :lol:

Könntest du evtl. eine .Exe hochladen ? Kann das Projekt leider nicht öffnen mit meinem Delphi7 (klappt auch nicht wenn ich, wie du schoneinmal geschrieben hast, WinApi.Windows in Windows umändere. Dann meckert er, dass eine Vcl.Forms.dcu fehlt ..)

Klingt auf jedenfall vielversprechend :thumb:

himitsu 15. Okt 2012 15:13

AW: Netzwerkprotokoll mit Verschlüsselung, Kompression, Prioritätssystem und vielem m
 
Zitat:

Zitat von MrMooed (Beitrag 1187114)
Kann das Projekt leider nicht öffnen mit meinem Delphi7 (klappt auch nicht wenn ich, wie du schoneinmal geschrieben hast, WinApi.Windows in Windows umändere. Dann meckert er, dass eine Vcl.Forms.dcu fehlt ..)

Dann entferne dort auch den Namespace :zwinker:

Mit XE2 wurden Namespaces für Units der RTL/VCL eingeführt.

System.SysUtils (System.SysUtils.pas bzw. System.SysUtils.dcu)
WinApi.Windows
WinApi.Messages
Vcl.Forms
Vcl.Dialogs
...

(in D2009 fing es mit den Units der Generics an, wo Punkte in Namen verwendet wurden)

DataCool 16. Okt 2012 00:02

AW: Netzwerkprotokoll mit Verschlüsselung, Kompression, Prioritätssystem und vielem m
 
@Zacherl:
Ich habe es mir gerade aus Neugier grob angeschaut.
Deinen Ansatz/Aufbau finde ich gut, erstmal :thumb:
Bei mir hat alles ohne jegliche Fehler geklappt.

Als Anregung würde ich Support von verschiedenen Socketkomponenten
vorschlagen, aber das steht glaube ich auch schon auf Deiner ToDo-List,
wenn ich mich recht an die Kommentare erinnere.

Greetz Data

P.S.: wenn Du noch mehr Funktionen mit Demo einbaust teste ich gerne

Furtbichler 16. Okt 2012 07:25

AW: Netzwerkprotokoll mit Verschlüsselung, Kompression, Prioritätssystem und vielem m
 
Praktisch.

Eine Frage:

Ist "Intelligenter Datenempfang" eine Alternative zur "Trennung von Datenpaketen"? Kann ich auch intelligent senden, also nicht nur Dateien, sondern auch Daten?

Zacherl 16. Okt 2012 08:42

AW: Netzwerkprotokoll mit Verschlüsselung, Kompression, Prioritätssystem und vielem m
 
Erstmal danke fürs testen euch beiden :)

Zitat:

Zitat von DataCool (Beitrag 1187184)
Als Anregung würde ich Support von verschiedenen Socketkomponenten
vorschlagen, aber das steht glaube ich auch schon auf Deiner ToDo-List,
wenn ich mich recht an die Kommentare erinnere.

Genau, das hatte ich schon geplant. Ich werde es wohl so handhaben, dass für den Sende Teil ein zusätzliches Event ausgelöst wird, in dem der User dann mit der Socket Komponente seiner Wahl die Daten abschickt. Der Empfangsteil sollte ja schon Socket unabhängig sein.

Zitat:

Zitat von Furtbichler (Beitrag 1187198)
Ist "Intelligenter Datenempfang" eine Alternative zur "Trennung von Datenpaketen"? Kann ich auch intelligent senden, also nicht nur Dateien, sondern auch Daten?

Definitiv. Wobei ich den "Intelligenter Datenempfang" logisch eher zu den "Einfachen Dateiübertragungen" zuordnen würde. Zur genaueren Erklärung: Wenn du "normale" Daten, also keine Dateien sendest, wird intern die TdxIDTPBaseTransfer Klasse erzeugt. Dort werden deine Daten in einen Buffer kopiert und dann nach und nach vom Sende Thread losgeschickt. Jetzt kann man sich vorstellen, was passiert, wenn man versuchen würde auf diese Weise beispielsweise einen Film (sagen wir mehrere Gigabyte) zu übertragen. Damit in diesem Falle nicht erst alle Daten in den Speicher geladen werden müssen, wird für Dateitransfers die TdxIDTPFileTransfer Klasse verwendet, welche die übergebene Datei öffnet und bei jedem Cycle des Sende Threads die Daten dynamisch per ReadFile() ausliest und abschickt.
Beim Empfänger kommt dann der "Intelligente Datenempfang" ins Spiel. Hat man einfache Daten, sagen wir mal einen Steuerbefehl mit ein paar Parametern, würde man diesen ja gerne "in einem Rutsch" empfangen, ohne ggfls. erst die Teilpakete wieder zusammensetzen zu müssen. Für diesen Zweck gibt es im OnTransferInit Event den variablen Parameter AutoCollectData. Ist diese Funktion aktiviert, sammelt der IOHandler alle eingehenden Daten eines Transfers in einen Buffer und löst das OnTransferFinish Event erst bei vollständigem Eingang aller Daten aus. Für große Dateien macht dies natürlich keinen Sinn, da man hier schnell wieder Speicherprobleme bekommen würde. Außerdem will man bei einem Dateitransfer die Datei in der Regel auch auf Empfängerseite wieder als solche speichern und nicht im RAM behalten. Hier kann man dann AutoCollectData deaktivieren, was bewirkt, dass bei jedem Teilpaket das OnTransferData Event aufgerufen wird. Das erlaubt es dann die Daten z.b. analog zum Sender per WriteFile() wieder in einer Datei abzulegen.

gammatester 16. Okt 2012 09:58

AW: Netzwerkprotokoll mit Verschlüsselung, Kompression, Prioritätssystem und vielem m
 
Ist das nur ein Konzept oder soll das ernsthaft verwendet werden? Wenn ja, solltest Du in der Unit dxIDTPEncryptionProviderRCx nicht das Delphi-Random verwenden, was ja bekanntermaßen nicht besonders geeignet ist für Kryptoanwendungen. Außerdem wird es noch weiter verschlimmbessert durch
Delphi-Quellcode:
Salt[I] := Random(255)
, gemeint ist wohl
Delphi-Quellcode:
Salt[I] := Random(256)
.

Edit: Weiter ist mM ein Offset-Fehler mit Bufferoverflow-Potential vorhanden: In
Delphi-Quellcode:
RCxEncode(FRCx, Salt[1], Output^, FSaltLength)
muß die 1 doch wohl durch 0 oder Low(Salt) ersetzt werden.

Gruß Gammatester

Zacherl 16. Okt 2012 10:49

AW: Netzwerkprotokoll mit Verschlüsselung, Kompression, Prioritätssystem und vielem m
 
Werde ich mir, wenn ich zu Hause bin nochmal anschauen. Kann sein, dass ich beim Salt vorher einen String verwendet habe und der Index 1 noch ein vergessenes Überbleibsel ist. Zur Random Funktion bzw. kryptographischer Sicherheit: Der RCx Provider dient als Beispiel. Du kannst dir gerne mit DEC einen AES Provider basteln, der auch die sicheren Random bzw. Salt Funktionen vom DEC verwendet. Primär geht es hier aber auch um das Protokoll und nicht um die verwendete Verschlüsselung oder Kompression.

sh17 16. Okt 2012 12:20

AW: Netzwerkprotokoll mit Verschlüsselung, Kompression, Prioritätssystem und vielem m
 
Warum nicht die hier zum Verschlüsseln?

http://www.cityinthesky.co.uk/opensource/dcpcrypt

Zacherl 16. Okt 2012 13:12

AW: Netzwerkprotokoll mit Verschlüsselung, Kompression, Prioritätssystem und vielem m
 
Leute ... :/ Ist zwar schön, dass ihr hier so toll auf die Verschlüsselung eingeht, aber hier geht es primär um das Protokoll. Die Verschlüsselung ist ein Feature das so umgesetzt ist, dass sich jeder User durch Ableiten vom entsprechenden Provider eine eigene Variante implementieren kann. Darin kann man dann jede erdenkliche Crypto Lib verwenden.

Bleibt bitte bisschen beim Thema. Der Hinweis von gammatester bezüglich des falschen Idizes ist definitiv wichtig, aber ich möchte hier keine Diskussion welche Crypto Lib am besten ist oder welcher Random Number Generator eine optimale kryptographische Sicherheit erzielt :)

sh17 16. Okt 2012 14:02

AW: Netzwerkprotokoll mit Verschlüsselung, Kompression, Prioritätssystem und vielem m
 
So war es auch nicht gemeint, sollte nur unterstreichen, das es eben funktionierende Klassen gibt, eben weil es hier um das Protokoll geht. Sieh es als Ergänzung/Empfehlung/Beigabe.

Zacherl 16. Okt 2012 14:50

AW: Netzwerkprotokoll mit Verschlüsselung, Kompression, Prioritätssystem und vielem m
 
Zitat:

Zitat von sh17 (Beitrag 1187272)
So war es auch nicht gemeint, sollte nur unterstreichen, das es eben funktionierende Klassen gibt, eben weil es hier um das Protokoll geht. Sieh es als Ergänzung/Empfehlung/Beigabe.

Alles klar kein Ding :D Hatte ja vorher auch schon das DEC als Alternative Crypto Klassen Sammlung angemerkt.

@gammatester:
Du hattest recht, der Index 1 und die 255 im Random sind falsch. Werde ich korrigieren und beim nächsten Update integrieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz