HY-335a Project: microtcp *, μία lightweight TCP βιβλιοθήκη

Σχετικά έγγραφα
HY-335a Project: microtcp, μία lightweight TCP βιβλιοθήκη. Deadline πρώτης ϕάσης : 19/11/ :59

HY-335a Project: microtcp 1, μία lightweight TCP βιβλιοθήκη

CloudBox!: Ένα εργαλείο cloud αποθήκευσης αρχείων με κατανεμημένο τρόπο

Πρωτόκολλο TCP Διάλεξη Ι

Δίκτυα Επικοινωνιών ΙΙ: Network Programming UDP Sockets, Signals

4.1.1 Πρωτόκολλο TCP - Δομή πακέτου

ΗY335: Δίκτυα Υπολογιστών Χειμερινό Εξάμηνο Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης Διδάσκουσα: Μαρία Παπαδοπούλη

Επίπεδο Μεταφοράς. (ανεβαίνουμε προς τα πάνω) Εργαστήριο Δικτύων Υπολογιστών Τμήμα Μηχανικών Η/Υ και Πληροφορικής

Δίκτυα Υπολογιστών Το επίπεδο μεταφοράς (transport layer)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΔΙΚΤΥΩΝ

Πρωτόκολλα Διαδικτύου

Πρωτόκολλα Διαδικτύου

Εργαστήριο Δικτύων Υπολογιστών

Τρίτη Πρόοδος [110 μονάδες] Απαντήσεις

Προγραμματισμός με BSD Sockets σε περιβάλλον Linux

Υπολογιστές και ίκτυα Η/Υ.

Σχήμα 1: TCP αποστολέας με παράθυρο αποστολέα = 1

Δίκτυα Υπολογιστών Επίπεδο Μεταφοράς Ιωάννης Κορίνθιος Δρ. Ηλεκτρολόγος Μηχανικός ΕΜΠ

Κεφάλαιο 7.3. Πρωτόκολλο TCP

Δίκτυα Υπολογιστών Ενότητα 4: Transmission Control Protocol - TCP

Διάρθρωση. Δίκτυα Υπολογιστών Επικοινωνία από άκρο σε άκρο. Επικοινωνία από άκρο σε άκρο. Διάρθρωση

Δίκτυα Επικοινωνιών Δίκτυα Υπολογιστών Στρώμα Μεταφοράς (2) Διδάσκοντες: Δρ. Ευγενία Αδαμοπούλου, Δρ. Κώστας Δεμέστιχας

Επικοινωνία Client/Server Απομακρυσμένη Κλήση Διαδικασιών

Τι είναι το πρωτόκολλο Διαδικτύου (Internet Protocol, IP);

Υποδοχείς (Sockets) Προγραμματισμός II 1

2η Προγραµµατιστική Εργασία

ΗΥ335 - Δίκτυα Υπολογιστών Χειμερινό εξάμηνο Φροντιστήριο Ασκήσεις στο TCP

Δίκτυα Απευθείας Ζεύξης. Επικοινωνία µεταξύ δύο υπολογιστών οι οποίοι είναι απευθείας συνδεδεµένοι.

Πρωτόκολλα Επικοινωνίας Πρωτόκολλο IP

Δίκτυα Υπολογιστών ΙΙ (Ασκήσεις Πράξης)

Ειδικά Θέματα Προγραμματισμού

ιαδίκτυα & Ενδοδίκτυα Η/Υ

ΔΙΚΤΥΑ ΥΠΟΛΟΓΙΣΤΩΝ Γ Τάξη ΤΟΜΕΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΑ.Λ. ΤΕΤΡΑΔΙΟ ΜΑΘΗΤΗ Κωνσταντοπούλου Μ., Χρυσοστόμου Γ.

Σχήμα 1: TCP αποστολέας με παράθυρο αποστολέα = 1

Εργαστηριακή Άσκηση 7 Πρωτόκολλα TCP και UDP

7.2.2 Σχέση OSI και TCP/IP

Εγχειρίδιο Συναρτήσεων. Socket *sopen(const int type, const int protocol, const char *host, const char *service)

Άσκηση 2. Αν συμβούν 2 duplicate ACKs αντί για timeout τι γίνεται σε αυτή την περίπτωσή;

Πρωτόκολλα Διαδικτύου

Δίκτυα Επικοινωνιών ΙΙ: Transmission Control Protocol

Μέθοδοι Ελέγχου Σφαλμάτων

Λειτουργικά Συστήματα

Επαναληπτικό µάθηµα επί των αρχών λειτουργίας του ιαδικτύου. ρ. Κωνσταντίνος Σ. Χειλάς. Ethernet

3.2 Το αυτοδύναμο πακέτο IP (datagram) Δομή πακέτου

Κεφάλαιο 4ο ΕΠΙΠΕΔΟ ΜΕΤΑΦΟΡΑΣ

7.4 Πρωτόκολλο UDP. 3. Στη περίπτωση που ένα μήνυμα χωράει σε ένα τμήμα, χρησιμοποιούμε το πρωτόκολλο TCP.

ΜΑΘΗΜΑ / ΤΑΞΗ : ΔΙΚΤΥΑ ΥΠΟΛΟΓΙΣΤΩΝ ΙΙ / ΕΠΑΛ(Α & Β ΟΜΑΔΑ) ΣΕΙΡΑ: ΗΜΕΡΟΜΗΝΙΑ: 11/12/2011 ΑΠΑΝΤΗΣΕΙΣ

Ιόνιο Πανεπιστήµιο Τµήµα Πληροφορικής Συστήµατα Επικοινωνίας. Μοντέλο TCP/IP. Ενότητα E. Πόσοι εµπλέκονται σε ένα Σύστηµα Επικοινωνίας

Λουκάς Ελευθέριος

Δίκτυα και Διαδίκτυο

MusicOnCloud: Μια cloud-based υπηρεσία online streaming μουσικής

Improving the performance of TCP in the case of packet reordering. Στρατάκη Μαρία

Επίπεδο Μεταφοράς (Transport Layer)

ΔΙΚΤΥΑ (23-26) Π. Φουληράς

Εργαστηριακή Άσκηση 7 Πρωτόκολλα TCP και UDP

ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΜΗΧΑΝΙΣΜΟΙ ΔΙΑΧΕΙΡΙΣΗΣ ΑΠΟΜΑΚΡΥΣΜΕΝΩΝ ΣΥΣΤΗΜΑΤΩΝ ΜΕΣΩ ΤΟΥ ΠΡΩΤΟΚΟΛΛΟΥ SNMP

Αξιόπιστη μεταφορά δεδομένων πάνω από αναξιόπιστο δίκτυο. Κατανεμημένα Συστήματα 1

Transmission Control Protocol. Transmission Control Protocol

Δίκτυα Επικοινωνιών ΙΙ: Network Programming Εισαγωγή, TCP, UDP, Ports

Πρωτόκολλα Διαδικτύου

Σύντομη παρουσίαση των εργαλείων/εντολών telnet, ping, traceroute nslookup και nmap, zenmap

Πρωτόκολλο TCP Διάλεξη ΙΙI

Δίκτυα Υψηλών Ταχυτήτων Ενότητα 7: Διευθυνσιοδότηση Internet Protocol (IP) v4

FTP - (File Transfer Protocol ) Πρωτόκολλο Μεταφοράς Αρχείων

Αξιόπιστη μεταφορά δεδομένων πάνω από αναξιόπιστο δίκτυο. Κατανεμημένα Συστήματα 1

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ

ΣΕΜΙΝΑΡΙΟ ΔΙΚΤΥΩΝ ΜΑΡΤΙΟΣ ΜΑΙΟΣ 2010 ΔΙΟΡΓΑΝΩΣΗ ΑΜΠΑΡΙΩΤΗΣ ΑΠΟΣΤΟΛΟΣ ΓΙΑΜΜΑΚΗΣ ΓΙΑΝΝΗΣ ΛΕΒΑΝΤΗΣ ΟΔΥΣΣΕΑΣ ΠΑΠΑΔΟΠΟΥΛΟΣ ΜΑΡΙΟΣ ΨΙΑΧΟΣ ΧΡΗΣΤΟΣ

Δίκτυα Απευθείας Ζεύξης

Μελέτη του πρωτοκόλλου SCTP και ανάπτυξη σχετικών opensource προγραµµάτων

ΠΡΩΤΟΚΟΛΛΟ TCP/IP ΜΑΚΡΟΠΟΥΛΟΣ ΝΙΚΟΛΑΟΣ

Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010

ΔΊΚΤΥΑ ΕΠΙΚΟΙΝΩΝΙΏΝ ΔΊΚΤΥΑ ΥΠΟΛΟΓΙΣΤΏΝ ΚΑΙ ΣΤΡΏΜΑ ΜΕΤΑΦΟΡΆΣ ΔΙΔΆΣΚΟΝΤΕΣ: ΔΡ. ΕΥΓΕΝΊΑ ΑΔΑΜΟΠΟΎΛΟΥ, ΔΡ. ΚΏΣΤΑΣ ΔΕΜΈΣΤΙΧΑΣ

Εργαστήριο Ethereal: ICMP

Μάθημα 4: Πρότυπα, Πρωτόκολλα & Υπηρεσίες

Δίκτυα Υπολογιστών Λύσεις σειράς ασκήσεων επανάληψης

14. Δικτύωση με Java Δικτύωση με Java Sockets Δημιουργία της σύνδεσης Διευθυνσιοδότηση της σύνδεσης

Στρατηγικές Ασφάλειας

Με λίγα λόγια, το TCP/IP καθορίζει τον τρόπο που πακετάρονται και μεταφέρονται τα δεδομένα της σύνδεσής μας.

Οδηγός Εισαγωγή Χρηστών σε LDAP Server με χρήση. LdapAdmin TEMPLATE

ΚΕΦΑΛΑΙΟ 11: Διαδικασία Μετάδοσης Δεδομένων Εισαγωγή

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΔΙΚΤΥΩΝ

LAYER 3 ( NETWORΚ LEVEL ) - ΣΤΡΩΜΑ 3 ( ΕΠΙΠΕ Ο ΙΚΤΥΟΥ)

Ντίρλης Νικόλαος- ΕΤΥ 3ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 25 ΟΚΤΩΒΡΙΟΥ 2013 ΑΙΘΟΥΣΑ Β4

Δίκτυα και Internet στο επιχειρηµατικό περιβάλον

Ανάλυση Δικτυακής Κίνησης Πρωτοκόλλων Υπηρεσιών. Ασφάλεια Δικτύων. (4 η άσκηση) Διαχείριση Δικτύων - Ευφυή Δίκτυα, 9 ο Εξάμηνο,

Συνεχής ροή πολυµέσων

Περιεχόμενα. Κεφάλαιο 1 Εισαγωγή σε Έννοιες των Δικτύων Υπολογιστών Κεφάλαιο 2 Αξιοπιστία Κεφάλαιο 3 Αλγόριθμοι Πολλαπλής Πρόσβασης...

Δίκτυα Η/Υ στην Επιχείρηση

Επίπεδο ύνδεσης Δεδομένων (Data Link Layer DLL)

ΕΑΠ/ΠΛΗ22/ΑΘΗ.3 4 η ΟΣΣ 15/03/2014 Συμπληρωματικές Διαφάνειες

Υλοποίηση Δικτυακών Υποδομών και Υπηρεσιών: Υπηρεσία Ηλεκτρονικού Ταχυδρομείου - SMTP

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ

7.5 Πρωτόκολλο IP. Τεχνολογία ικτύων Επικοινωνιών ΙΙ

Δίκτυα Υπολογιστών Ενότητα 6: Secure Sockets Layer - SSL

Βασικές λειτουργίες διαδανεισμού μέσα από το σύστημα SmILLe

Μηχανισμοί Λογικής σύνδεσης. Διάρθρωση. Δομή πλαισίου. Καθορισμός ορίων πλαισίου

Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες

Α2. Να γράψετε τους αριθμούς 1-5 από τη Στήλη Α και δίπλα το γράμμα της Στήλης Β που δίνει τη σωστή αντιστοίχηση.

Δίκτυα Υπολογιστών Ενότητα 7: Internet Control Message Protocol - ICMP

Επίπεδο Μεταφοράς (Transport Layer)

Transcript:

HY-335a Project: microtcp *, μία lightweight TCP βιβλιοθήκη Deadline πρώτης ϕάσης : 13 Δεκεμβρίου 2016, 23:59 * Εμπνευσμένο και υλοποιημένο από το Μανώλη Σουρλίγκα :)

Γενική περιγραϕή Στο οικοσύστημα του Internet of Thinks (IoT) υπάρχει μια ευρεία γκάμα από δικτυακές συσκευές. Πολλές από αυτές έχουν ελάχιστο μέγεθος και λειτουργούν με μπαταρίες. Για αυτόν τον λόγο, οι υπολογιστικοί τους πόροι είναι αρκετά περιορισμένοι. Στις περισσότερες περιπτώσεις, η υλοποίηση ολόκληρου του TCP πρωτοκόλλου είναι αδύνατη και η μεταϕορά της πληροϕορίας γίνεται με UDP. Υπάρχουν όμως εϕαρμογές που απαιτούν αξιόπιστη επικοινωνία και μεταϕορά δεδομένων. Ο σκοπός του project είναι η υλοποίηση μιας βιβλιοθήκης η οποία θα παρέχει μια απλή έκδοση του TCP. Παρόλα αυτά, θα είναι ικανή να παρέχει αξιόπιστη επικοινωνία μεταξύ συσκευών με περιορισμένους υπολογιστικούς πόρους χρησιμοποιώντας το διαθέσιμο UDP πρωτόκολλο μεταϕοράς. 1. Δομή του project - Προθεσμίες To project αποτελείται από 2 ϕάσεις. Στην πρώτη ϕάση ζητείται να υλοποιήσετε την δομή των microtcp πακέτων, το 3- way handshake (χειραψία) και το finalize (τερματισμό) της microtcp σύνδεσης. Επίσης, θα υλοποιήσετε ενα εργαλείο μεταϕοράς αρχείων με TCP το οποίο θα χρησιμοποιήσετε στο τέλος για την σύγκριση της απόδοσης της υλοποίησή σας, τόσο σε σχέση με την πλήρη υλοποίηση του TCP, όσο και με υλοποιήσεις άλλων ομάδων. Στην δεύτερη ϕάση θα πρέπει να υλοποιήσετε την βασική λειτουργία του TCP η οποία περιλαμβάνει τους μηχανισμούς για acknowledgements, retransmissions, error checking, TCP windowing, Congestion control και Slow start. Η προθεσμία παράδοσης της πρώτης ϕάσης είναι 13 Δεκεμβρίου 23:59, ενώ η εξέταση αυτής της ϕάσης θα γίνει την επόμενη μέρα της παράδοσης, 14 Δεκεμβρίου. Απαγορεύεται να αλλάξετε τα συμβόλαια των συναρτήσεων που σας έχουν δοθεί και το structure του header που σας δίνονται. Η αλλαγή τους θα σημαίνει και τον μηδενισμό του project. Παρόλα αυτά είναι επιθυμητές οι αλλαγές/προσθήκες στα υπόλοιπα structs. 1

Αναλυτική περιγραϕή 1.1 Δομή Κώδικα Στο https://github.com/surligas/microtcp θα βρείτε ένα μέρος έτοιμου κώδικα που θα πρέπει να χρησιμοποιήσετε. Υπάρχουν σχόλια στον κώδικα που αναϕέρουν που ακριβώς πρέπει να κάνετε αλλαγές με δικό σας κώδικα. 1. Φάκελος lib: Περιέχει την δομή και τις συναρτήσεις της microtcp βιβλιοθήκης. 2. Φάκελος test: Περιέχει το εργαλείο μέτρησης του bandwidth τόσο με χρήση της κανονικής TCP υλοποίησης όσο και της microtcp. 3. Φάκελος utils: Περιέχει χρήσιμες συναρτήσεις. Σε αυτή την ϕάση περιέχει την συνάρτηση υπολογισμού του checksum. Για το compile και την παραγωγή του εκτελέσιμου μπορείτε να χρησιμοποιήσετε το cmake (https://cmake.org/). Το εργαλείο αυτό παράγει αυτόματα τα κατάλληλα makefiles σε ένα ξεχωριστό ϕάκελο ώστε ο ϕάκελος με τον πηγαίο κώδικα να παραμένει καθαρός από ενδιάμεσα αρχεία. Για να γίνει αυτό μέσα στο ϕάκελο με τον source code δημιουργείστε ένα ϕάκελο με το όνομα build. Μέσα σε αυτόν το ϕάκελο τρέξτε την εντολή cmake όπως ϕαίνεται στο παρακάτω παράδειγμα : mkdir build cd build cmake.. Μετά από αυτό μπορείτε να κάνετε compile δίνοντας την εντολή : make 1.2 Δομή microtcp πακέτων Η δομή κάθε microtcp πακέτου βασίζεται αρκετά στην δομή των TCP πακέτων με την διαϕορά ότι ο header κάθε microtcp πακέτου είναι πιο απλός και σταθερού μεγέθους. Ο header έχει την εξής μορϕή : 1. Sequence Number, 32bit: Το πεδίο αυτό περιέχει το sequence number του πακέτου. Αρχικά κατά την έναρξη μιας microtcp σύνδεσης επιλέγεται ένας τυχαίος αριθμός. Μετά από κάθε επιτυχημένη μετάδοση, ο αριθμός αυτός αυξάνεται κατά τον αριθμό των data bytes που στάλθηκαν επιτυχημένα. 2. Acknowledgment Number, 32bit: Το πεδίο αυτό περιέχει το sequence number που περιμένει ο αποστολέας να λάβει στο επόμενο πακέτο. 2

Bit-0 Bit-16 Bit-31 Control Sequence Number ACK Number Data Length Future use field 0 Future use field 1 Future use field 2 CRC32 Checksum Window 3. Control, 16bit: Σε αυτό το πεδίο περιέχεται η πληροϕορία για τον τύπο του κάθε πακέτου καθώς και κάποια flags που θα χρησιμοποιηθούν κυρίως στην επόμενη ϕάση. Bit 0 Bit-12 Bit-13 Bit 14 Bit-15 0 ACK RST SYN FIN ACK: Αν είναι 1, το Acknowledgment Number θα πρέπει να ληϕθεί υπόψιν. Στην ουσία μόνο το πρώτο πακέτο μιας TCP σύνδεσης δεν κάνει 1 αυτό το bit. Μετά το πρώτο SYN πακέτο, όλα τα υπόλοιπα θα πρέπει να έχουν το ACK bit 1. RST: Αν είναι 1, η σύνδεση θα πρέπει να γίνει reset. SYN: Synchronize sequence numbers. Χρησιμοποιείται για να δηλώσει την έναρξη μιας νέας σύνδεσης. Θα πρέπει να σταλθεί 1, μόνο μια ϕορά από κάθε πλευρά κατά το πρώτο πακέτο. Στις υπόλοιπες περιπτώσεις θα πρέπει να είναι 0. FIN: Αν είναι 1, δηλώνει πως ο αποστολέας δεν έχει άλλα δεδομένα να στείλει. Χρησιμοποιείται για τον τερματισμό μιας σύνδεσης. 4. Window 16bit: Το window ορίζει τον αριθμό των bytes που είναι πρόθυμος να λάβει ο αποστολέας αυτού του πακέτου. 5. Data Length, 32bit: Το μέγεθος των δεδομένων του τρέχοντος πακέτου σε bytes. Προσοχή σε αυτόν τον αριθμό δεν θα πρέπει να προσμετρούνται τα bytes του header. 6. Future use 0, 32bit: Θα χρησιμοποιηθεί στην επόμενη ϕάση. Σε αυτή τη ϕάση θα πρέπει να είναι 0. 3

7. Future use 1, 32bit: Θα χρησιμοποιηθεί στην επόμενη ϕάση. Σε αυτή τη ϕάση θα πρέπει να είναι 0. 8. Future use 2, 32bit: Θα χρησιμοποιηθεί στην επόμενη ϕάση. Σε αυτή τη ϕάση θα πρέπει να είναι 0. 9. CRC32 Checksum 32bit: Περιέχει το CRC32 checksum του header και των δεδομένων του κάθε πακέτου. Για τον υπολογισμό του CRC32, υπάρχει υλοποιημένη η συνάρτηση crc32(const uint8_t *buf, size_t len) στο αρχείο utils/crc32.h. Ο υπολογισμός του checksum γίνεται ως εξής : Όλα τα πεδία του header συμπληρώνονται με την κατάλληλη πληροϕορία και τα δεδομένα τοποθετούνται ακριβώς μετά τον header. Η μνήμη των πεδίων που δεν χρησιμοποιούνται καθώς και τα 32-bits του CRC32 checksum πεδίου θα πρέπει να είναι 0. Η συνάρτηση crc32() εϕαρμόζεται από το πρώτο byte του πακέτου μέχρι το τελευταίο συμπεριλαμβανομένων των data bytes. Τα 32-bits που επιστρέϕει η συνάρτηση τοποθετούνται κατάλληλα στο αντίστοιχο πεδίο. Κατά το receive, ο receiver εξάγει το checksum και το αποθηκεύει κατάλληλα τοπικά. Στο checksum πεδίο τοποθετεί μηδενικά bits και εϕαρμόζει την ίδια crc32() συνάρτηση όμως ακριβώς έκανε ο sender. Αν το checksum πεδίο που λήϕθηκε είναι ίδιο με αυτό που υπολογίστηκε από την συνάρτηση crc32(), το πακέτο περιέχει σωστά δεδομένα και μπορεί να συνεχιστεί η επεξεργασία του. Διαϕορετικά το πακέτο θεωρείται κατεστραμμένο. 2. Ζητούμενα Α Φάσης Στο αρχείο lib/microtcp.c θα βρείτε μια σειρά από συναρτήσεις που θα πρέπει να υλοποιήσετε. Η ονοματολογία τους σχετίζεται αρκετά με τις αντίστοιχες συναρτήσεις του TCP και η λειτουργικότητά τους θα πρέπει να είναι αντίστοιχη. microtcp_sock_t microtcp_socket(int domain, int type, int protocol); Η συνάρτηση αυτή δημιουργεί και επιστρέϕει ένα socket microtcp socket σε αντιστοιχία με την συνάρτηση socket(). Με την δημιουργία του socket 4

το state της microtcp σύνδεσης θα πρέπει να ορίζεται ως UKNOWN. Σε περίπτωση λάθους κατάλληλο πεδίο του microtcp_sock_t θα πρέπει να ορίζεται κατάλληλα. int microtcp_bind( microtcp_sock_t socket, const struct sockaddr *address, socklen_t address_len); Η συνάρτηση αυτή θα πρέπει να υλοποιεί ακριβώς την ίδια λειτουργικότητα με την bind(). microtcp_sock_t microtcp_accept( microtcp_sock_t socket, struct sockaddr *address, socklen_t address_len); Η συνάρτηση αυτή μπλοκάρει έως ότου ένας client συνδεθεί στο microtcp socket που έχει ανοίξει ο server. Η microtcp_accept() επιστρέϕει το socket που πήρε ως παράμετρο, με την διαϕορά ότι το πεδίο state θα πρέπει να έχει την τιμή ESTABLISHED. Μετά την επιτυχημένη κλήση της συνάρτησης αυτής, στην επόμενη ϕάση ο client και ο server μπορούν να ανταλλάξουν δεδομένα. microtcp_sock_t microtcp_connect( microtcp_sock_t socket, const struct sockaddr *address, socklen_t address_len); Η microtcp_connect() συνδέεται σε ένα microtcp socket το οποίο περιμένει για συνδέσεις έχοντας καλέσει την microtcp_accept(). Η εγκαθίδρυση της σύνδεσης επιτυγχάνεται χρησιμοποιώντας την τεχνική 3-way handshake που περιγράϕεται παρακάτω. Η microtcp_connect() επιστρέϕει το socket που πήρε ως παράμετρο, με την διαϕορά ότι το πεδίο state θα πρέπει να έχει την τιμή ESTABLISHED. Σε περίπτωση λάθους κατάλληλο πεδίο του microtcp_sock_t θα πρέπει να ορίζεται κατάλληλα. microtcp_sock_t microtcp_shutdown( microtcp_sock_t socket, int how) Η συνάρτηση αυτή τερματίζει την σύνδεση μεταξύ server και client επιστρέϕοντας το socket που πήρε ως παράμετρο, με τροποποιημένο κατάλληλα το πεδίο state. Η τεχνική για τον τερματισμό της σύνδεσης περιγράϕεται παρακάτω αναλυτικά. 5

2.1 3-Way handshakesyn, seq=n microtcp_connect() microtcp_accpept() SYN, ACK, seq=m, ack=n+1 ACK, seq=n+1, ack=m+1 Με το 3-way handshake (χειραψία) γίνεται η εγκαθίδρυση της σύνδεσης. Για να γίνει αυτό ο client και ο server πρέπει να ανταλλάξουν πακέτα με τα κατάλληλα sequence numbers. Το πρώτο πακέτο που στέλνει ο client είναι το SYN (Synchronize) πακέτο, το οποίο περιέχει το sequence number Ν που διάλεξε τυχαία. Όπως περιγράϕτηκε και προηγουμένως, το SYN πακέτο δηλώνεται θέτοντας σε 1 το κατάλληλο bit στο control πεδίου του header. Ο server λαμβάνει το SYN πακέτο και αποθηκεύει το sequence number του client. Έπειτα διαλέγει τυχαία ένα δικό του sequence number Μ, και στέλνει ένα πακέτο SYN+ACK πίσω στον client το οποίο περιέχει στο πεδίο Sequence Number τον αριθμό M και στο πεδίο ACK Number τον αριθμό N+1. To SYN+ACK πακέτο δηλώνεται θέτοντας σε 1 τα αντίστοιχα bits στο control πεδίου του header. O client λαμβάνει το SYN+ACK πακέτο, αποθηκεύει το sequence number M του server και στέλνει ένα ACK με ACK number Μ+1. Με το τέλος της διαδικασίας η σύνδεση θεωρείται εγκαθιδρυμένη. Σημείωση : Κατά την διάρκεια της χειραψίας, υπάρχει πάντα η περίπτωση κάποιο πακέτο να χαθεί ή να περιέχει λάθος δεδομένα. Ο έλεγχος τέτοιων περιπτώσεων θα γίνει στην επόμενη ϕάση. 6

2.2 Connection termination microtcp_shutdown() FIN, ACK, seq=x ACK, ack=x+1 FIN, ACK, seq=y ACK, seq=x+1, ack=y+1 Για τον τερματισμό μιας microtcp σύνδεσης ακολουθείται μια παρόμοια διαδικασία με το 3-way handshake. Αρχικά ο client στέλνει ένα FIN πακέτο, δηλώνοντας στον server πως επιθυμεί την διακοπή της σύνδεσης. Ο server απαντάει στο FIN πακέτο με ένα ACK και θέτει την σύνδεση σε state CLOSING_BY_PEER. Μόλις ο client λάβει το ACK, θέτει την σύνδεση σε state CLOSING_BY_HOST. O Server εκτελεί όποιες λειτουργίες έχουν απομείνει και στέλνει ένα FIN πακέτο στον client. Μόλις λάβει το FIN πακέτο ο client, απαντάει στον server με ένα ACK και θέτει το state της σύνδεσής του σε CLOSED. Όταν αντίστοιχα λάβει ο server το ACK, θέτει το state της σύνδεσής του και αυτός σε CLOSED. Σημείωση : Για λόγους απλότητας μπορείτε να θεωρήσετε ότι μόνο ο client μπορεί να ξεκινήσει την διαδικασία τερματισμού της σύνδεσης. 2.3 Bandwidth Test Σαν μέρος του project είναι και η υλοποίηση ενός εργαλείου μέτρησης του bandwidth που επιτυγχάνεται μεταξύ ενός server και ενός client τόσο με την χρήση του microtcp όσο και με το κανονικό TCP. Στο αρχείο test/bandwidth_test.c θα πρέπει να υλοποιήσετε τις απαραίτητες συναρτήσεις 7

που ζητούνται. Το πρόγραμμα παίρνει ως παράμετρο ένα όνομα αρχείου, το πρωτόκολλο μεταϕορά (TCP ή microtcp) καθώς και αν θα λειτουργήσει ως server ή client. Ο client θα πρέπει να στείλει σωστά το αρχείο στον server και στο τέλος να εκτυπώνει την διάρκεια της μεταϕοράς και το συνολικό bandwidth που επιτεύχθηκε. Σημείωση : Η πλήρης υλοποίηση του εργαλείου δεν είναι απαραίτητη για την πρώτη ϕάση, αλλά συνιστάται ιδιαίτερα να υλοποιήσετε το μεγαλύτερό του μέρος ώστε να είστε σε θέση να λάβετε feedback στην συμβουλευτική εξέταση της πρώτης ϕάσης. 8