2020. 6. 9.

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



*Pipelining : 성능의 향상

sender 
first packet bit transmitted, t = O 
last bit transmitted, t = L / R 
RTT 
ACK arrives, send nex 
packet, t = RTT + L/R 
receiver 
first packet bit arrives 
last packet bit arrives, send ACK 
last bit of 2nd packet arrives, send ACK 
last bit of 3rd packet arrives, send ACK 
.024 
30.008 
Increase utilization 
by a factor of 3! 
0.0008 
sender 
3 *L/R 
RTT+L/R

# 혼잡제어는 센더가 하는것으로 윈도우사이즈를 늘리고 줄이는것이다.
# 윈도우사이즈를 최대한 많이 줄인다면 1MSS까지 줄일수 있다.
# 센더의 상한성을 결정하는것은 리시버가 결정한다.

*Go-Back-N

sender
  • pkt hrader k-bit seq # 를 갖는다.
  • window : 전송되었지만 확인 안된 pkt를 위해 허용 할수있는 seq #의 범위

send ase 
Ill I Il 
nextseqnum 
window size 
Al-Il 
pkt

  • ACK(n) : seq # n을 가진 ACK cumulative ACK로 인식한다.
    • 수신측에서 보면 n을 포함한 n까지의 모든 pkt에 대한 ACK이다.
  • 가장 오래된 수신확인 안된 timer를 단일 timer로 사용한다.
  • Timeout 발생시 : 송신되었으나 ACK가 없는 모든 pkt를 재전송한다. (window내에 전송된 모든 pkt)

*GBN : sender FSM

base—I 
nextseqnum=l 
rdt_rcv(rcvpkt) 
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) 
timeout 
start timer 
udt send(sndpkt[base]) 
udt 
corrupt(rcvpkt) 
rdt rcv(rcvpkt) && 
notcorrupt(rcvpkt) 
base = getacknum(rcvpkt)+l 
If (base nextseqnum) 
stop_timer 
else 
start timer

*GBN : receiver FSM

default 
Wait 
expectedseqnum= 1 
sndpkt - 
make_pkt(expectedseqnum,ACK,chksum) 
rdt_rcv(rcvpkt) 
&& notcurrupt(rcvpkt) 
extract(rcvpkt,data) 
deliver data(data) 
sndpkt = 
expectedseqnum++

ACK만 사용 : pkt가 수신될때 마다 항상 현재까지 수신된 가장 높은 seq# 가진 pkt에 대한 ACK를 전송한다.
  • 중복된 ACK가 발생 할 수 있다.
  • 단지 expectedseqnum만을 유지한다. : 현재까지 수신된 pkt seq#의 다음 seq#
순서가 잘못 수신된 pkt의 처리
  • 걍 버린다. : 순서가 잘못된 pkt에 대해서 buffering 할 필요가 없다.
  • 현재까지 수신된 가장 큰 seq#에 대한 ACK를 재전송한다.

*GBN in action

se 
er 
send 
300d c:ktJ 
send pkt2 
(l SS 
send pkt3 
{wat) 
rcv ACKO 
send pkt4 
rev ACK 1 
g:kt2 tmøout 
send pkt2 
send Okt3 
send pkta 
send Pkt5 
receiver 
"cv pkfO 
send ACKO 
send ACKI 
rcv pkt3, disco•d 
send ACK 
tev Ckta dsoard 
send ACK 1 
rcv pkt2e deliver 
rcv pkt , eliver 
send ACK3

*Selective Repeat

receiver가 수신한 pkt에 대한 개별적인 ACK가 요구 된다.
  • 순서가 틀린 pkt들은 하위 seq#를 가진 pkt가 수신 될때까지 buffering되었다가 seq# 순서대로 상위 layer에 전달된다.
sender ACK가 없는 pkt에 대해서만 재전송한다.
  • sender timer ACK가 없는 각각의 pkt에 대해서 유지된다.
sender window
  • send_base pkt에 대한 ACK를 받아야 이동한다. : GBN에서는 누적된 ACK를 이용 함으로 send_base pkt에 대한 ACK가 없어도 이동가능하다.

*Selective repeat : sender receiver windows

send 
ase 
nextseqnum 
Window size 
Window size 
pkt 
Al-Il 
pkt

// 확인 초록색 패킷은 타이머와 데이터를 없앤다.
// 패킷마다 타이머가 존재하며 ack 안와서 타임아웃시 재전송한다.

*Selective repeat

sender
상위 layer에서 Data가 수신되면
  • pkt의 다음 seq#를 검사 window내에 있으면 pkt를 전송한다.
timeout(n)
  • pkt n을 재전송하고 timer restart한다.
ACK(n) 이 수신
  • n이 윈도우에 있다면 pkt가 수신된것을 확인한다.
  • n send_base와 같다면 send_base는 가장 작은 seq#를 갖는 미확인 pkt로 이동하고 window내에 이 전송 pkt가 있으면 전송한다.

receiver
pkt n [n in rcvbase, rcvbase+N-1]
  • ACK(n)을 송신
  • out-order인경우 buffering한다.
  • in-ordert인 경우 필요하다면 buffer에 저장된 번호가 연속적인 pkt와 함께 상위 layer에 전달하고 rcv_base 가장 낮은 seq#를 가진 미전송 pkt 옮긴다.
pkt n [n in rcvbase-N, rcvbase-1]
  • ACK(n)
이외의 경우
  • 무시한다.

*repeat in action

rcvd 
reg. 
but t .r.d 
i.:ra. 
buffering* ACK 
acv.' 
Window 01 & 
200 
Windowe Ole



*Selective repeat 의 문제

Example
  • Seq# : 0, 1, 2, 3
  • windows size = 3
  • 왼쪽 두개의 경우 모두 seq# 0으로 구별이 불가능하다.

Q: windows size seq#의 관계를 어떻게 하면 이문제를 해결 할 수 있는가
windows size seq#의 개수의 절반 이하로 한다.

*Selective repeat 의 문제

Example
  • Seq# : 0, 1, 2, 3, 4
  • windows size = 3


Example
  • Seq# : 0, 1, 2, 3, 4
  • windows size = 2


// 윈도우 사이즈를 2이하로 줄이면 이런 문제가 발생하지않는다. 하지만 그렇게 되면.. 너무 느리지않을까싶다. TCP go back n select repeat 섞어서 사용한다.

댓글 없음:

댓글 쓰기