2010-12-29 3 views
2

Je sais que TCP fournit une transmission de données de type flux, mais la question principale est - quelles situations peuvent survenir lors de l'envoi de données via TCP?
1. Le message peut être divisé en N blocs pour correspondre à la taille MTU.
2. Deux messages peuvent être lus dans 1 appel recv.Fragmentation TCP

Peut-il y avoir la prochaine situation?
MTU par exemple 1500 octets.
Les appels clients envoient avec des données de 1498 octets.
Les appels clients envoient avec 100 octets de données.
Le serveur appelle recv et reçoit des données de 1500 octets.
Le serveur appelle recv et reçoit des données de 98 octets. Donc, il finira avec la situation où 2 octets du second client seront reçus dans le premier serveur recv.

Mon protocole défini comme foolows:
4 octets - longueur de données
de contenu de données.

Je me demande si je peux arriver à une situation où 4 octets (longueur de données) seront divisés en 2 morceaux?

+0

Même si elle ne le diviser, est-il une différence. Après toutes vos données seront correctement relayées à votre destination, garanti par TCP. http://en.wikipedia.org/wiki/Transmission_Control_Protocol – DumbCoder

+0

Il n'y a pas de "message" en ce qui concerne TCP. Si vous avez un concept de message dans votre code, TCP n'en sait absolument rien. –

Répondre

6

Oui, un flux d'octets peut être divisé sur n'importe quelle limite d'octets. Vous ne pouvez certainement avoir votre tête longueur de données de 4 octets divisé dans l'une des 8 façons différentes:

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

Certains d'entre eux sont plus susceptibles de se produire que d'autres, mais vous devez tenir compte pour eux. Le code qui pourrait gérer cela pourrait ressembler à quelque chose comme ce qui suit:

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

La chose importante est que * cela n'a pas d'importance * si vous bloquez et attendez les quatre octets complets avant de continuer. TCP fera son travail et réassemblera les données fragmentées de manière transparente. – cdhowie

+0

@cdhowie - Bien que cela puisse être vrai, il n'y a aucune garantie que tous les logiciels se trouvant entre le code et le fil construisent des paquets de façon un-à-un avec chaque appel SendData. C'est-à-dire que si quelque part sur la ligne le tableau d'octets passé dans l'appel est jugé trop grand pour les circonstances, rien ne garantit que le message ne sera pas divisé en plusieurs paquets. –