Datagram Socket my Socket 2 new Datagram Socket

  • Slides: 119
Download presentation

Ασυνδεσμική αποπολύπλεξη (παράδειγμα) Datagram. Socket my. Socket 2 = new Datagram. Socket (9157); Datagram.

Ασυνδεσμική αποπολύπλεξη (παράδειγμα) Datagram. Socket my. Socket 2 = new Datagram. Socket (9157); Datagram. Socket server. Socket = new Datagram. Socket (6428); application Datagram. Socket my. Socket 1 = new Datagram. Socket (5775); application P 1 P 3 P 4 transport network link physical source port: 6428 dest port: 9157 source port: 9157 dest port: 6428 Το SP δίνει τη “διεύθυνση επιστροφής” source port: ? dest port: ? Δίκτυα Επικοινωνιών Ι - Επίπεδο μεταφοράς 3 -12

Συνδεσμική αποπολύπλεξη (παράδειγμα) application P 4 P 3 P 5 application P 6 P

Συνδεσμική αποπολύπλεξη (παράδειγμα) application P 4 P 3 P 5 application P 6 P 2 P 3 transport network link physical host: IP address A server: IP address B source IP, port: B, 80 dest IP, port: A, 9157 source IP, port: A, 9157 dest IP, port: B, 80 physical source IP, port: C, 5775 dest IP, port: B, 80 host: IP address C source IP, port: C, 9157 dest IP, port: B, 80 3 τμήματα, όλα προορίζονται για IP διεύθυνση: B, θύρα προορισμού: 80 αποπολυπλέκονται σε διαφορετικές sockets Δίκτυα Επικοινωνιών Ι - Επίπεδο μεταφοράς 3 -14

Συνδεσμική αποπολύπλεξη : Web Server με νήματα threaded server application P 4 P 3

Συνδεσμική αποπολύπλεξη : Web Server με νήματα threaded server application P 4 P 3 P 2 P 3 transport network link physical host: IP address A server: IP address B source IP, port: B, 80 dest IP, port: A, 9157 source IP, port: A, 9157 dest IP, port: B, 80 physical source IP, port: C, 5775 dest IP, port: B, 80 host: IP address C source IP, port: C, 9157 dest IP, port: B, 80 3 -15

rdt 2. 0: περιγραφή FSM rdt_send(data) snkpkt = make_pkt(data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && is.

rdt 2. 0: περιγραφή FSM rdt_send(data) snkpkt = make_pkt(data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && is. NAK(rcvpkt) Wait for call from ACK or udt_send(sndpkt) above NAK rdt_rcv(rcvpkt) && is. ACK(rcvpkt) L sender receiver rdt_rcv(rcvpkt) && corrupt(rcvpkt) udt_send(NAK) Wait for call from below rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) extract(rcvpkt, data) deliver_data(data) udt_send(ACK) Δίκτυα Επικοινωνιών Ι - Επίπεδο μεταφοράς 3 -30

rdt 2. 0: λειτουργίa χωρίς σφάλματα rdt_send(data) snkpkt = make_pkt(data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) &&

rdt 2. 0: λειτουργίa χωρίς σφάλματα rdt_send(data) snkpkt = make_pkt(data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && is. NAK(rcvpkt) Wait for call from ACK or udt_send(sndpkt) above NAK rdt_rcv(rcvpkt) && is. ACK(rcvpkt) L rdt_rcv(rcvpkt) && corrupt(rcvpkt) udt_send(NAK) Wait for call from below rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) extract(rcvpkt, data) deliver_data(data) udt_send(ACK) Δίκτυα Επικοινωνιών Ι - Επίπεδο μεταφοράς 3 -31

rdt 2. 0: σενάριο σφάλματος rdt_send(data) snkpkt = make_pkt(data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && is.

rdt 2. 0: σενάριο σφάλματος rdt_send(data) snkpkt = make_pkt(data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && is. NAK(rcvpkt) Wait for call from ACK or udt_send(sndpkt) above NAK rdt_rcv(rcvpkt) && is. ACK(rcvpkt) L rdt_rcv(rcvpkt) && corrupt(rcvpkt) udt_send(NAK) Wait for call from below rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) extract(rcvpkt, data) deliver_data(data) udt_send(ACK) Δίκτυα Επικοινωνιών Ι - Επίπεδο μεταφοράς 3 -32

rdt 2. 1: αποστολέας, διαχειρίζεται αλλοιωμένα ACK/NAKs rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt)

rdt 2. 1: αποστολέας, διαχειρίζεται αλλοιωμένα ACK/NAKs rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt) Wait for call 0 from above rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt) L rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || is. NAK(rcvpkt) ) udt_send(sndpkt) Wait for ACK or NAK 0 L Wait for ACK or NAK 1 Wait for call 1 from above rdt_send(data) sndpkt = make_pkt(1, data, checksum) udt_send(sndpkt) Δίκτυα Επικοινωνιών Ι - Επίπεδο μεταφοράς 3 -34

rdt 2. 1: δέκτης, διαχειρίζεται αλλοιωμένα ACK/NAKs rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq 0(rcvpkt) rdt_rcv(rcvpkt)

rdt 2. 1: δέκτης, διαχειρίζεται αλλοιωμένα ACK/NAKs rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq 0(rcvpkt) rdt_rcv(rcvpkt) && (corrupt(rcvpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && (corrupt(rcvpkt) sndpkt = make_pkt(NAK, chksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && not corrupt(rcvpkt) && has_seq 1(rcvpkt) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) sndpkt = make_pkt(NAK, chksum) udt_send(sndpkt) Wait for 0 from below Wait for 1 from below rdt_rcv(rcvpkt) && not corrupt(rcvpkt) && has_seq 0(rcvpkt) rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq 1(rcvpkt) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) Δίκτυα Επικοινωνιών Ι - Επίπεδο μεταφοράς 3 -35

rdt 2. 2: Αποσπάσματα αποστολέα, δέκτη rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt)

rdt 2. 2: Αποσπάσματα αποστολέα, δέκτη rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && Wait for call 0 from above rdt_rcv(rcvpkt) && (corrupt(rcvpkt) || has_seq 1(rcvpkt)) udt_send(sndpkt) Wait for 0 from below ( corrupt(rcvpkt) || is. ACK(rcvpkt, 1) ) udt_send(sndpkt) Wait for ACK 0 sender FSM fragment rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt, 0) receiver FSM fragment L rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq 1(rcvpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(ACK 1, chksum) udt_send(sndpkt) Δίκτυα Επικοινωνιών Ι - Επίπεδο μεταφοράς 3 -38

rdt 3. 0 αποστολέας rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) L

rdt 3. 0 αποστολέας rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) L rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt, 1) rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || is. ACK(rcvpkt, 0) ) timeout udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt, 0) stop_timer timeout udt_send(sndpkt) start_timer L Wait for ACK 0 Wait for call 0 from above L rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || is. ACK(rcvpkt, 1) ) Wait for ACK 1 Wait for call 1 from above rdt_rcv(rcvpkt) L rdt_send(data) sndpkt = make_pkt(1, data, checksum) udt_send(sndpkt) start_timer Δίκτυα Επικοινωνιών Ι - Επίπεδο μεταφοράς 3 -40

GBN: Επεκτεταμένη FSM αποστολέα rdt_send(data) L base=1 nextseqnum=1 if (nextseqnum < base+N) { sndpkt[nextseqnum]

GBN: Επεκτεταμένη FSM αποστολέα rdt_send(data) L base=1 nextseqnum=1 if (nextseqnum < base+N) { sndpkt[nextseqnum] = make_pkt(nextseqnum, data, chksum) udt_send(sndpkt[nextseqnum]) if (base == nextseqnum) start_timer nextseqnum++ } else refuse_data(data) Wait rdt_rcv(rcvpkt) && corrupt(rcvpkt) timeout start_timer udt_send(sndpkt[base]) udt_send(sndpkt[base+1]) … udt_send(sndpkt[nextseqnum-1]) rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) base = getacknum(rcvpkt)+1 If (base == nextseqnum) stop_timer else start_timer Δίκτυα Επικοινωνιών Ι - Επίπεδο μεταφοράς 3 -49

GBN «εν δράσει» sender window (N=4) 012345678 012345678 sender send pkt 0 send pkt

GBN «εν δράσει» sender window (N=4) 012345678 012345678 sender send pkt 0 send pkt 1 send pkt 2 send pkt 3 (wait) rcv ack 0, send pkt 4 rcv ack 1, send pkt 5 ignore duplicate ACK pkt 2 timeout 012345678 send pkt 2 pkt 3 pkt 4 pkt 5 receiver Xloss receive pkt 0, send ack 0 receive pkt 1, send ack 1 receive pkt 3, discard, (re)send ack 1 receive pkt 4, discard, (re)send ack 1 receive pkt 5, discard, (re)send ack 1 rcv rcv pkt 2, pkt 3, pkt 4, pkt 5, deliver, send Δίκτυα Επικοινωνιών Ι - Επίπεδο μεταφοράς ack 2 ack 3 ack 4 ack 5 3 -51

Επιλεκτική επανάληψη «εν δράσει» sender window (N=4) 012345678 012345678 sender send pkt 0 send

Επιλεκτική επανάληψη «εν δράσει» sender window (N=4) 012345678 012345678 sender send pkt 0 send pkt 1 send pkt 2 send pkt 3 (wait) receiver Xloss receive pkt 3, buffer, send ack 3 rcv ack 0, send pkt 4 rcv ack 1, send pkt 5 receive pkt 4, buffer, send ack 4 receive pkt 5, buffer, send ack 5 record ack 3 arrived pkt 2 timeout 012345678 receive pkt 0, send ack 0 receive pkt 1, send ack 1 send pkt 2 record ack 4 arrived rcv pkt 2; deliver pkt 2, pkt 3, pkt 4, pkt 5; send ack 2 record ack 4 arrived Q: τι συμβαίνει όταν φθάνει το ack 2; Δίκτυα Επικοινωνιών Ι - Επίπεδο μεταφοράς 3 -55

TCP: αριθμοί ακολουθίας και ACKs Αριθμοί ακολουθίας (Seq. #’s): § Αριθμός του πρώτου byte

TCP: αριθμοί ακολουθίας και ACKs Αριθμοί ακολουθίας (Seq. #’s): § Αριθμός του πρώτου byte των δεδομένων του τμήματος ACKs: § seq # του επόμενου byte που αναμένεται από την άλλη πλευρά § συσσωρευτικά ACK Ε: πώς διαχειρίζεται ο δέκτης τα τμήματα εκτός σειράς; § A: η προδιαγραφή του TCP δεν καθορίζει (εναπόκειται στην υλοποίηση) outgoing segment from sender source port # dest port # sequence number acknowledgement number rwnd checksum urg pointer window size N sender sequence number space sent ACKed sent, not- usable not yet ACKed but not usable (“in-flight”) yet sent incoming segment to sender source port # dest port # sequence number acknowledgement number rwnd A checksum urg pointer Δίκτυα Επικοινωνιών Ι - Επίπεδο μεταφοράς 3 -60

TCP αριθμοί ακολουθίας, ACKs Host B Host A User types ‘C’ host ACKs receipt

TCP αριθμοί ακολουθίας, ACKs Host B Host A User types ‘C’ host ACKs receipt of echoed ‘C’ Seq=42, ACK=79, data = ‘C’ Seq=79, ACK=43, data = ‘C’ host ACKs receipt of ‘C’, echoes back ‘C’ Seq=43, ACK=80 simple telnet scenario (1 byte γα το “C”) χρόνος 3 -61

Αποστολέας TCP (απλοποιημένος) data received from application above L Next. Seq. Num = Initial.

Αποστολέας TCP (απλοποιημένος) data received from application above L Next. Seq. Num = Initial. Seq. Num Send. Base = Initial. Seq. Num wait for event create segment, seq. #: Next. Seq. Num pass segment to IP (i. e. , “send”) Next. Seq. Num = Next. Seq. Num + length(data) if (timer currently not running) start timer timeout retransmit not-yet-acked segment with smallest seq. # start timer ACK received, with ACK field value y if (y > Send. Base) { Send. Base = y /* Send. Base– 1: last cumulatively ACKed byte */ if (there are currently not-yet-acked segments) start timer else stop timer } Δίκτυα Επικοινωνιών Ι - Επίπεδο μεταφοράς 3 -69

Σενάρια αναμεταδόσεων TCP Host B Host A Send. Base=92 X ACK=100 Seq=92, 8 bytes

Σενάρια αναμεταδόσεων TCP Host B Host A Send. Base=92 X ACK=100 Seq=92, 8 bytes of data timeout Seq=92, 8 bytes of data Seq=100, 20 bytes of data ACK=100 ACK=120 Seq=92, 8 bytes of data Send. Base=100 ACK=100 Seαnd. Base = 100 time Seq=92, 8 bytes of data Send. Base=120 ACK=120 Send. Base=120 Σενάριο χαμένου ACK time Πρώιμη λήξη χρόνου (premature timeout) Δίκτυα Επικοινωνιών Ι - Επίπεδο μεταφοράς 3 -70

Αλγόριθμος ταχείας αναμετάδοσης: event: ACK received, with ACK field value of y if (y

Αλγόριθμος ταχείας αναμετάδοσης: event: ACK received, with ACK field value of y if (y > Send. Base) { Send. Base = y if (there are currently not-yet-acknowledged segments) start timer } else { increment count of dup ACKs received for y if (count of dup ACKs received for y = 3) { resend segment with sequence number y } Ένα duplicate ACK για ένα ήδη επιβεβαιωμένο τμήμα Ταχεία αναμετάδοση 3 -75

Διαχείριση σύνδεσης TCP (συν. ) Πριν γίνει ανταλλαγή δεδομένων, ο αποστολέας κι ο δέκτης

Διαχείριση σύνδεσης TCP (συν. ) Πριν γίνει ανταλλαγή δεδομένων, ο αποστολέας κι ο δέκτης κάνουν “χειραψία”: q συμφωνούν για τη δημιουργία σύνδεσης ( ο καθένας να γνωρίζει ότι ο άλλος είναι πρόθυμος να δημιουργήσει τη σύνδεση) q συμφωνούν στις παραμέτρους της σύνδεσης application connection state: ESTAB connection variables: seq # client-to-server-to-client rcv. Buffer size at server, client network Socket client. Socket = new. Socket("hostname", "port number"); application connection state: ESTAB connection Variables: seq # client-to-server-to-client rcv. Buffer size at server, client network Socket connection. Socket = welcome. Socket. accept(); Δίκτυα Επικοινωνιών Ι - Επίπεδο μεταφοράς 3 -82

TCP 3 -μερής χειραψία FSM closed Socket connection. Socket = welcome. Socket. accept(); L

TCP 3 -μερής χειραψία FSM closed Socket connection. Socket = welcome. Socket. accept(); L SYN(x) SYNACK(seq=y, ACKnum=x+1) create new socket for communication back to client listen SYN(seq=x) SYN sent SYN rcvd ACK(ACKnum=y+1) Socket client. Socket = new. Socket("hostname", "port number"); ESTAB SYNACK(seq=y, ACKnum=x+1) ACK(ACKnum=y+1) L 3 -85

TCP: Κλείσιμο σύνδεσης (ανάλυση) client state server state ESTAB client. Socket. close() FIN_WAIT_1 FIN_WAIT_2

TCP: Κλείσιμο σύνδεσης (ανάλυση) client state server state ESTAB client. Socket. close() FIN_WAIT_1 FIN_WAIT_2 can no longer send but can receive data FINbit=1, seq=x CLOSE_WAIT ACKbit=1; ACKnum=x+1 wait for server close FINbit=1, seq=y TIMED_WAIT timed wait for 2*max segment lifetime ACKbit=1; ACKnum=y+1 can still send data LAST_ACK can no longer send data CLOSED 3 -88

Ο κύκλος ζωής μιας TCP σύνδεσης TCP server lifecycle TCP client lifecycle 3 -89

Ο κύκλος ζωής μιας TCP σύνδεσης TCP server lifecycle TCP client lifecycle 3 -89

Σύνοψη: Έλεγχος συμφόρησης TCP duplicate ACK dup. ACKcount++ L cwnd = 1 MSS ssthresh

Σύνοψη: Έλεγχος συμφόρησης TCP duplicate ACK dup. ACKcount++ L cwnd = 1 MSS ssthresh = 64 KB dup. ACKcount = 0 slow start timeout ssthresh = cwnd/2 cwnd = 1 MSS dup. ACKcount = 0 retransmit missing segment dup. ACKcount == 3 ssthresh= cwnd/2 cwnd = ssthresh + 3 retransmit missing segment New ACK! new ACK cwnd = cwnd+MSS dup. ACKcount = 0 transmit new segment(s), as allowed cwnd > ssthresh L timeout ssthresh = cwnd/2 cwnd = 1 MSS dup. ACKcount = 0 retransmit missing segment timeout ssthresh = cwnd/2 cwnd = 1 dup. ACKcount = 0 retransmit missing segment . New ACK! new ACK cwnd = cwnd + MSS (MSS/cwnd) dup. ACKcount = 0 transmit new segment(s), as allowed congestion avoidance duplicate ACK dup. ACKcount++ New ACK! New ACK cwnd = ssthresh dup. ACKcount = 0 fast recovery dup. ACKcount == 3 ssthresh= cwnd/2 cwnd = ssthresh + 3 retransmit missing segment duplicate ACK cwnd = cwnd + MSS transmit new segment(s), as allowed 3 -107