Скачать презентацию handle data from multiple sockets add transport header Скачать презентацию handle data from multiple sockets add transport header

78b06f16074a2be8db71dde15dee9278.ppt

  • Количество слайдов: 94

handle data from multiple sockets, add transport header (later used for demultiplexing) use header handle data from multiple sockets, add transport header (later used for demultiplexing) use header info to deliver received segments to correct socket

Wait for call 0 from above Wait for ACK or NAK 1 Wait for Wait for call 0 from above Wait for ACK or NAK 1 Wait for ACK or NAK 0 Wait for call 1 from above

rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq 0(rcvpkt) rdt_rcv(rcvpkt) && corrupt(rcvpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = 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) Wait for 0 from below Wait for 1 from below sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt)

Wait for call 0 from above Wait for 0 from below Wait for ACK Wait for call 0 from above Wait for 0 from below Wait for ACK 0

rdt_send(data) rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || is. ACK(rcvpkt, 1) ) sndpkt = make_pkt(0, data, rdt_send(data) rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || is. ACK(rcvpkt, 1) ) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) Wait for ACK 0 Wait for call 0 from above timeout udt_send(sndpkt) start_timer stop_timer timeout udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || is. ACK(rcvpkt, 0) ) Wait for ACK 1 Wait for call 1 from above rdt_send(data) sndpkt = make_pkt(1, data, checksum) udt_send(sndpkt) start_timer rdt_rcv(rcvpkt)

if (nextseqnum < base+N) { sndpkt[nextseqnum] = make_pkt(nextseqnum, data, chksum) udt_send(sndpkt[nextseqnum]) if (base == 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) base = getacknum(rcvpkt)+1 If (base == nextseqnum) stop_timer else start_timer

udt_send(sndpkt) rdt_rcv(rcvpkt) && notcurrupt(rcvpkt) && hasseqnum(rcvpkt, expectedseqnum) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(expectedseqnum, ACK, udt_send(sndpkt) rdt_rcv(rcvpkt) && notcurrupt(rcvpkt) && hasseqnum(rcvpkt, expectedseqnum) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(expectedseqnum, ACK, chksum) udt_send(sndpkt) expectedseqnum++

head not len used head not len used

Seq=79, ACK=43, data = ‘C’ Seq=43, ACK=80 Seq=79, ACK=43, data = ‘C’ Seq=43, ACK=80

Next. Seq. Num = Initial. Seq. Num Send. Base = Initial. Seq. Num Next. Seq. Num = Initial. Seq. Num Send. Base = Initial. Seq. Num

Seq=9 tes da t a 100 = ACK Seq=9 2, 8 by tes da Seq=9 tes da t a 100 = ACK Seq=9 2, 8 by tes da 100 = ACK Seq=92 timeout 2, 8 by tes da ta Seq= 100, 2 0 byte s data 00 =1 20 CK CK=1 A A Seq=9 ta 2, 8 by Seq=92 timeout Seq=9 tes da t a 20 K=1 AC

Seq=9 2, 8 by Seq=1 tes da t a 100 CK= A 00, 20 Seq=9 2, 8 by Seq=1 tes da t a 100 CK= A 00, 20 bytes data 120 = ACK

FIN ACK FIN ACK

RTT one segme nt two segme nts four segme nts RTT one segme nt two segme nts four segme nts

threshold threshold