AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Stream über TCP - Blockaufteilung ?
Thema durchsuchen
Ansicht
Themen-Optionen

Stream über TCP - Blockaufteilung ?

Ein Thema von Stefanie · begonnen am 3. Dez 2009 · letzter Beitrag vom 8. Dez 2009
Antwort Antwort
Seite 1 von 2  1 2      
Stefanie

Registriert seit: 12. Aug 2004
21 Beiträge
 
#1

Stream über TCP - Blockaufteilung ?

  Alt 3. Dez 2009, 09:45
Ich möchte über TCP Streams übertragen. Nun ist es ja bei TCP nicht so einfach wie bei UDP. Bei UDP kann ich einfach einen Stream senden und dieser kommt beim UDP-Emfänger in einem Stück wieder so an. Bei TCP - soweit ich das bisher richtig verstanden habe - werden die Daten(also der Stream) Blockweise übertragen und ich muß den Stream beim Emfänger aus den einzelnen Blöcken wieder zusammensetzen. Nun ist es nach meinen Tests so, dass größere Streams in mehrere Blöcke aufgeteilt und so Stück für Stück übertragen werden. Hingegen bei vielen kleinen Streams(Streamgröße ~ 5 bis 10 Byte), die schnell hintereinander gesendet werden (über socket.sendstream(Stream)) kommen auf der Emfängerseite mehrere Streams zu einem Block zusammengefasst an. Bei einer langsamen Netzwerkverbindung, z.B. über Modem bzw. ISDN tritt die Zusammenfassung von Streams zu größeren Blöcken deutlich stärker auf als bei einer schnellen internen LAN-Verbindung.

Nun meine Frage(n): Kann ich irgenwo festlegen, dass die kleinen Streams nicht zu mehreren Blöcken zusammengefasst und gesendet werden, bzw. kann ich die Blockgröße festlegen.
Gibt es eine verständliche Logik, wie die Blockgröße bei TCP festgelegt wird. Weis ich schon irgendwoher schon beim Senden, in welche Blöcke mein Stream aufgeteilt bzw. zusammengefasst wird ?
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Stream über TCP - Blockaufteilung ?

  Alt 3. Dez 2009, 09:49
Guten Morgen,

die "Blockgröße" wird durch die Maximal Transfer Unit (MTU-Size) bestimmt.
Diese kann auf dem Interface (tcpDoctor) eingestellt werden.
Default MTU-Size ist, wenn ich micht nicht irre, 1500 Byte.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
ele

Registriert seit: 18. Feb 2009
129 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Stream über TCP - Blockaufteilung ?

  Alt 3. Dez 2009, 10:31
Ich glaube du verwechselst da TCP mit UDP. Mit TCP kommt alles in einem Stück an in der Reihenfolge wie du es gesendet hast. Bei UDP kannst du Blöcke versenden, kannst aber nicht sicher sein, dass die jeweiligen Blöcke auch ankommen und schon gar nicht, dass sie in der selben Reihenfolge ankommen.
  Mit Zitat antworten Zitat
Stefanie

Registriert seit: 12. Aug 2004
21 Beiträge
 
#4

Re: Stream über TCP - Blockaufteilung ?

  Alt 3. Dez 2009, 10:51
Danke Klaus,
ich hatte gehofft, dass die Blockgröße eine Einstellung beim SocketClient bzw. SocketServer ist und ich diese je nach größe des zu sendenden Streams anpassen(erzwingen) kann. So macht das aber keinen rechten Sinn, die Blockgröße zu erzwingen.
Das die MTU die Fragmentierung der Daten eigenständig übernimmt ist ja soweit OK, aber dass die MTU auf der "Gegenstelle" die Daten nicht wieder defragmentiert verwundert mich überhaupt.
Aber warum werden dann kleine Streams zu großen Blöcken zusammengefasst? Einen großen Stream wieder aus mehreren Blöcken zusammensetzen ist einfach und ich brauch nur die Größe des Streams. Einen Block in mehrere kleine Streams wieder aufspalten ist nur mit irgendeiner unique Erkennung am Anfang & Ende des Streams möglich. Das bedeutet zusätzliche Bytes am Anfang & Ende des Streams. Das möchte ich vermeiden, den bei einer Streamgröße von z.B. 6 Bytes überhaupt würde das die kleine Datenmenge unnötig aufblähen.

Habt ihr eine Idee für mein Problem ?

Zitat:
Ich glaube du verwechselst da TCP mit UDP. Mit TCP kommt alles in einem Stück an in der Reihenfolge wie du es gesendet hast. Bei UDP kannst du Blöcke versenden, kannst aber nicht sicher sein, dass die jeweiligen Blöcke auch ankommen und schon gar nicht, dass sie in der selben Reihenfolge ankommen.
Bei TCP kommt der Stream eben nicht in einem Stück an - eben wegen der Fragmentierung durch die MTU.
  Mit Zitat antworten Zitat
ele

Registriert seit: 18. Feb 2009
129 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Stream über TCP - Blockaufteilung ?

  Alt 3. Dez 2009, 11:52
Ich habe das Gefühl wir reden mit gleichen Begriffen von verschiedenen Dingen.

Ein Stream ist für mich eine beliebige anzahl von Zeichen die übertragen werden soll. Wenn Alice über TCP Daten an Bob sendet, dann wird der Stream sehr wohl in einzelne IP-Datagramme zerlegt und verschickt. Bei Bob werden diese Pakete aber wieder zusammengesetzt und in der Reihenfolge wie sie gesendet wurden. Dafür ist ja TCP da sonst müsste man alles mühsam mit UDP, welches nicht sicherstellt dass ein Paket auch ankommt und auch nicht in der richtigen Reihenfolge.

Wenn du TCP benutzt musst du dich nicht um Paketgrössen oder Reihenfolge kümmern, das macht TCP für dich. Wenn du das nicht möchtest, dann ist TCP das falsche Protokoll dafür. Beim Streaming von Audio- und Video-Daten z.B. (und das hat z.B. mit einem Stream wie er in Delphi definiert ist gar nichts zu tun) wird UDP verwendet. Das eine oder andere Paket, dass verloren geht, ist dabei nicht relevant (dafür gibt es Qualitätseinbussen).

Oder ich habe nicht verstanden worum es geht...
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#6

Re: Stream über TCP - Blockaufteilung ?

  Alt 3. Dez 2009, 12:19
Zitat von Klaus01:
Default MTU-Size ist, wenn ich micht nicht irre, 1500 Byte.
nur bei <1Gbit Netzen.
Bei >=1Gbit gibt es Jumboframes
Wenn du PPPOE nutzen ist die Paketgröße noch kleiner 1492.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Stream über TCP - Blockaufteilung ?

  Alt 3. Dez 2009, 12:30
Was interessiert dich das eigentlich? Du befindest dich doch im Application Layer vom OSI Referenzmodell mit deiner Anwendung. was die untergeordneten Protokolle machen, ist für dich doch gar nicht von Interesse. Deswegen gibt es ja diese Abstraktion, dass man sich auf Anwendungsebene nicht darum kümmern muss.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Stream über TCP - Blockaufteilung ?

  Alt 3. Dez 2009, 12:33
Zitat von generic:
Zitat von Klaus01:
Default MTU-Size ist, wenn ich micht nicht irre, 1500 Byte.
..
Bei >=1000Gbit gibt es Jumboframes
..
Gibt es da schon was quasi 1 Terrabit/s?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#9

Re: Stream über TCP - Blockaufteilung ?

  Alt 3. Dez 2009, 12:45
er meinte wohl MBit,
aber ja, sowas gibt es schon lange 'ne G1-Leitung hatte ich mir schon lange gewünscht, wobei es ja heutzutage schonwieder was Schnelleres gibt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Stefanie

Registriert seit: 12. Aug 2004
21 Beiträge
 
#10

Re: Stream über TCP - Blockaufteilung ?

  Alt 3. Dez 2009, 13:38
Zitat:
Was interessiert dich das eigentlich? Du befindest dich doch im Application Layer vom OSI Referenzmodell mit deiner Anwendung. was die untergeordneten Protokolle machen, ist für dich doch gar nicht von Interesse. Deswegen gibt es ja diese Abstraktion, dass man sich auf Anwendungsebene nicht darum kümmern muss.
Luckie, damit hast du völlig recht. Was interessiert mich das eigentlich? Ich möchte einefach einen Stream übertragen und fertig. Doch ich empfange eben den Stream nicht so wie ich ihn gesendet habe. Ich erhalte den Stream Blockweise oder mehrere Streams in einem Block und muß dann selbst wieder meine Streams zusammenbasteln oder aus dem Block trennen. Der Link von Klaus war für mich sehr hilfreich, da ist alles sehr schön erklärt mit der Fragmentierung. Aber wie gesagt, damit will ich eigentlich nichts zu tun haben. Bisher hab ich noch keine Idee für mein oben angesprochenes Problem.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:32 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