4(1) 1
5 end-to-end host-to-host point-to-point 2
multiplexingdemultiplexing UDP TCP (flow control) (congestion control) TCP 3
()(IP) : best-effort 4
TCP (Transmission Control Protocol) (flow control) (congestion control) UDP (User Datagram Protocol) ( best-effort ) () 5
Multiplexing Demultiplexing (1) host-to-host process-to-process (end-to-end) demultiplexing demultiplexing cf. = IP + 6
Multiplexing Demultiplexing (2) demultiplexing TPDU (Transport Protocol Data Unit) multiplexing 7
Multiplexing Demultiplexing (3)? (source port number) (destination port number) H n H t TPDU M segment P1 P3 P4 P2 M M M M 8
Multiplexing Demultiplexing (4) (well-known port) 20, 21: FTP 25: SMTP 53: DNS 80: HTTP 110: POP3 source port # destination port # () TCP/UDP 9
UDP: User Datagram Protocol [RFC 768] UDP UDP UDP DNSSNMP UDP? / cf. TCP20UDP8 10
UDP: User Datagram Protocol [RFC 768] 16 1 1 0 # 32 # () = source = destination : UDP UDP 11
UDP 16 1 316 0110011001100000 0101010101010101 1000111100001100 12 0110011001100000 (1) 0101010101010101 (2) 1011101110110101 () 3 1011101110110101 (1+2) 1000111100001100 (3) 0100101011000010 () 1 1011010100111101 316 0110011001100000 (1) 0101010101010101 (2) 1000111100001100 (3) 1011010100111101 (cksum) 1111111111111111 12
13
(a) rdt_send( ) deliver_data( ) () rdt: reliable data transfer udt: unreliable data transfer () udt_send( ) udt_rcv( ) (b) 14
rdt_send( ): (e.g., ) deliver_data( ): rdt rdt_send( ) deliver_data( ) () () udt_send( ) udt_rcv( ) udt_send( ): rdt rdt_rcv( ): 15
(rdt) (finite state machine, FSM) 1 2 16
rdt1.0: FSM call from above rdt_send(data) packet = make_pkt(data) udt_send(packet) call from below rdt_receive(packet) extract(packet, data) deliver_data(data) (a) rdt1.0: (b) rdt1.0: 17
rdt2.0:? (ACK: acknowledgment) (NAK: negative acknowledgment) NAK ARQ (Automatic Repeat Request) 18
ARQ3 (UDP) (e.g., ) (ACK)(NAK) 19
rdt_send(data) sndpkt = make_pkt(data, cksum) rdt2.0fsm && corrupt(rcvpkt) sndpkt = make_pkt(nak) call from above && isack(rcvpkt) Λ (a) FSM ACK or NAK && isnak(rcvpkt) udp_send(sndpkt) call from below && notcorrupt(rcvpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(ack) (b) FSM 20
rdt2.0 rdt_send(data) sndpkt = make_pkt(data, cksum) && corrupt(rcvpkt) sndpkt = make_pkt(nak) call from above && isack(rcvpkt) Λ (a) FSM ACK or NAK && isnak(rcvpkt) udp_send(sndpkt) call from below && notcorrupt(rcvpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(ack) (b) FSM 21
rdt2.0 rdt_send(data) sndpkt = make_pkt(data, cksum) && corrupt(rcvpkt) sndpkt = make_pkt(nak) call from above && isack(rcvpkt) Λ (a) FSM ACK or NAK && isnak(rcvpkt) call from below && notcorrupt(rcvpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(ack) (b) FSM 22
rdt2.0 Stop and wait 1 ACK/NAK?? ACK/NAK () 23
rdt2.1: ACK/NAK call 0 from above && notcorrupt(rcvpkt) && isack(rcvpkt) Λ && [ corrupt(rcvpkt) isnak(rcvpkt) ] rdt_send(data) sndpkt = make_pkt(0, data, cksum) ACK or NAK 1 ACK or NAK 0 && [ corrupt(rcvpkt) isnak(rcvpkt) ] && notcorrupt(rcvpkt) && isack(rcvpkt) call 1 from rdt_send(data) above sndpkt = make_pkt(1, data, cksum) Λ 24
rdt2.1: ACK/NAK && corrupt(rcvpkt) sndpkt = make_pkt(nak, cksum) 0 from below && notcorrupt(rcvpkt) && has_seq1(rcvpkt) sndpkt = make_pkt(ack, cksum) && notcorrupt(rcvpkt) && has_seq0(rcvpkt) extract(rcvpkt, data) deliver_data(data) sdndpkt = make_pkt(ack, cksum) && notcorrupt(rcvpkt) && has_seq1(rcvpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(ack, cksum) 1 from below && corrupt(rcvpkt) sndpkt = make_pkt(nak, cksum) && notcorrupt(rcvpkt) && has_seq0(rcvpkt) sndpkt = make_pkt(ack ck_sum) 25
rdt2.1 01? ACK/NAK rdt2.02 01 01 ACK/NAK 26
rdt2.2: NAK rdt2.1ack ACK ACK ACKNAK 27
call 0 from above rdt2.2: ACK && notcorrupt(rcvpkt) && isack(rcvpkt, 1) Λ rdt_send(data) sndpkt = make_pkt(0, data, cksum) && ACK1 [ corrupt(rcvpkt) isack(rcvpkt, 0) ] ACK0 && [ corrupt(rcvpkt) isack(rcvpkt, 1) ] && notcorrupt(rcvpkt) && isack(rcvpkt, 0) call 1 from rdt_send(data) above sndpkt = make_pkt(1, data, cksum) Λ 28
rdt2.2: ACK/NAK Λ oncethru = 0 && [corrupt(rcvpkt) has_seq1(rcvpkt)] if (oncethru = = 1) 0 from below && notcorrupt(rcvpkt) && has_seq0(rcvpkt) extract(rcvpkt, data) deliver_data(data) sdndpkt = make_pkt(ack, 0 cksum) oncethru = 1 && notcorrupt(rcvpkt) && has_seq1(rcvpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(ack, 1 cksum) 1 from below && [corrupt(rcvpkt) has_seq0(rcvpkt)] 29
rdt3.0: : (ACK) ACK? ACK ACK () ACK 30
rdt3.0: Λ call from above rdt_send(data) sndpkt = make_pkt(0, data, cksum) start_timer ACK0 && [ corrupt(rcvpkt) isack(rcvpkt, 1) ] Λ timeout start_timer && notcorrupt(rcvpkt) && isack(rcvpkt, 1) stop_timer && [ corrupt(rcvpkt) isack(rcvpkt, 0) ] timeout start_timer ACK1 rdt_send(data) sndpkt = make_pkt(1, data, cksum) start_timer && notcorrupt(rcvpkt) && isack(rcvpkt, 0) stop_timer call from above Λ 31
rdt3.0 send pkt0 rcv ACK0 send pkt1 rcv ACK1 send pkt0 ACK0 ACK1 ACK0 pkt0 pkt1 pkt0 (a) rcv pkt0 send ACK0 rcv pkt1 send ACK1 rcv pkt0 send ACK0 send pkt0 rcv ACK0 send pkt1 timeout resend pkt1 rcv ACK1 send pkt0 ACK0 pkt1 ACK1 ACK0 pkt0 (loss) pkt1 pkt0 rcv pkt0 send ACK0 rcv pkt1 send ACK1 rcv pkt0 send ACK0 (b) 32
rdt3.0 send pkt0 rcv ACK0 send pkt1 timeout resend pkt1 rcv ACK1 send pkt0 ACK0 ACK1 (loss) ACK1 ACK0 pkt0 pkt1 pkt1 pkt0 rcv pkt0 send ACK0 rcv pkt1 send ACK1 rcv pkt1 () send ACK1 rcv pkt0 send ACK0 send pkt0 rcv ACK0 send pkt1 timeout resend pkt1 rcv ACK1 send pkt0 rcv ACK1 do nothing ACK0 ACK1 ACK1 ACK0 pkt0 pkt1 pkt1 pkt0 rcv pkt0 send ACK0 rcv pkt1 send ACK1 rcv pkt1 () send ACK1 rcv pkt0 send ACK0 (c) ACK (d) 33
rdt3.0 rdt3.0 1Gbps(R)15ms 1KB(L) L/R RTT sender receiver 30.0081kB 267kb/sec (1Gbps) (Stop and Wait)! 34
1300,000km 1300km 1µ300m 1GHz CPU1,000,000 1GHz CPU1,000 () 10 USA100 Stop-and-Wait 35
Quiz-4 HTTP FTP SMTP 36
Quiz-5 DNS DNS 37
Quiz-6 DNSUDP 38