5 Stimmen

Wie zuverlässig ist das .NET TCP-Protokoll?

Ich bin ziemlich neu in C# so bitte mit mir zu tragen. Ich schreibe eine relativ einfache Client-Server-Anwendung in C# .NET 4.0. Ich verwende das TCP-Protokoll, TCPListener und TCPClient, um genau zu sein. Ich weiß, wie das TCP-Protokoll in der Theorie funktioniert. Aber ich muss 100% sicher sein, dass es keine (unbehandelten) Fehler während der Datenübertragungen geben wird.

Woher weiß ich nach dem Senden von Daten, ob diese erfolgreich empfangen wurden? Kann ich mich vollständig auf die zugrunde liegende Implementierung des TCP-Protokolls verlassen? Es ist also nicht notwendig, dass ich von der anderen Seite bestätige, dass die Daten empfangen wurden?

Es ist wichtig, dass ich wirklich weiß, welche Daten gesendet und erfolgreich empfangen wurden. Ich weiß, es ist eine dumme Frage, aber ich möchte wirklich sicher sein. Ich danke Ihnen für Ihre Zeit und Ihre Antworten.

21voto

Jon Punkte 411383

TCP garantiert das:

  • Die von Ihnen gesendeten Daten werden in der Reihenfolge ankommen, in der Sie sie senden.
  • Die von Ihnen gesendeten Daten werden genau so empfangen, wie Sie sie gesendet haben (unmodifiziert)
  • Es werden keine anderen (unerwünschten) Daten empfangen.

Es garantiert nicht, dass Nagetiere Ihre Kabel nicht auffressen, dass der Strom im Gebäude nicht ausgeht oder dass der Prozess auf dem anderen Rechner, mit dem Sie sprechen, überhaupt etwas unternimmt, wenn das Betriebssystem ihm mitteilt, dass Daten für ihn eingetroffen sind.

Wenn Sie eine positive Bestätigung benötigen, dass Daten empfangen und verarbeitet wurden, müssen Sie die Bestätigung manuell zurücksenden (da TCP-Verbindungen duplex sind, haben Sie bereits einen Kanal dafür).

Natürlich ist all dies in keiner Weise spezifisch für .NET, Windows oder eine andere Implementierung eines Netzwerkstapels.

Aktualisierung: Ich möchte ausdrücklich darauf hinweisen, dass es, nachdem der Netzwerkstapel des Betriebssystems die Daten zur Übertragung akzeptiert hat, keine Möglichkeit gibt, zu wissen, dass das Verfahren am anderen Ende diese Daten empfangen hat. Der Netzwerk-Stack weiß in den meisten Fällen, dass die Daten das Ziel erreicht haben (durch TCP ACK-Nachrichten), aber es weiß nicht, ob das Betriebssystem auf dem Zielsystem sie an den Prozess weitergeleitet hat, für den sie bestimmt sind . Die einzige Möglichkeit besteht also darin, die eigene Nachricht "Daten empfangen und bearbeitet" zurückzusenden.

4voto

quamrana Punkte 32950

Mit TCP/IP allein kann man nicht feststellen, ob Daten empfangen werden - man müsste ein weiteres Protokoll darüberlegen.

Wenn Sie peut Wenn man herausfindet, dass bestimmte Daten empfangen wurden, dann garantiert TCP/IP, dass alle Daten vor diesen Daten auch empfangen wurden.

1voto

user207421 Punkte 297318

Das ".NET TCP-Protokoll" gibt es nicht. Es gibt nur das TCP-Protokoll, das seit etwa 30 Jahren im Internet eingesetzt wird. Es ist zuverlässig. Das war ein Entwicklungsziel.

0voto

BrandonZeider Punkte 7834

Eine Option wäre die Verwendung von WCF Zuverlässige Sitzungen über TCP. Zuverlässige WCF-Sitzungen maskieren Transportausfälle.

0voto

sehe Punkte 346808

Wenn Sie wirklich Zuverlässigkeit brauchen UND Netzwerkverkehr, warum nicht mit Nachrichten-Warteschlangen ? Sie haben eine Transaktionsgarantie (etwa so stark wie die Disziplin der Entwickler, die damit arbeiten, aber nicht stärker als das!)

Es ist wie Ihr gesamter Verkehr mit datenbankserverähnlicher Sicherheit (und dito Leistung). Ich denke, Sie können leicht konfigurieren .NET Remoting zur Verwendung eines MSMQ-Kanals .

Ich persönlich habe es nie getan dass aber ich habe die Nachrichtenwarteschlange im Allgemeinen verwendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X