[Réseau] TCP
Propos par yamashi

le mardi 20 janvier 2009 21h 05mn 20s

1898 visualisations



Bonjour a tous !

Je vais vous expliquer un peu comment grer le packet stacking qui est un problme assez courant en TCP.
Dmonstration du problme :
http://naruto-abunai.com/tuto/stacking.jpg

Front size : Taille annonc par le header du paquet (attention j'ai cod ca moi mme donc il va falloir vous dmerder ^^ )
Packet size : Taille retourn par recv.

Comme vous pouvez voir dans la console de mon serveur la taille front annonc est 11 alors que la taille du packet est de 22 on en conclu donc que 2 packet de mme type sont arriv en 1 seul packet.

Vous vous demanderez "Donc ca arrive uniquement avec des paquets du mme type ?" Et non ce n'est pas si simple que ca j'ai juste flooder le mme packet avec mon logiciel pour tester le serveur.

Mais le problme est que cette erreur est arriv aprs le 8ime packet avec un intervale de 500ms entre chaque packet.
On estime de nos jours qu'il faut 30-40 packet/secondes pour un jeu fluide donc imaginez le nombre de stack que l'on risque d'avoir de plus on peut empiler plus de 2 packet donc on a pas le choix il faut dcoup le segment de donn reu pour retrouv les packets intacts.

Comment faire ?

Code:

    while(packet->size()!=0)
    {
        if(packet->front_size() == packet->size())
        {
            WorldPacket* pa = new WorldPacket;
            char* t = (char*)packet->c_str();
            pa->push_back(t,packet->size());
            _recvQueue.push(pa);
            packet->removeAll();
        }
        else if(packet->front_size() < packet->size())
        {
            _recvQueue.push(packet->pop_front());
        }
    }
    return 0;

Premirement ce code ne compilera pas chez vous.
packet est le gros packet que l'on recoit par le recv.
pop_front retourne le paquet de taille front_size et les supprime de la queue.
en gros:
front_size = 5, packet = 10.
-----_____
pop_front()
pa = ----- , packet = _____

Ce que je conseil :
- Faire un header contenant la taille du packet, uint16_t suffira
- A la suite de la taille un checksum (optionel)
- A la suite l'opcode.
Vous extrayez les donnes a coup de memcpy et le tour est jou.

Le packet stacking est le problme le plus courant en TCP car on envoie gnralement des petits paquet comme l'heure, un message sur le chat qui sont gnralement assez court ("xD", "lol", "go !"...), des venements NPC et AI, mais il y a aussi les packet coup qui arrive quand le packet dpasse 1492 octets !
Il faut donc grer le recollage des donnes ^^ .

Aussi ce problme ne surviendras pas en UDP mais en UDP les packets arrivent dans n'importe quel ordre et n'arrive pas toujours, donc ne vous cassez pas la tte sur le packet stacking UDP car vous n'aurez aucune chance d'en rencontrer.

Bonne chance a ce qui vont essay !


Options Liens officiels Caractristiques Statistiques Communaut
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propuls par FluxBB
Traduit par FluxBB.fr
Analys par
872 membres
1423 sujets
11109 messages
Dernier membre inscrit: Glider
10 invits en ligne
Aucun membre connect
RSS Feed

[ Gnre en 0.015 sec., 10 requtes excutes ]