[PYTHON][RESEAU] Taille limite des paquets TCP ?

Fermé
victor1507 Messages postés 43 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 24 mai 2018 - 24 mai 2018 à 17:30
yg_be Messages postés 23476 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 février 2025 - 24 mai 2018 à 23:38
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
A voir également:

3 réponses

Utilisateur anonyme
24 mai 2018 à 18:31
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.
0
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
0
victor1507 Messages postés 43 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 24 mai 2018 1
24 mai 2018 à 18:52
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
0
Utilisateur anonyme
24 mai 2018 à 18:56
De rien :-)
0
yg_be Messages postés 23476 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 février 2025 Ambassadeur 1 568
24 mai 2018 à 20:20
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.
0
victor1507 Messages postés 43 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 24 mai 2018 1
24 mai 2018 à 20:48
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.
0
yg_be Messages postés 23476 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 février 2025 1 568 > victor1507 Messages postés 43 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 24 mai 2018
24 mai 2018 à 21:18
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.
0
victor1507 Messages postés 43 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 24 mai 2018 1
24 mai 2018 à 21:48
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.

--
0
yg_be Messages postés 23476 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 février 2025 1 568 > victor1507 Messages postés 43 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 24 mai 2018
Modifié le 24 mai 2018 à 21:55
le résultat peut varier d'un endroit à l'autre ou d'un moment à l'autre, puisque le découpage en messages n'est pas garanti par TCP.
tu pourrais aussi envoyer la taille de ton message au début.
0
victor1507 Messages postés 43 Date d'inscription lundi 15 février 2016 Statut Membre Dernière intervention 24 mai 2018 1
Modifié le 24 mai 2018 à 21:59
Ahhh ok super merci !

Oui effectivement ça pourrait être une très bonne idée ! je vais me pencher là dessus mais du coup il faudrait appeler plusieurs fois la fonction
connexion.recv()
?

0