2010-06-22 4 views
2

Je viens de poser une question sur la façon d'envoyer des données plus grandes que le SendBufferSize et la réponse était qu'il serait envoyé en quelques parties.Lors de l'envoi de données plus volumineuses que SendBufferSize, comment les données seront-elles reçues?

Ma deuxième question est de savoir comment ces données seront-elles reçues? Sera-t-il complet dans le flux réseau ou sera-t-il divisé?

la première question: Can you send a file larger that the SendBufferSize throuh a TcpClient?

Répondre

2

.Net gère la division des données pour vous. Vous pouvez écrire et recevoir des paquets plus grands que SendBufferSize sans le remarquer (si vous n'êtes pas trop concerné par les performances).

1

Vous aurez besoin de quelque chose appelé message framing dans votre protocole. Fait amusant: vous en aurez besoin même si vous envoyez un message plus petit que SendBufferSize. :)

0

Il est probable que vos données vont être divisées lors de la réception. Vous devrez donc les reconstruire après avoir reçu toutes les données.

3

Par contraste avec par ex. UDP, TCP n'est pas un protocole qui permet l'envoi de "messages" individuels, qui sont remis au destinataire sous la même forme. Vous préférez envoyer et recevoir un flux d'octets.

Sous le capot, vos données obtient divisé en paquets IP, quel que soit de SendBufferSize, qui btw par défaut 8192, une valeur beaucoup plus élevée que ce qui convient dans un seul paquet IP (la taille maximale d'un paquet IP est lié au MTU, mais surtout un peu moins de 1500 octets). Exemple:

  1. Socket.Send (2000 octets)
  2. IP Packet # 1 (1460 octets)
  3. IP Packet # 2 (540 octets)

aussi: Les données de multiples Socket.Send() s peut être fusionné (Nagle's algorithm). Exemple:

  1. Socket.Send (1000 octets)
  2. Socket.Send (1000 octets)
  3. paquets IP n ° 1 (1460 octets)
  4. IP Packet # 2 (540 bytes)

Et il n'y a aucun moyen pour le récepteur de distinguer les 2 cas. De plus, pour des raisons d'efficacité, à la réception, les données peuvent vous être transmises dans un tampon de taille différente.

Ligne de fond: Avec TCP, vous ne pouvez pas compter pour recevoir des paquets dans le même nombre et avec les mêmes tailles qu'ils sont envoyés. Si vous en avez besoin, ajoutez des informations sur la taille, comme suggéré par Stephen Cleary, ou utilisez un protocole comme UDP ou si vous avez besoin de fiabilité: SCTP. Ce qui semble toutefois être un excès, à moins que vous ne soyez également intéressé par les autres améliorations de SCTP sur TCP.

4

TCP n'est pas un protocole de message uniquement. C'est un protocole basé sur les flux et prend soin de séparer les données pour nous. Lemme vous amène à la section de base. Il y a deux parties dans le cas de TCP: la segmentation et la fragmentation.

La segmentation se produit au niveau de TCP (Transport Layer). Cela dépend de deux paramètres - MSS et taille de la fenêtre. MSS détermine la taille maximale du segment qu'un périphérique peut recevoir. Le MSS est communiqué lors de l'établissement de la connexion initiale via les options TCP. Chaque direction du flux de données peut utiliser un MSS différent et le système d'exploitation le détermine. Cependant, la taille de la fenêtre est envoyée dans l'en-tête TCP par le récepteur pour communiquer le maximum de données qu'il peut tamponner en même temps du côté réception d'une connexion avant d'attendre une reconnaissance et une mise à jour de fenêtre de l'hôte récepteur. C'est-à-dire qu'un hôte peut envoyer un certain nombre de segments (facteur MSS) avant d'épuiser la taille de la fenêtre du récepteur.

La fragmentation se produit à l'adresse IP (couche réseau) de deux manières. S'il n'y a pas de périphériques avec limitation MTU sur le chemin de communication entre l'expéditeur et le destinataire, la fragmentation rencontrera le MTU d'ethernet (1500 octets) seul. Cependant, en cas de présence d'un dispositif intermédiaire avec une limitation MTU entre l'émetteur et le récepteur, la couche IP (protocole Internet) fragmente les datagrammes, de sorte que les paquets peuvent passer à travers une liaison avec une unité de transmission maximale plus petite (MTU) que la taille du datagramme d'origine. Dans le cas d'un dispositif intermédiaire avec limitations MTU, l'expéditeur doit également déployer la découverte MTU du chemin pour déterminer le MTU minimum dans le chemin réseau vers le récepteur et ajuster dynamiquement le MSS pour éviter la fragmentation IP au sein du réseau. La reconnaissance MTU du chemin est effectuée en définissant l'option DF (Do not Fragment) dans les en-têtes IP des paquets sortants. Tout périphérique sur le chemin de communication entre l'expéditeur et le destinataire, dont la MTU est plus petite que le paquet, laissera tomber ces paquets et répondra à l'expéditeur avec le message ICMP "Destination inaccessible (datagramme trop grand) contenant le MTU du périphérique. Cette information permet à l'expéditeur de réduire son MTU supposé de manière appropriée. Ainsi, cela conduit au point de relation entre le MSS et le MTU. La RFC 791 stipule que "tous les hôtes doivent être prêts à accepter des datagrammes jusqu'à 576 octets (qu'ils soient entiers ou en fragments)". Ainsi, le MTU minimum pour les réseaux IP est 576. Dans le cas de TCP, déduction de 20 octets pour l'en-tête TCP et de 20 octets pour l'en-tête IP, nous donnerons 536 octets comme MSS standard pour TCP.

Maintenant, allons dans la partie de réassemblage. La fragmentation peut se produire en fonction de MTU sur les périphériques intermédiaires, mais le réassemblage doit se produire uniquement sur le périphérique de destination. TCP prend en charge la segmentation, cependant sur le périphérique de destination, TCP doit prendre en charge la commande, mais le réassemblage des segments doit être pris en charge par l'application. Donc, si vous n'avez besoin que d'une communication basée sur des messages entiers et que la fiabilité n'est pas un problème, UDP doit être votre choix. Cependant, notez que si vous pouvez envoyer une grande quantité de données par fractionnement, UDP ne sera pas en mesure d'assurer la commande des paquets et il ne pourra pas traiter les pertes de paquets car il n'a pas de mécanisme de correction d'erreur comme la retransmission . Si vous souhaitez disposer d'une communication basée sur les messages, comme dans le protocole UDP, mais également couplée à des fonctionnalités TCP telles que la livraison fiable, le contrôle de la congestion et d'autres améliorations/fonctionnalités, comme le multi-streaming, Homing, MTU découverte intégrée, puis SCTP devrait être votre choix. Toutefois, si vous avez des systèmes NAT hérités sur votre réseau, vous devrez peut-être effectuer l'encapsulation de SCTP dans UDP.

Questions connexes