2010-12-29 11 views
2

Ich weiß, dass TCP stream-ähnliche Datenübertragung bietet, aber die Hauptfrage ist - welche Situationen können beim Senden von Daten über TCP auftreten?
1. Die Nachricht kann in N-Blöcke aufgeteilt werden, um in die MTU-Größe zu passen.
2. Zwei Nachrichten können in 1 Recv-Anruf gelesen werden.TCP Fragmentierung

Kann es die nächste Situation geben?
MTU zum Beispiel 1500 Bytes.
Client Aufrufe senden mit 1498 Bytes Daten.
Client Anrufe senden mit 100 Bytes Daten.
Der Server ruft recv auf und empfängt 1500 Byte Daten.
Server ruft recv auf und empfängt 98 Byte Daten.

So endet es mit der Situation, wenn 2 Bytes vom zweiten Client gesendet werden in ersten Server Recv empfangen werden.

My-Protokoll als foolows definiert:
4 Bytes - Datenlänge
Dateninhalt.

Ich frage mich kann ich Situation, wenn 4 Bytes (Datenlänge) in 2 Stücke aufgeteilt werden?

+0

Auch wenn es sie gespalten ist, macht es keinen Unterschied machen. Danach werden Ihre Daten korrekt an Ihr Ziel weitergeleitet, garantiert durch TCP. http://en.wikipedia.org/wiki/Transmission_Control_Protocol – DumbCoder

+0

Es gibt keine "Nachricht", was TCP betrifft. Wenn Sie ein Konzept einer Nachricht in Ihrem Code haben, weiß TCP nichts darüber. –

Antwort

6

Ja, ein Stream von Bytes kann auf beliebig Byte-Grenze aufgeteilt werden. Sie können natürlich auch Ihre 4 Byte Datenlänge Kopf Split in einem der 8 verschiedene Möglichkeiten haben:

4 
1-3 
2-2 
3-1 
1-1-2 
1-2-1 
2-1-1 
1-1-1-1 

dieser Einige sind häufiger als andere auftreten, aber Sie müssen für sie berücksichtigen. Code, der damit umgehen könnte könnte etwa wie folgt aussehen:

unsigned char buf[4]; 
size_t len = 0; 
while (len < sizeof(buf)) { 
    ssize_t n = recv(s, buf+len, sizeof(buf)-len, 0); 
    if (n < 0) { 
     // error handling here 
    } 
    len += n; 
} 
length = buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24); 
+2

Die wichtige Sache ist, dass * das egal ist, wenn Sie blockieren und auf die vollständigen vier Bytes warten, bevor Sie fortfahren. TCP wird seine Aufgabe erfüllen und die fragmentierten Daten transparent zusammensetzen. – cdhowie

+0

@cdhowie - Das mag stimmen, aber es gibt keine Garantie, dass die gesamte Software, die zwischen dem Code und der Leitung steht, Pakete mit jedem SendData-Aufruf 1: 1 erstellt. Das heißt, wenn irgendwo in der Leitung das Bytearray, das in den Anruf übergeben wird, als zu groß für die Umstände betrachtet wird, gibt es nichts, was garantiert, dass die Nachricht nicht in mehrere Pakete aufgeteilt wird. –