2020. 6. 9.

[Network] 3.4 신뢰적 data 전송의 원리 2


*rdt 2.1 : receiver

rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) 
&& has_seqO(rcvpkt) 
sndpkt = make_pkt(ACK, chksum) 
udt_send(sndpkt) 
rdt_rcv(rcvpkt) && (corrupt(rcvpkt) 
sndpkt = chksum) 
rdt_rcv(rcvpkt) && 
not corrupt(rcvpkt) && 
has seql(rcvpkt) 
sndpkt = make_pkt(ACK, chksum) 
udt_send(sndpkt) 
ait fo 
O from 
below 
ait fo 
1 from 
below 
rdt_rcv(rcvpkt) && (corrupt(rcvpkt) 
sndpkt = chksum) 
rdt_rcv(rcvpkt) && 
not corrupt(rcvpkt) && 
has seqO(rcvpkt) 
sndpkt = make_pkt(ACK, chksum) 
udt_send(sndpkt) 
&& notcorrupt(rcvpkt) 
&& has_seql (rcvpkt) 
sndpkt = make_pkt(ACK, chksum)

# 시퀀스넘버는 중복됬는지 확인해야하므로 0 1 밖에 없다.


*rdt 2.1

Sender
  • pkt seq #를 추가한다.
  • 두개의 seq #만으로 충분하다. (이전 송신된 pkt와의 중복만을 검사함으로..)
  • ACK/NAK의 손상을 검사한다.
  • 상태가 rdt 2.0보다 두배 많다.
    • 현재 전송 pkt seq # 0인지 1인지 기억하고 있어야 한다.

receiver
  • 수신된 pkt의 중복여부를 검사해야한다.
    • pkt seq # 0/1인지 검사한다.
  • receiver sender ACK/NAK를 정상적으로 수신했는지 알 수 없다.

*rdt 2.2 : NAK가 없는 rdt

rdt 2.1과의 차이는 ACKs만을 사용하는 것이다.
receiver NAK 대신 최근에 정확히 수신된 pkt에 대한 ACK를 전달한다.
Sender는 중복된 ACK를 통해서 중복된 ACK pkt이후에 전송한 pkt이 정상적으로 수신되지 못했음을 안다.

ACK의 누적
누적된 ACK를 사용하는 경우 sender는 마지막 수신한 ACK seq # 이전의 pkt는 모두 정상 잔달 되었음을 확인 할 수 있다.

# ack 번호를 집어넣어서 보낸다.
ack 0 : 0번까지 받았다는 뜻이다. - 0번을 잘받았다 그러면 안된다.
누적이기때문이다. 0-5 보내는 ack3 온다면 0~3까지 잘받았다는것
# 1번이 왔는데 깨지면 ACK 0 보내 1번을 다시 받는다.
NAK 없애는 계기가 .
# NAK 네거티브 아크널러지먼트라고 불러야한다. - 표준어 나크라 부르면 안됨

*rdt 2.2 : NAK 없는 rdt

rdt_send(data) 
sndpkt = data, checksum) 
udt_send(sndpkt) 
Wait for 
call O from 
above 
Wait for 
ACK 
rdt_rcv(rcvpkt) && 
( corrupt(rcvpkt) Il 
isACK(rcvpkt,1) ) 
udt_send(sndpkt) 
rdt_rcv(rcvpkt) 
&& notcorrupt(rcvpkt) 
rdt_rcv(rcvpkt) && 
(corrupt(rcvpkt) Il 
has_seql (rcvpkt) 
udt_send(sndpkt) 
ait fo 
O from 
below 
sender FSM 
fragment 
receiver F SM 
fragment 
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) 
&& has_seql(rcvpkt) 
extract(rcvpkt,data) 
sndpkt = make_pkt(ACKI, chksum) 
udt_send(sndpkt)

sender
상태) wait for call 0 from above
  • 0번을 패킷을 보내기위해 기다리고 있는 상태
이벤트) rdt_send(data)
  • TCP 데이터를 APP에게 받았다.
액션) sndpkt = make_pkt(0, data, checksum)
  • TCP 0번시퀀스와 데이터, 체크섬을 포함한 패킷을 만든다.
액션) udt_send(sndpkt)
  • TCP 세그먼트를 IP에게 보낸다.
상태) wait for ack 0
  • TCP 0 ACK 오기를 기다리는 상태로 변경한다.
이벤트) rdt_rvc(rcvpkt) && (corrupt(rcvpkt) || isACK(rcvpkt, 1)) udt_send(sndpkt)
  • IP로부터 TCP 1 ACK 받는다.
액션) udt_send(sndpkt)
  • 패킷이 깨져서 버리고 0 패킷을 다시 패킷을 보낸다.
이벤트) rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt,0)
  • TCP IP에게 0 ACK 보내 0 패킷을 받는다.

receiver

# 패킷이 아예 안갈수도 있는데 이것 고려하지않음.
타이머라는 것을 사용해서 이것을 해결한다.
타이머의 모든 프로세스 cpu 쿨럭발생기를 사용한다.
  • cpu 성능을 깍아먹으므로 되도록 적게 띄우고 싶어한다.

*rdt 3.0 : 채널에 error loss가 가능

새로운 가정
하위 채널에 packet loss가 일어 날 수 있는 경우 (data & ACKs)
  • checksum, seq #, ACKs만으로는 충분하지 않다.

새로운 접근 방식
sender는 합리적인 시간 만큼 ack를 기다린다.
  • 합리적인 시간만큼 기다려도 ACK가 없으면 재전송한다.
  • 만일 ACK가 지연된 것이라면
    • 중복을 유발하는 재전송이 일어난다. – 이미 중복 처리에 대한 준비가 되어있다.
    • receiver는 중복된 pkt에 대한 ACK를 재전송한다.
    • 이러한 작업은 실제로 문제를 일으키지는 않는다.
  • 위의 구현을 위해 countdown timer를 필요로 한다.
// timer CPU 부담이 매우 크다. sender 타이머가 있다.

*rdt 3.0 : sender

rdt_send(data) 
sndpkt = data, checksum) 
udt_send(sndpkt) 
start timer 
Wait for 
call Ofrom 
above 
Wait 
for 
ACKO 
( corrupt(rcvpkt) Il 
timeout 
start timer 
rdt_rcv(rcvpkt) 
&& notcorrupt(rcvpkt) 
stop_timer 
timeout 
start timer 
( corrupt(rcvpkt) Il 
isACK(rcvpkt,O) ) 
Wait 
for 
ACKI 
rdt_rcv(rcvpkt) 
&& notcorrupt(rcvpkt) 
isACK(rcv kt,0) 
stop_timer 
Wait for 
call 1 from 
above 
rdt rcv(rcv kt 
rdt_send(data) 
sndpkt = make_pkt(l, data, checksum) 
udt_send(sndpkt) 
start timer

// sender 0 데이터를 보내기 위해 데이타를 기다리고 있다.
// RTT보다 길어야한다. 하지만 RTT 굉장히 변동적이다.

*rdt 3.0 in action - 시나리오

sender 
receiver 
g:ktO 
send ICV' Okto 
send ACKO 
sender 
send pktO 
rcv ACKO 
send pktl 
timeout 
rcvACK1 
send pktO 
receiver 
kto 
rcv okto 
send A CKO 
rCV A 
send pkt 
ACK 
rcvACk1 
send 
ACK 
rcv okt 1 
send ACKI 
rcv pktO 
send ACKO 
okt 
ACK 
(a) operation With no loss 
rcv pktl 
send ACKI 
ICV ekto 
send ACKO 
(b) lost packet

*rdt 3.0 in action

sender 
send pktO 
rcv ACC 
send I 
pkt 
ACK 
recever 
rcv pktO 
sen d ACKO 
r CV pkt I 
(l oss) 
timeout 
resend pkt I 
AC 
rcvACk1 
send pktC 
ACK 
send ACKI 
r CV pktl 
sender 
send pktO 
rcv ACKO 
send pkt I 
timeout 
resend pktl 
(detect duplicate) rcvACK 
send ACKI 
pktO 
send ACKO 
send pktO 
ACK 
p kh 
ACKO 
receiver 
rcv Okto 
send ACKO 
pktl 
send ACKI 
rcv pktl 
(detect duplicate) 
send ACKI 
rev' pktO 
send ACKO 
(c) lost ACK 
(d) premature timeout

# 가다가 깨진경우 오다가 없어진경우

*rdt 3.0 성능

rdt3.O works, but performance stinks 
example: 1 Gbps link, 15 ms e-e prop. delay, IKB packet: 
L (packet lenqth in bits) 
8kb/Dkt 
8 microsec 
transmit: R (transmission rate, bps) - 
10* *9 b/sec 
L/R 
.008 
0.00027 
sender 
R TT + L / R 30.008 
o 
o 
sender: utilization - fraction of time sender busy sending 
IKB pkt every 30 msec -Y 33kB/sec thruput over 1 Gbps link 
network protocol limits use of physical resources!

*rdt 3.0 : stop and - wait

first packet bit transmitted, t = O 
last packet bit transmitted, t = L / R 
RTT 
ACK arrives, send ne 
packet, t = RTT + L/R 
sender¯ 
L/R 
RTT+L/R 
receiver 
first packet bit arrives 
last packet bit arrives, senc 
ACK 
.008 
0.00027 
30.008

*Pipelined protocol

Pipelining : sender에게 ACK를 기다리지 않고 여러 개의 pkt를 전송하도록 하용하는것
  • seq #의 범위는 증가되어야 한다.
  • sender receiver는 하나이상의 pkt buffering해야 한다.
data packet—. 
(a) a stop-md-wOt protocol in operation 
data packets 
ACK packets 
(b) a pipelined protocol in operation
piplining protocol : go-Back-N, selective repeat

댓글 없음:

댓글 쓰기