Deux protocoles de transport utilisés pour transférer des fichiers incluent : TCP et UDP. UDP est un protocole peu fiable alors que TCP assure la fiabilité, le contrôle de flux et le contrôle de la congestion, mais il comporte une phase d'établissement de connexion explicite, que certaines applications peuvent ne pas trouver souhaitable. Le but de ce projet est de concevoir et d'implémenter une application de transfert de fichiers possédant toutes les bonnes fonctionnalités de TCP sans la phase d'établissement de connexion.
Le serveur et le client UDP utilisent le format d'en-tête suivant :
Le serveur reçoit la demande de fichier du client. Il extrait le nom du fichier de la requête et récupère le contenu du fichier dans un tampon. Il segmente ensuite le fichier en morceaux d'une taille de 1 450 octets, comme le prend en charge l'en-tête.
Il y a deux tailles de fenêtres à considérer :
Le serveur commence à envoyer des segments de fichiers jusqu'à ce que la taille minimale de la fenêtre de congestion et la taille de la fenêtre annoncée soient atteintes. Après avoir envoyé tous les segments dans une fenêtre, il attend de recevoir un accusé de réception. Lorsqu'un accusé de réception est reçu pour un numéro de séquence inférieur au prochain numéro de séquence à envoyer, cela signifie qu'un segment précédent n'a pas été correctement reçu et le serveur accepte les 3 accusés de réception en double du client. Il définit ensuite le numéro de séquence suivant en fonction de l'accusé de réception reçu. Après avoir reçu l'accusé de réception cumulé, il continue l'envoi des segments dans la fenêtre suivante. Lorsque des accusés de réception en double sont reçus, le serveur commence à envoyer des segments du paquet qui n'a pas été correctement reçu.
Implémentation de l'algorithme de Jacobson/Karel pour estimer le temps d'aller-retour (RTT) pour les paquets à recevoir par le client et l'accusé de réception reçu par le serveur. Si le serveur n'obtient pas d'accusé de réception dans RTT, il retransmettra à nouveau ces paquets.
Pseudo-code :
Estimated_RTT = (1-α) Estimated RTT + (α) Sample_RTT
In the original TCP Specification, α=.0125
Jacobson/Karels included a variation component to the calculation for the Estimated_RTT
Estimated_RTT = Estimated_RTT + δ (Sample_RTT-Estimated_RTT)
Deviation = Deviation + δ (|Sample_RTT- Estimated_RTT|- Deviation)
Timeout = μ * Estimated_RTT + φ * Deviation
Typically φ=4, μ = 1, δ is between 0 and 1
Le serveur commence par envoyer 1 segment. S’ensuit alors 2 phases de contrôle de congestion :
Démarrage lent : la taille du segment augmente de façon exponentielle jusqu'à ce qu'il soit correctement reconnu par le récepteur dans le délai imparti et que la taille de la fenêtre de congestion soit inférieure au ssthresh qui est défini sur 64 000 octets.
Évitement de la congestion : lorsque la taille de la fenêtre de congestion devient supérieure ou égale à ssthresh, la taille de la fenêtre de congestion est augmentée linéairement de 1 taille de segment.
Timeout : Il est calculé à l'aide de l'algorithme de Jacobson/Karel donné ci-dessus. Lorsqu'un délai d'attente se produit, le ssthresh est défini sur la moitié de la valeur de la fenêtre de congestion et la fenêtre de congestion est réinitialisée à 1 taille de segment.
vagrant up
Cela démarrera à la fois le serveur et les machines clientes
vagrant ssh reliableUDPServer
vagrant ssh reliableUDPClient
make
./Server port advertised_window
Le serveur accepte les arguments de ligne de commande suivants :
port : numéro de port à utiliser pour la communication
publiced_window : le nombre d'octets que le serveur est autorisé à envoyer avant d'attendre un accusé de réception
./Client server_host_name port file_name advertised_window
Le client accepte les arguments de ligne de commande suivants :
port etadverted_window : identiques à ceux du serveur
server_host_name : nom d'hôte du serveur
file_name : le nom du fichier demandé par le client
Une fois le code exécuté avec succès, vous trouverez le fichier demandé par le client dans le dossier ReliableUDPClient.
Approche de mise en réseau informatique de haut en bas