Pipelined protocol

◾ Pipelining

 : sender에게 ACK를 기다리지 않고 여러 개의 pkt를 전송하도록 하용하는것
• seq #의 범위는 증가되어야 한다.
• sender와 receiver는 하나이상의 pkt를 buffering해야 한다.

• piplining protocol : go-Back-N, selective repeat

윈도우 : RTT안에 있는 패킷 (단위 : MSS)

네트워크 성능은 윈도우가 결정

네트워크 퍼포먼스 : 단위시간동안 패킷이 얼마나 잘가는지

네트워크가 혼잡하면 윈도우 사이즈를 줄인다. (혼잡한 정도는 모른다 - 블라인드 통신 방식)


1) Go-Back-N

Sender 

1) Timeout 재전송

2) 정상 ACK를 받을 때마다 Timer 재시작 → Send base (윈도우에서 보낸지 가장 오래된 패킷) 에만 있음

 

◾ Receiver

1) 응답 → 누적 ACK

2) 순서가 틀린 pkt는 버림

 

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

• ACK(n) : 응답 패킷중에 시퀀스 넘버가

 - seq # n을 가진 ACK를 cumulative ACK(누적 ACK : 어디까지 잘 받았다고 응답하는 패킷)로 인식한다.
• 수신측에서 보면 n을 포함한 n까지의 모든 pkt에 대한 ACK이다.
• 가장 오래된 수신확인 안된 timer를 단일 timer로 사용한다. (Timer는 Send base에 있다.)
• Timeout 발생시 : 송신되었으나 ACK가 없는 모든 pkt를 재전송한다. (window내에 전송된 모든 pkt)


2) Selective repeat

◾ sender

• 상위 layer에서 Data가 수신되면 (rdt_send())

 - pkt의 다음 seq#를 검사 window 내에 있으면 pkt를 전송한다.
• timeout(n) : n번째 패킷에서 timeout이 발생하면
 - 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한다. (out-order : 내가 원하지 x 패킷 / in-order : 내가 원하는 패킷)
 - in-order인 경우 필요하다면 buffer 에 저장된 번호가 연속적인 pkt와 함께 상위 layer에 전달하고 rcv_base를 가장 낮은 seq# 를 가진 미전송 pkt로 옮긴다.
• pkt n [n in rcvbase-N, rcvbase-1]
 - ACK(n)
• 이외의 경우
 - 무시한다.

 

+ Recent posts