[PYTHON][RESEAU] Taille limite des paquets TCP ?
victor1507
Messages postés
43
Date d'inscription
Statut
Membre
Dernière intervention
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tous,
Je bosse actuellement sur un petit projet perso de messagerie instantanée (en python). Mon but est que cette messagerie soit le plus confidentielle possible, puisque je me suis débrouillé pour que la personne qui possède le serveur ne puisse pas accéder aux messages, via des systèmes de chiffrements symétrique/asymétrique. Bref je ne vais pas poster le code ici, il y a deux mille lignes ça ferai un peu trop (mais si quelqu'un y tiens je peux le faire)
Mon problème vient du fait que lors de la création d'un compte sur la messagerie, le client doit envoyer de grandes quantités de données au serveur (notamment les clés RSA, publique en clair et privée chiffrée avec le mot de passe de l'utilisateur) allant jusqu'à plus de sept mille caractères. Lorsque je lance le serveur sur la même machine que le client, tout passe impec et les données sont correctement récupérées. Mais lorsque le serveur s’exécute sur une machine distante, cela ne fonctionne plus. J'ai investigué un peu de mon côté et j'ai fini par voir que le serveur n'avait pas l'air de traiter toute la demande, comme si il tronquait le message que le client lui fait parvenir. Pour savoir si cela venait du client ou du serveur, j'ai lancé Wireshark et là j'ai obtenu ça :

Comme vous pouvez le voir, le gros message de 7 000 caractère n'est pas envoyé par le client, il est décomposé en plusieurs paquets contenant tous 1460 bytes de données. Or le serveur lui, n'analyse que le premier paquet qu'il reçoit, ce qu'il veut dire qu'il ne traite que 1/6 des données. Du coup il plante...
Alors voila ma question : Quelqu'un pourrait-il m'expliquer pourquoi les données sont fragmentées, et quelqu'un aurait-il une solution pour moi, que ce soit du côté serveur ou client, cela me serai d'une grande aide...
Voila merci d'avoir pris le temps de me lire et j'espère que quelqu'un sera en mesure de me répondre,
Victor Josso
Je bosse actuellement sur un petit projet perso de messagerie instantanée (en python). Mon but est que cette messagerie soit le plus confidentielle possible, puisque je me suis débrouillé pour que la personne qui possède le serveur ne puisse pas accéder aux messages, via des systèmes de chiffrements symétrique/asymétrique. Bref je ne vais pas poster le code ici, il y a deux mille lignes ça ferai un peu trop (mais si quelqu'un y tiens je peux le faire)
Mon problème vient du fait que lors de la création d'un compte sur la messagerie, le client doit envoyer de grandes quantités de données au serveur (notamment les clés RSA, publique en clair et privée chiffrée avec le mot de passe de l'utilisateur) allant jusqu'à plus de sept mille caractères. Lorsque je lance le serveur sur la même machine que le client, tout passe impec et les données sont correctement récupérées. Mais lorsque le serveur s’exécute sur une machine distante, cela ne fonctionne plus. J'ai investigué un peu de mon côté et j'ai fini par voir que le serveur n'avait pas l'air de traiter toute la demande, comme si il tronquait le message que le client lui fait parvenir. Pour savoir si cela venait du client ou du serveur, j'ai lancé Wireshark et là j'ai obtenu ça :
Comme vous pouvez le voir, le gros message de 7 000 caractère n'est pas envoyé par le client, il est décomposé en plusieurs paquets contenant tous 1460 bytes de données. Or le serveur lui, n'analyse que le premier paquet qu'il reçoit, ce qu'il veut dire qu'il ne traite que 1/6 des données. Du coup il plante...
Alors voila ma question : Quelqu'un pourrait-il m'expliquer pourquoi les données sont fragmentées, et quelqu'un aurait-il une solution pour moi, que ce soit du côté serveur ou client, cela me serai d'une grande aide...
Voila merci d'avoir pris le temps de me lire et j'espère que quelqu'un sera en mesure de me répondre,
Victor Josso
A voir également:
- [PYTHON][RESEAU] Taille limite des paquets TCP ?
- Comment réduire la taille d'un fichier - Guide
- Tcp udp - Guide
- Tcp optimizer - Télécharger - Optimisation
- Citizen code python avis - Accueil - Outils
- Cable reseau player freebox - Forum Freebox
3 réponses
Bonjour
Que les messages trop longs soient fragmentés, c'est normal et c'est lié aux limitations, techniques ou normatives, de certains moyens de transmissions le long de la chaîne. Regarde ces articles sur le MTU :
https://fr.wikipedia.org/wiki/Maximum_transmission_unit
https://www.commentcamarche.net/faq/7185-introduction-au-mtu
https://www.commentcamarche.net/contents/530-le-protocole-ip
Mais je pensais (je me rappelle peut-être mal, c'était il y a longtemps et j'y ai peu touché) que TCP réassemblait les morceaux, et que cette fragmentation était transparente pour l'utilisateur moyen, qui ne descend pas si bas dans l'implémentation des protocoles.
Si tu peux maîtriser le découpage au départ, en envoyant plusieurs petits datagrammes au lieu d'un seul long, ce sera peut-être plus simple pour toi de réassembler. Sinon, pas de miracle : il faudra bien gérer le réassemblage d'après les champs prévus par TCP/IP. Bon courage.
Que les messages trop longs soient fragmentés, c'est normal et c'est lié aux limitations, techniques ou normatives, de certains moyens de transmissions le long de la chaîne. Regarde ces articles sur le MTU :
https://fr.wikipedia.org/wiki/Maximum_transmission_unit
https://www.commentcamarche.net/faq/7185-introduction-au-mtu
https://www.commentcamarche.net/contents/530-le-protocole-ip
Mais je pensais (je me rappelle peut-être mal, c'était il y a longtemps et j'y ai peu touché) que TCP réassemblait les morceaux, et que cette fragmentation était transparente pour l'utilisateur moyen, qui ne descend pas si bas dans l'implémentation des protocoles.
Si tu peux maîtriser le découpage au départ, en envoyant plusieurs petits datagrammes au lieu d'un seul long, ce sera peut-être plus simple pour toi de réassembler. Sinon, pas de miracle : il faudra bien gérer le réassemblage d'après les champs prévus par TCP/IP. Bon courage.
Merci beaucoup pour ta réponse rapide ! Je regarde les articles que tu m'as donné et je vais réfléchir à comment je peux palier au problème, je posterai quelque chose si j'y arrive et sinon je redemanderai de l'aide. Encore mille fois merci,
Victor Josso
Victor Josso
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour, tout cela me semble très normal. je pense que le serveur doit simplement continuer à lire les données reçues. TCP n'a pas le concept de messages, il traite les données comme un flux continu. le récepteur doit donc simplement lire toutes les données, et les traiter au fur-et-à-mesure. le réassemblage est simple à faire, comme les données se suivent simplement dans le flux TCP.
Bonsoir et merci de me répondre,
J'ai compris pour le mode de fonctionnement du TCP mais ce qui reste étrange c'est que lorsque le client se connecte à un serveur qui se situe sur la même machine, cela fonctionne très bien... Après en python pour recevoir des données il y a la fonction recv() et donc qui devrait s'occuper du reassemblage... J'ai quelques idées je vais faire des tests pour voir ce que cela donne.
J'ai compris pour le mode de fonctionnement du TCP mais ce qui reste étrange c'est que lorsque le client se connecte à un serveur qui se situe sur la même machine, cela fonctionne très bien... Après en python pour recevoir des données il y a la fonction recv() et donc qui devrait s'occuper du reassemblage... J'ai quelques idées je vais faire des tests pour voir ce que cela donne.
pour moi ce n'est pas étrange: TCP offre un service de flux de caractères, pas un service orienté messages. donc les programmes ne doivent pas s'attendre à un comportement consistant. des variation de comportement n'ont donc rien d'étrange.
recv devrait te donner chaque fois un morceau du message, à toi de l'appeler jusqu'à ce que tu aies le tout.
recv devrait te donner chaque fois un morceau du message, à toi de l'appeler jusqu'à ce que tu aies le tout.
oui mais pourquoi en communiquant sur la même machine on n'obtient pas le même résultat qu'avec un serveur sur une machine distante... Quoi qu'il en soit je suis en train de faire des test en ajoutant un caractère à la fin de chaque message qui permet au serveur de savoir que la fin du message a été atteinte (un ; ou un @ par exemple) je vais voir avec de grandes quantités de données.
--
--
Victor Josso