신뢰적 Data transfer
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가 발생할 수 있는 경우