Ich habe eine Anwendung, die TCP-Daten von einem Socket einliest. Das sendende Gerät sendet 1400 Byte Daten an den Server-Socket am anderen Ende. Irgendwo auf dem Weg wird das Paket in ein 1024-Byte-Segment und ein 376-Byte-Segment segmentiert / fragmentiert. Um die Daten auf meiner Anwendungsseite korrekt zu empfangen, muss ich den Socket zweimal lesen und das Paket auf Anwendungsebene zusammenstellen, was zu Problemen mit viel Verkehr führen kann.
Nach allem, was ich gelesen habe, wird die Neuzusammenstellung von TCP-Segmenten auf der IP-Ebene abgewickelt. Ich verwende Windows Server 2012 und meine Anwendung verwendet Winsock. Gibt es eine Möglichkeit, das Betriebssystem so zu konfigurieren, dass diese Pakete neu zusammengestellt werden, sobald sie auf dem Port dieser Schicht empfangen werden?
quelle
Antworten:
TCP ist ein Streaming-Protokoll und kein Nachrichtenprotokoll. Der TCP-Stack im Betriebssystem stellt sicher, dass die Daten in der richtigen Reihenfolge an die Anwendung weitergeleitet werden und dass kein Datenverlust und keine Datenverdoppelung erfolgt. Es ist nicht wichtig, Paketgrenzen beizubehalten, da TCP, wie ich bereits sagte, ein Stream-Protokoll ist. Dem Absender steht es auch frei, einen einzelnen Schreibvorgang in mehrere Pakete aufzuteilen oder mehrere Schreibvorgänge zu einem einzigen Paket zu kombinieren. Es wird eine Aufteilung durchgeführt, um die Paketgröße an die MTU / PMTU anzupassen, um eine Paketfragmentierung während der Zustellung zu vermeiden, und es wird eine Kombination durchgeführt, um den Overhead der Zustellung zu reduzieren.
Daher sollte sich die Anwendung niemals auf implizite Nachrichtengrenzen verlassen, da die sendende Anwendung die Daten geschrieben hat, sondern stattdessen explizite Nachrichtengrenzen (auf Anwendungsebene) verwendet werden müssen.
Nein, Sie müssen in Ihrer Bewerbung richtig damit umgehen.
quelle