OVH Cloud OVH Cloud

Fragmentation des réponses POP

9 réponses
Avatar
Nicolas Favre-Félix
Bonjour tout le monde.

Je développe actuellement une application client mail et j'ai une question
quand aux paquets que m'envoie un serveur pop. Après connection au serveur
de mail, j'envoie des requetes comme "USER xxxxx" et le serveur me répond
+OK ou -ERR. Mais ces réponses peuvent-elles arriver en plusieurs paquets?
(une boucle sur recv() )
Dans mon bouquin de programmation réseau, ils ne font qu'un recv sans
boucler. Est-ce correct ou ces messages peuvent-ils arriver en plusieurs
fois?

Merci de votre aide.

9 réponses

Avatar
el8fr
En theorie, rien ne garanti que le message arrive en une seule fois.
Le MSS (maximum segment size si mes souvenirs sont bons) est calculé
au début de la connexion TCP. Si celui-ci est inférieur à la longueur
du paquet envoyé par le serveur alors le paquet sera fragmenté.
Il faut donc que tu lise la réponse du serveur tant qu'il y a
quelquechose à lire: utilisation de select() sur une socket blocante
ou alors read() en boucle sur une socket non blocante. (Voir le groupe
dédié à ton OS pour de plus amples informations).



"Nicolas Favre-Félix" wrote in message news:<3f26aeaa$0$1799$...
Bonjour tout le monde.

Je développe actuellement une application client mail et j'ai une question
quand aux paquets que m'envoie un serveur pop. Après connection au serveur
de mail, j'envoie des requetes comme "USER xxxxx" et le serveur me répond
+OK ou -ERR. Mais ces réponses peuvent-elles arriver en plusieurs paquets?
(une boucle sur recv() )
Dans mon bouquin de programmation réseau, ils ne font qu'un recv sans
boucler. Est-ce correct ou ces messages peuvent-ils arriver en plusieurs
fois?

Merci de votre aide.


Avatar
T0t0
"Nicolas Favre-Félix" wrote in message
news:3f26aeaa$0$1799$
Je développe actuellement une application client mail et j'ai une question
quand aux paquets que m'envoie un serveur pop. Après connection au serveur
de mail, j'envoie des requetes comme "USER xxxxx" et le serveur me répond
+OK ou -ERR. Mais ces réponses peuvent-elles arriver en plusieurs paquets?
(une boucle sur recv() )
Dans mon bouquin de programmation réseau, ils ne font qu'un recv sans
boucler. Est-ce correct ou ces messages peuvent-ils arriver en plusieurs
fois?


En fait, la fragmentation n'est pas gérée par la couche applicative
mais par la couche 3 IP. Donc vu de ton application, tu n'as pas besoin
de te soucier d'une quelconque fragmentation. Cela se fera
silencieusement par la couche 3 s'il y en a besoin.
C'est l'avantage du modèle en couches. Chaque couche assure des tâches
particulières et ne se soucie pas des autres.


--
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG

Avatar
T0t0
"Patrick_91" wrote in message
news:
Mais le boulot de la
couche 4 c'est aussi de defragmenter tout ca et de restituer l'integralite
les data d'origine de facon transparente pour les applications (couche 5)


Houla, fragmentation en couche 3, pas 4 :-)

Donc a mon avis ceci ne doit absolument pas influer sur l'ecriture d'une
application, et se doit de rester absolument transparent faut de quoi de
bon vieux problemes d'interoperabilite sont a prevoir !! ..


Tout à fait.


--
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG

Avatar
Nicolas Favre-Félix

Idealement et meme pratiquement ca n'a aucune importance, pour programmer
au

niveau application (couche 5 tcp/ip) il n'y a aucune raison de se
preoccuper de ce qui se passe au niveau session tcp (couche 4) .


Ben justement si:

Si la taille pratique du packet excede MSS alors il y aura fragmentation
et les donnees

seront envoyees sur plusieurs packets (Fragmentation). Mais le boulot de
la

couche 4 c'est aussi de defragmenter tout ca et de restituer l'integralite
les data d'origine de facon transparente pour les applications (couche 5)
.


Tout à fait d'accord mais la fragmentation pose problème

Donc a mon avis ceci ne doit absolument pas influer sur l'ecriture d'une
application, et se doit de rester absolument transparent faut de quoi de
bon vieux problemes d'interoperabilite sont a prevoir !! ..


J'avais commencé par faire ça "proprement" en bouclant sur le recv pour être
sûr de tout recevoir en cas de fragmentation. La fonction recv renvoie le
nombre d'octets reçus, je faisais donc une boucle jusqu'à ce que ce nombre
soit égal à 0. Mais je recevais d'abord l'dentification du serveur ("+OK
") puis je m'attendais à recevoir 0 puisque
le serveur attends une commande USER. Mais la fonction recv boucle pendant
au moins 30 secondes avant de renvoyer SOCKET_ERROR. Je ne peux donc pas
détecter la fin de son message, et si le serveur fragmente sa réponse je ne
pourrais pas recevoir la fin. Comment faire?

Amicalement

--
Patrick
Dept 91


Merci

Avatar
Patrick_91
T0t0 wrote:

"Patrick_91" wrote in message
news:
Mais le boulot de la
couche 4 c'est aussi de defragmenter tout ca et de restituer
l'integralite les data d'origine de facon transparente pour les
applications (couche 5)


Houla, fragmentation en couche 3, pas 4 :-)


OUi raccourci allegre de ma part, je voulais dire : frag et defrag (couche 3
reseau ) mais la restitution de l'integralite des datas est du ressort de
la couche 4 (session tcp dans ce cas )

Dont acte ..

Amicalement

--
Patrick
Dept 91


Avatar
Patrick_91
Nicolas Favre-Félix wrote:



Idealement et meme pratiquement ca n'a aucune importance, pour programmer
au

niveau application (couche 5 tcp/ip) il n'y a aucune raison de se
preoccuper de ce qui se passe au niveau session tcp (couche 4) .


Ben justement si:

Si la taille pratique du packet excede MSS alors il y aura fragmentation
et les donnees

seront envoyees sur plusieurs packets (Fragmentation). Mais le boulot de
la

couche 4 c'est aussi de defragmenter tout ca et de restituer
l'integralite les data d'origine de facon transparente pour les
applications (couche 5)



Bonjour


Comme ditet suite a la remarque de "T0t0 " c'est la
couche 3 (couche reseau IP) qui fragmente et reassemble les packets au gre
des besoins (carracteristiques des interfaces), et non pas la couche 4
(session tcp). En effet la couche 4 extrait les donnees d'un packet
reassemble et donc , si vous travaillez au niveau session tcp il n'y a pas
de raison de s'apercevoir qu'il y a eu ou non Frangmentation.

D'autre part, lors de la negociation d'ouverture de session pop3 il n'y a
aucune raison qu'une fragmentation se fasse car il sagit de packets tres
courts . Certainement un bug quelque part car dans cette phase la il n'y a
pas matirer a fragmentation.

Amicalement

--
Patrick
Dept 91


Avatar
Olivier Macchioni
On Wed, 30 Jul 2003 11:38:52 +0200, "Nicolas Favre-Félix"
wrote:

J'avais commencé par faire ça "proprement" en bouclant sur le recv pour être
sûr de tout recevoir en cas de fragmentation. La fonction recv renvoie le
nombre d'octets reçus, je faisais donc une boucle jusqu'à ce que ce nombre
soit égal à 0. Mais je recevais d'abord l'dentification du serveur ("+OK
") puis je m'attendais à recevoir 0 puisque
le serveur attends une commande USER. Mais la fonction recv boucle pendant
au moins 30 secondes avant de renvoyer SOCKET_ERROR. Je ne peux donc pas
détecter la fin de son message, et si le serveur fragmente sa réponse je ne
pourrais pas recevoir la fin. Comment faire?


"Responses in the POP3 consist of a status indicator and a keyword
possibly followed by additional information. All responses are
terminated by a CRLF pair." (RFC 1939)

-> et hop, on cherche un CRLF (et on ne se fie pas à la RFC qui dit
qu'un message POP fait 512 caractères : si ton client attaque un
serveur qui n'obéit pas à la RFC, il risque de mal se comporter)

Attention, j'ai déjà observé le cas inverse à la défragmentation : 2
messages courts concaténés, reçus lors d'un seul recv(). Il faudrait
donc également le prendre en compte.

Olivier

P.S. les 30 secondes, on dirait que ça correspond au timeout TCP.

Avatar
PYT
La fragmentation des datagrammes IP est traitée au niveau de la couche 3, et
cela n'a aucune importance pour les applications utilisant TCP.
Par contre, il ne faut pas oublier que TCP transmet des FLUX, et non pas des
datagrammes. Il n'y a donc aucune raison pour que les appels de primitives
correspondent à un datagramme IP au niveau de la machine locale; et a
fortiori aucune raison pour que les send et recv de deux machines distantes
soient appairés.
Charge aux applications de retrouver dans le flux les marqueurs convenus
pour identifier les unités sémantiques.

Au contraire, UDP transmet des DATAGRAMMES: ils sont restitués tels que émis
(sans faute et complets: le traitement des fragments assuré par IP**, et il
y a un CRC pour éliminer les erreurs). Mais comme c'est n'est PAS un
protocole de flux, il n'y a aucune raison pour que N datagrammes émis
arrivent tous, et encore moins de raison qu'ils arrivent dans l'ordre
d'émission. Et là, on ne peut même pas resynchroniser les applications en
fermant la socket.

** Enfin presque, parceque l'implémentation que j'ai pu utiliser était
erronnée en mélangeant le problème du MTU avec la couche 4, dans la machine
de départ. Resultat: les datagrammes n'arrivaient même pas complets!
Avatar
Nicolas Favre-Félix

"Responses in the POP3 consist of a status indicator and a keyword
possibly followed by additional information. All responses are
terminated by a CRLF pair." (RFC 1939)

-> et hop, on cherche un CRLF (et on ne se fie pas à la RFC qui dit
qu'un message POP fait 512 caractères : si ton client attaque un
serveur qui n'obéit pas à la RFC, il risque de mal se comporter)

Attention, j'ai déjà observé le cas inverse à la défragmentation : 2
messages courts concaténés, reçus lors d'un seul recv(). Il faudrait
donc également le prendre en compte.


Merci à vous tous c'est parfait. En effet les messages ne font pas 512
caractères, je vais donc chercher le CRLF.