web-dev-qa-db-fra.com

Quand un paquet réseau TCP réseau sera-t-il fragmenté au niveau de la couche application?

Quand un paquet TCP sera-t-il fragmenté au niveau de la couche application? Quand un paquet TCP est envoyé depuis une application, le destinataire de la couche application recevra-t-il jamais le paquet en deux ou plusieurs paquets? Dans l'affirmative, quelles conditions entraînent la division du paquet. Il semble qu'un paquet ne sera pas fragmenté jusqu'à ce qu'il atteigne la limite Ethernet (au niveau de la couche réseau) de 1 500 octets. Mais, cette fragmentation être transparent pour le destinataire au niveau de la couche application puisque la couche réseau va réassembler les fragments avant d'envoyer le paquet à la couche suivante, non?

34
zooropa

Il sera divisé lorsqu'il atteindra un périphérique réseau avec une MTU inférieure à la taille des paquets. La plupart des périphériques Ethernet sont 1500, mais il peut souvent être plus petit, 1492 si cet Ethernet passe par-dessus PPPoE (DSL) en raison des informations de routage supplémentaires, encore plus bas si une deuxième couche est ajoutée comme Windows Partage de connexion Internet. Et la numérotation est normalement de 576!

En général, vous devez vous rappeler que TCP n'est pas un protocole de paquet. Il utilise des paquets au niveau le plus bas pour transmettre sur IP, mais en ce qui concerne l'interface pour toute pile TCP, il s'agit d'un protocole de flux et n'a aucune obligation de vous fournir un 1: 1 relation avec les paquets physiques envoyés ou reçus (par exemple, la plupart des piles contiendront des messages jusqu'à l'expiration d'un certain laps de temps, ou il y a suffisamment de messages pour maximiser la taille du paquet IP pour le MTU donné)

Par exemple, si vous avez envoyé deux "paquets" (appelez deux fois votre fonction d'envoi), le programme de réception peut ne recevoir que 1 "paquet" (la pile de réception TCP peut les combiner ensemble). Si vous implémentez un protocole de type de message sur TCP, vous devez inclure un en-tête au début de chaque message (ou un autre mécanisme d'en-tête/pied de page) afin que le côté récepteur puisse diviser le TCP flux en des messages individuels, soit lorsqu'un message est reçu en deux parties, soit lorsque plusieurs messages sont reçus en bloc.

37
David

La fragmentation doit être transparente pour une application TCP. Gardez à l'esprit que TCP est un protocole de flux: vous obtenez un flux de données, pas des paquets! Si vous êtes en construisant votre application sur la base de l'idée de paquets de données complets, vous rencontrerez des problèmes, sauf si vous ajoutez une couche d'abstraction pour assembler des paquets entiers à partir du flux, puis passez les paquets à l'application.

16
dwc

La question fait une supposition qui n'est pas vraie - TCP ne livre pas les paquets à ses points de terminaison, il envoie plutôt un flux d'octets (octets). Si une application écrit deux chaînes dans TCP, il peut être délivré sous la forme d'une chaîne à l'autre extrémité; de même, une chaîne peut être fournie sous la forme de deux (ou plusieurs) chaînes à l'autre extrémité.

RFC 79 , section 1.5:

"Le TCP est capable de transférer un flux continu d'octets dans chaque direction entre ses utilisateurs en empaquetant un certain nombre d'octets en segments pour la transmission via le système Internet."

Les mots clés étant flux continu d'octets (octets).

RFC 79 , section 2.8:

"Il n'y a pas de relation nécessaire entre les fonctions Push et les limites des segments. Les données d'un segment particulier peuvent être le résultat d'un seul appel SEND, en tout ou partie, ou de plusieurs appels SEND."

L'intégralité de la section 2.8 est pertinente.

11
Kevin Panko

Au niveau de la couche application, il existe un certain nombre de raisons pour lesquelles les 1 500 octets ne peuvent pas afficher une seule lecture. Divers facteurs dans le système d'exploitation interne et la pile TCP peuvent faire en sorte que l'application obtienne des octets dans un appel de lecture et d'autres dans le suivant. Oui, le TCP = la pile doit réassembler le paquet avant de l'envoyer, mais cela ne signifie pas que votre application va tout récupérer en une seule fois (il est PROBABLE de le récupérer en une seule lecture, mais ce n'est pas GARANTI de le récupérer) une lecture).

TCP essaie de garantir la livraison dans l'ordre des octets, avec une vérification des erreurs, des renvois automatiques, etc. qui se produisent derrière votre dos. Considérez-le comme un canal au niveau de la couche d'application et ne vous embourbez pas trop dans la façon dont la pile l'envoie réellement sur le réseau.

5
Michael Kohne

This page est une bonne source d'informations sur certains des problèmes que d'autres ont soulevés, à savoir le besoin d'encapsulation des données sur un protocole d'application par protocole d'application Pas tout à fait faisant autorité dans le sens que vous décrivez, mais il a des exemples et provient de quelques grands noms de la programmation réseau.

2
mrmcgreg

Si un paquet dépasse le maximum MTU d'un périphérique réseau, il sera divisé en plusieurs paquets. (Notez que la plupart des équipements sont définis sur 1 500 octets, mais ce n'est pas une nécessité.)

La reconstruction du paquet doit être entièrement transparente pour les applications.

2
Ben S

Différents segments de réseau peuvent avoir différentes valeurs MTU. Dans ce cas, une fragmentation peut se produire. Pour plus d'informations, voir Taille maximale de segment TCP

Cette (dé) fragmentation se produit dans la couche TCP. Dans la couche application, il n'y a plus de paquets. TCP présente un flux de données contigu à l'application).

2
lothar

A la "couche d'application" un TCP (enfin, segment vraiment; TCP sur sa propre couche ne sait pas des paquets) n'est jamais fragmenté, car il n'existe pas. La couche application est l'endroit où vous voyez les données comme un flux d'octets, remis de manière fiable et dans l'ordre.

Si vous y pensez autrement, vous approchez probablement quelque chose de la mauvaise façon. Cependant, cela ne veut pas dire qu'il n'y a peut-être pas de couche au-dessus de cela, disons, une séquence de messages délivrés sur ce flux secondaire fiable et ordonné.

2
Curt J. Sampson

Correct - la façon la plus informative de voir cela est d'utiliser Wireshark , un outil précieux. Prendre le temps de le comprendre - m'a sauvé plusieurs fois et donne une bonne vérification de la réalité

1
Jeff

Si un paquet de 3 000 octets pénètre dans un réseau Ethernet avec une taille MTU par défaut de 1 500 (pour Ethernet), il sera fragmenté en deux paquets de 1 500 octets chacun. C'est la seule fois à laquelle je peux penser.

Wireshark est votre meilleur pari pour vérifier cela. Je l'utilise depuis un moment et je suis totalement impressionné

0
Srikar Doddi