Chapter 3 Transport Layer 11302020 Transport Layer 3

  • Slides: 40
Download presentation
Chapter 3: Transport Layer 11/30/2020. Transport Layer 3 -1

Chapter 3: Transport Layer 11/30/2020. Transport Layer 3 -1

검사합 예 r Note m 덧셈과정에서 발생하는 오버플로우는 결과값에 합산된다 r Example: add two

검사합 예 r Note m 덧셈과정에서 발생하는 오버플로우는 결과값에 합산된다 r Example: add two 16 -bit integers 1 1 0 0 1 1 1 0 1 0 1 wraparound 1 1 0 1 1 sum 1 1 0 1 1 0 0 checksum 1 0 0 0 0 1 1 Transport Layer 3 -16

Rdt 2. 0 : FSM의 정의 rdt_send(data) snkpkt = make_pkt(data, checksum) rdt_rcv(rcvpkt) && udt_send(sndpkt)

Rdt 2. 0 : FSM의 정의 rdt_send(data) snkpkt = make_pkt(data, checksum) rdt_rcv(rcvpkt) && udt_send(sndpkt) is. NAK(rcvpkt) 상위로부터 ACK 또 호출을 는 NAK udt_send(sndpkt) 기다림 응답을 기 다림 rdt_rcv(rcvpkt) && is. ACK(rcvpkt) L sender receiver rdt_rcv(rcvpkt) && corrupt(rcvpkt) udt_send(NAK) 하위로부터 호출을 기다림 rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) extract(rcvpkt, data) deliver_data(data) udt_send(ACK) Transport Layer 3 -22

Rdt 2. 0 : 오류 없을 때 동작 rdt_send(data) snkpkt = make_pkt(data, checksum) rdt_rcv(rcvpkt)

Rdt 2. 0 : 오류 없을 때 동작 rdt_send(data) snkpkt = make_pkt(data, checksum) rdt_rcv(rcvpkt) && udt_send(sndpkt) is. NAK(rcvpkt) 상위로부터 ACK 또 호출을 는 NAK udt_send(sndpkt) 기다림 응답을 기 다림 rdt_rcv(rcvpkt) && is. ACK(rcvpkt) L sender receiver rdt_rcv(rcvpkt) && corrupt(rcvpkt) udt_send(NAK) 하위로부터 호출을 기다림 rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) extract(rcvpkt, data) deliver_data(data) udt_send(ACK) Transport Layer 3 -23

Rdt 2. 0 : 오류 있을 때 동작 rdt_send(data) snkpkt = make_pkt(data, checksum) rdt_rcv(rcvpkt)

Rdt 2. 0 : 오류 있을 때 동작 rdt_send(data) snkpkt = make_pkt(data, checksum) rdt_rcv(rcvpkt) && udt_send(sndpkt) is. NAK(rcvpkt) 상위로부터 ACK 또 호출을 는 NAK udt_send(sndpkt) 기다림 응답을 기 다림 rdt_rcv(rcvpkt) && is. ACK(rcvpkt) L sender receiver rdt_rcv(rcvpkt) && corrupt(rcvpkt) udt_send(NAK) 하위로부터 호출을 기다림 rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) extract(rcvpkt, data) deliver_data(data) udt_send(ACK) Transport Layer 3 -24

rdt 2. 0: transition rdt_send(data) 송신측 udt_send(data) 수신측 rdt_rcv(data) 오류검사하고 없으면 deliver_data(data) 패킷을 만들고

rdt 2. 0: transition rdt_send(data) 송신측 udt_send(data) 수신측 rdt_rcv(data) 오류검사하고 없으면 deliver_data(data) 패킷을 만들고 udt_send(ACK) rdt_send(data) rdt_rcv(ACK) udt_send(data) rdt_rcv(data) 오류검사하고 있으면 재전송 udt_send(NAK) rdt_rcv(NAK) udt_send(data) rdt_rcv(data) udt_send(ACK) rdt_rcv(ACK) 오류검사하고 없으면 deliver_data(data) Transport Layer 3 -25

Rdt 2. 1 : 송신자 1 -1 rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt)

Rdt 2. 1 : 송신자 1 -1 rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && 2 -1 ( corrupt(rcvpkt) || is. NAK(rcvpkt) ) Wait for call 0 from above 1 4 -2 rdt_rcv(rcvpkt) Wait for ACK or NAK 0 2 udt_send(sndpkt) 2 -2 rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt) L 4 -1 rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || is. NAK(rcvpkt) ) udt_send(sndpkt) Wait for ACK or NAK 1 4 3 Wait for L call 1 from above 3 -1 rdt_send(data) sndpkt = make_pkt(1, data, checksum) udt_send(sndpkt) Transport Layer 3 -27

Rdt 2. 1: 수신자 1 -2 rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq 0(rcvpkt) 1 -1

Rdt 2. 1: 수신자 1 -2 rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq 0(rcvpkt) 1 -1 rdt_rcv(rcvpkt) && (corrupt(rcvpkt) sndpkt = make_pkt(NAK, chksum) 1 -1 udt_send(sndpkt) rdt_rcv(rcvpkt) && not corrupt(rcvpkt) && has_seq 1(rcvpkt) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(ACK, chksum) rdt_rcv(rcvpkt) && udt_send(sndpkt) (corrupt(rcvpkt) Wait for 0 from 1 below 2 Wait for 1 from below 2 -1 sndpkt = make_pkt(NAK, chksum) udt_send(sndpkt) 2 -1 rdt_rcv(rcvpkt) && not corrupt(rcvpkt) && has_seq 0(rcvpkt) sndpkt = make_pkt(ACK, chksum) 2 -2 rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) udt_send(sndpkt) && has_seq 1(rcvpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) Transport Layer 3 -28

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) && ( corrupt(rcvpkt) || Wait for is. ACK(rcvpkt, 1) ) call 0 from above rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt, 1) udt_send(sndpkt) rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt, 0) L rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || is. ACK(rcvpkt, 0) ) ACK 0 Wait for call 1 from above Wait for ACK 1 L rdt_send(data) sndpkt = make_pkt(1, data, checksum) udt_send(sndpkt) Transport Layer 3 -31

Rdt 2. 2 : 수신자 rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq 0(rcvpkt) L oncethru=1 rdt_rcv(rcvpkt)

Rdt 2. 2 : 수신자 rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq 0(rcvpkt) L oncethru=1 rdt_rcv(rcvpkt) && corrupt(rcvpkt) && if(oncethru==1) has_seq 1(rcvpkt) udt_send(sndpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(ACK, 0, chksum) udt_send(sndpkt) oncethru=0 Wait for 0 from below Wait for 1 from below rdt_rcv(rcvpkt) && corrupt(rcvpkt) && has_seq 0(rcvpkt) udt_send(sndpkt) rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq 1(rcvpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(ACK, 1, chksum) udt_send(sndpkt) Transport Layer 3 -32

Rdt 3. 0 : 송신자 1 -1 rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt)

Rdt 3. 0 : 송신자 1 -1 rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) L 4 -2 rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt, 1) stop_timer timeout udt_send(sndpkt) start_timer 4 -1 Wait for 2 ACK 0 Wait for call 0 from above 1 rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || L is. ACK(rcvpkt, 0) ) rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || is. ACK(rcvpkt, 1) ) 2 -1 L timeout udt_send(sndpkt) start_timer 2 -2 rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt, 0) stop_timer 3 Wait for Wait 4 for ACK 1 rdt_send(data) call 1 from above 3 -1 rdt_rcv(rcvpkt) L sndpkt = make_pkt(1, data, checksum) udt_send(sndpkt) start_timer Transport Layer 3 -34

Rdt 3. 0 : ACK 손실과 조급한 타임아웃 Transport Layer 3 -36

Rdt 3. 0 : ACK 손실과 조급한 타임아웃 Transport Layer 3 -36