인프라 7기/Network

신뢰적 Data transfer

킹버거 2023. 3. 23. 11:18

reliable data transfer의 약자 rdt 
unreliable data transfer의 약자 udt

 

Application Layer은 하위 계층이 신뢰적인 데이터 전송을 하길 원한다 .

하지만 Network Layer은 신뢰적인 데이터 전송을 제공하지 않는다.

따라서 TCP가 신뢰적인 데이터 전송을 한다.


TCP가 원래 하는 일

                       event    :    action

Sender           rdt_send() : udt_send()

Receiver         rdt_rcv() : deliver_data()

 

rdt1.0

조건: 하위 채널이 신뢰적 

Sender : X

Receiver : X

문제 발생 : X

 

rdt2.0 

조건: 하위 채널 bit 에러가 발생

rdt1.0에서 추가된 기능

1. sender가 패킷에 checksum을 추가함
-> receiver가 sender로부터 수신한 패킷에 오류가 없는지 확인할 수 있도록 checksum을 보내는 것이다.
2. receiver가 응답 패킷을 전송함 
-> receiver가 sender로부터 수신한 패킷이 정상 패킷이면 ACK를 전송하고 오류가 있는 패킷이면 NAK를 전송한다.
3. sender가 에러가 난 패킷을 재전송한다.
-> receiver의 응답이 NAK일 때, sender가 해당 패킷을 재전송을 한다. 

문제 발생 : 패킷 손상 가능성

 

rdt2.1

조건: 응답(ACK, NAK)에 에러가 발생

rdt2.0에서 추가된 기능

1. sender가 패킷에 sequence number가 추가함
-> receiver가 수신한 패킷의 중복 여부를 판단할 수 있도록 sequence number로 패킷을 구분한다.
  

문제 발생 : 패킷 손상 가능성, 응답 손상 가능성

 

rdt2.2

조건: NAK 대신에 마지막으로 받은 패킷의 ACKn을 보냄

rdt2.0에서 변형된 것: NAK 대신 누적(cumulative) ACK를 전송함. 

문제 발생 : 패킷 손상 가능성, 응답 손상 가능성 

 

rdt3.0

조건: ACK 지연이 발생함

rdt 2.2에서 추가된 기능

1. timer 기능이 추가되어 sender가 패킷을 보낸 후 timeout이 발생하면 해당 패킷을 재전송한다.

 

  sequence# 중복 발생 재전송(Sender) 발생 가능한 문제 
rdt2.0 X X NAK 응답을 받았을 때 패킷 손상
rdt2.1 O O 응답(ACK/NAK)이 손상됐을 때 패킷 손상, 응답 손상
rdt2.2 O O 응답(ACKn)이 손상되거나 중복된 경우 패킷 손상, 응답 손상
rdt3.0 O O timeout이 발생한 경우 X

# rdt 1.0: 신뢰적인 채널

- 하위 채널이 신뢰적인 경우

 

<sender>

① TCP가 Process로부터의 data 전달을 기다리고 있는 상태이다.

 

② TCP가 Process로부터 data(message)를 전달받는 event가 발생했을 때, ③ data에 header를 붙여 packet을 생성하고 ④ IP로 보내는 action을 한다.

 

⑤ Process로부터 data를 전달받는 event를 기다리는 상태이다.

 

<receiver> 

ⓐ TCP가 IP로부터 packet이 전달되기를 기다리고 있는 상태이다. 

 

TCP가 IP로부터 packet을 전달받는 event가 발생한다.

ⓒ TCP가 packet으로부터 data를 추출하고 ⓓ Process로 data를 전송한다.

 

ⓔ TCP가 IP로부터 packet을 전달받는 event를 기다리는 상태이다.


# rdt 2.0: 비트 오류가 있는 채널

 

rdt 1.0에서 추가되는 부분 

<sender> 

1) 'packet'이 'sndpkt'로 명칭 변경

2) packet = make_pkt(data) 가 sndpkt = make_pkt(data,checksum)으로 변경

3) 패킷 전송 상태 확인 절차 추가 rdt_rcv(rcvpkt) && isNAK(rcvpkt) 

                                                     rdt_rcv(rcvpkt) && isACK(rcvpkt) 

<receiver>

1) 'packet'이 'rcvpkt'로 명칭 변경 

2) 오류 검출 절차 추가 rdt_rcv(rcvpkt) && corrupt(rcvpkt)

                                     rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)

3) feedback 추가        udt_send(NAK), udt_send(ACK)

<sender>

TCP가 Process로부터의 data 전달을 기다리고 있는 상태이다.

 TCP가 Process로부터 data(message)를 전달받는 event가 발생했을 때, data와 checksum으로부터 IP에 전송할 패킷을 생성하여  IP로 보내는 action을 한다.

⑤ receiver가 sender에게 pkt를 잘 받았다고 하는 응답인 acknowledgement(ACKs)나 reveiver가 sender에게 pkt에 error 또는 장애가 있다고 하는 응답인 negative acknowledgement(NAKs)를 받을 때까지 기다리고 있는 상태이다.

 TCP가 IP로부터 패킷을 전달받고, 그 패킷이 NAK 응답일 때, ⑦ IP로 패킷을 다시 전송한다. 
TCP가 IP로부터 패킷을 전달받고, 그 패킷이 ACK 응답이라면, 해당 통신이 종료된다.

TCP가 Process로부터의 data 전달을 기다리고 있는 상태이다.

 

<receiver> 

TCP가 IP로부터 packet이 전달되기를 기다리고 있는 상태이다. 

 

TCP가 IP로부터 전달받은 패킷에 error나 장애가 발생했을 때, IP로 NAK 응답을 전송한다.

 TCP가 IP로부터 packet을 전달받는 event를 기다린다.

TCP가 IP로부터 패킷을 전달받고, 그 패킷에 아무런 문제가 없을 때, 패킷으로부터 data(message)를 추출하고,

Process로 data를 전송한다. 그리고 IP에게 ACK 응답을 전송한다. 

TCP가 IP로부터 packet을 전달받는 event를 기다리는 상태이다.

 

<시나리오>


# rdt 2.1 : ACK/NAK가 훼손되는 경우
rdt 2.0에서 추가되는 부분 

1) sndpkt = make_pkt(data,checksum)가 sndpkt = make_pkt(0,data,checksum)으로 변경

<sender> 

 

① TCP가 Process로부터 sequence number가 0인 패킷을 전달받는 event를 기다리는 상태이다. 

 

② TCP가 Process로부터 0번 패킷을 전달받는 event가 발생했을 때, sequence number 0, data, checksum으로부터 IP에 전송할 패킷을 생성하고, 이를 IP로 보내는 action을 한다.

 

③ TCP가 IP로부터 sequence number가 0인 ACK 패킷/NAK 패킷을 전달받는 event를 기다리는 상태이다.

④ TCP가 IP로부터 패킷을 전달받고, 그 패킷이 corrupt하거나 NAK 응답이면 IP로 패킷을 다시 전송한다. 

그리고 ⓦ IP로부터 sequence number가 0인 ACK 패킷/NAK 패킷을 전달받는 event를 기다리는 상태로 돌아간다. 

 

⑤ TCP가 IP로부터 패킷을 전달받고, 그 패킷이 notcorrupt이고 ACK 응답이라면, 해당 통신이 종료되고

⑥ 다음 통신(sequence number가 1인 패킷)을 기다리는 상태가 된다.   

<receiver> 

 

① TCP가 IP로부터 sequence number가 0인 패킷을 전달받는 event를 기다리는 상태이다. 

 

② TCP가 IP로부터 패킷을 전달받고, 그 패킷이 notcorrupt하며 sequence number가 0이면 패킷으로부터 data(message)를 추출하고, Process로 data를 전송한다. 그리고 ACK 응답과 chksum으로부터 패킷을 생성하여 IP에게 전달한다.

 

③ TCP가 IP로부터 sequence number가 1인 ACK 패킷/NAK 패킷을 전달받는 event를 기다리는 상태가 된다.

 

TCP가 IP로부터 패킷을 전달받았을 때,  ⓐ 그 패킷이 corrupt하면, NAK 응답과 chksum으로부터 패킷을 생성하여 IP에게 전달한다. 그리고 IP로부터 sequence number가 1인 패킷을 전달받는 event를 기다리는 상태로 돌아간다. 

 

TCP가 IP로부터 패킷을 전달받았을 때, ⓑ 그 패킷이 notcorrupt이고 sequence number가 0이면, sender가 더이상 sequence number가 0인 패킷을 보내지 않도록 ACK 응답과 chksum으로부터 패킷을 생성하여 IP에게 전달한다.

그리고 TCP가 IP로부터 sequence number가 1인 ACK 패킷/NAK 패킷을 전달받는 event를 기다리는 상태로 돌아간다.

 

<시나리오>

 


# rdt 2.2 : NAK가 없는 rdt

<sender> 

 

TCP가 Process로부터 sequence number가 0인 패킷을 전달받는 event를 기다리는 상태이다.

 

 TCP가 Process로부터 0번 패킷을 전달받는 event가 발생했을 때, 다음과 같은 action을 취한다.

- sequence number 0, data, checksum으로부터 IP에 전송할 패킷을 생성한다.

- 생성한 패킷을 IP로 보낸다.

 

TCP가 IP로부터 sequence number가 0인 ACK 패킷을 전달받는 event를 기다리는 상태이다.

 

TCP가 IP로부터 패킷을 전달받았을 때, 그 패킷이 corrupt하거나 1번 패킷에 대한 ACK 응답이라면,

IP로 0번 패킷을 재전송한다.

 

TCP가 IP로부터 패킷을 전달받았을 때, 그 패킷이 not corrupt하고 0번 패킷에 대한 ACK 응답이라면, 해당 통신이 성공적으로 이루어진 것으로 다음 통신에 대한 대기 상태가 된다.

 

<receiver> 

 

ⓐ TCP가 IP로부터 sequence number가 1인 패킷을 전달받는 event를 기다리는 상태이다. 

ⓑ TCP가 IP로부터 패킷을 전달받았을 때, 그 패킷이 not corrupt하며 sequence number가 1이라면, 다음과 같은 action을 취한다.

- 해당 패킷에서 data(message)를 추출하고, 

- Process로 data를 전송한다.

- 1번 패킷에 대한 ACK 응답과 chksum으로부터 패킷을 생성하고,

- IP에게 전달한다.

 

TCP가 IP로부터 패킷을 전달받았을 때, 그 패킷이 corrupt하거나 1 sequence number가 1인 패킷이라면, 

IP로 패킷을 전달한다. 그리고 sequence number가 0인 패킷을 기다리는 상태가 된다. 

* 오잉 ACK1도 아니고 무슨 패킷을 전달한다는 거지? 의문의문 

 


# rdt 3.0 : 하위 채널에 packet loss가 발생할 수 있는 경우