본문 바로가기

교육/Netwrok

Day 60 (TCP_2)

반응형

<목차>

1. rdt 2.2

2. rdt 3.0

1) rdt 3.0 설명

2) rdt 3.0 시나리오


1. rdt 2.2

추가된 조건 추가된 프로토콜
전송 응답에서 NAK를 사용하지 않고 ACK만을 이용한다.

Receiver는 응답에 번호를 부여한다.
- 정상인 경우 해당 패킷 번호를 붙여 응답한다.
- 손상되거나 중복인 경우 마지막으로 정상적으로 수신한 패킷 번호를 붙여 응답한다.

Sender는 응답에 따라 패킷을 전송한다.

- 전송한 패킷 번호가 송신한 패킷의 번호인 경우 다음 패킷을 전송한다.

- 전송한 패킷 번호 이전에 송신한 패킷의 번호인 경우 해당 패킷을 재전송 한다.

rdt2.1과의 차이점은 NAK을 사용하지 않고 ACK만을 사용하는 것이다.

전송중 패킷이 깨진 것에 대한 응답은 직전에 받은 패킷이 정상적으로 수신되었다는 응답으로 대신한다.

이 방식을 ACK 누적 방식이라고 한다. 이 방식을 사용하면 sneder는 마지막 수신한 ACK의 sequence # 이전의 pkt은 모두 전달되었다는 것을 알게 된다.

Sender

Receiver

1. Application으로부터 data를 받는 것을 기다린다.

2. rdt_send(data) : Application으로부터 data를 받는 event가 발생하면,
sndpkt = make_pkt(0, data, checksum) : 0번 이라는 sequence #와 data, checksum을 이용해 패킷으로 만들고,
udt_send(sndpkt) : Receiver에 패킷을 송신하는 action을 한다.

3. Receiver로 부터 0번 ACK에 대한 수신이 정상적으로 이루어 졌다는 응답을 기다린다.

4. rdt_rcv(rcvpkt)&&(corrupt(rcvpkt)||isACK(rcvpkt,1)) : 수신한 응답이 손상되거나 1번 ACK라는 event가 발생하면,
udt_send(sndpkt) : Receiver에 패킷을 재송신하는 action을 한다.

4-1. 3을 재수행한다.

5rdt_rcv(rcvpkt)&&notcorrupt(rcvpkt)&&isACK(rcvpkt,0) : 수신한 응답이 정상 수신되었고, 0번 ACK라는 event가 발생하면,
∧ : 다음 상태로 넘어가는 action을 한다.

6. 다음 패킷을 전송하기위한 Application으로부터 data를 받는 것을 기다린다.

1. 하위 채널로 부터 1번 패킷이 전송되기를 가다린다.

2. rdt_rcv(rcvpkt)&&notcorrupt(rcvpkt)&&has_seq1(rcvpkt) : 손상되지 않고 1번 패킷이 수신되는 event가 발생하면, 
extract(rcvpkt,data) : 패킷으로 부터 data를 추출하고,
deliver_data(data) : Application으로 data를 전송하고,
sndpkt = mke_pkt(ACK1,chksum) : 1번 ACK를 수신했다는 정보와 오류검사를 위한 체크섬을 이용해 Sender로 보낼 응답패킷을 생성하고,
udt_send(sndpkt) : Sender로 1번 응답패킷을 송신하는 action을 한다.

3. 하위 채널로 부터 0번 패킷이 전송되기를 가다린다.

4. rdt_rcv(rcvpkt)&&(corrupt(rcvpkt)||has_seq1(rcvpkt)) : 전송한 패킷이 손상되었거나, 
udt_send(sndpkt) : Sender로 1번 응답패킷을 송신하는 action을 한다.

4-13을 재수행한다.

5. 하위 채널로 부터 1번 패킷이 전송되기를 가다린다.

(Sender는 0번 패킷부터 송신하고, Receiver는 1번 패킷 부터 수신한 상태라고 가정한다.)

 

2. rdt 3.0

1) rdt 3.0 설명

추가된 조건

추가된 프로토콜

하위 채널에서의 패킷 손실이 일어난다.

Sender는 응답에 대한 재전송 방식이 변경되었다.
- 패킷이 손상되거나 손실되었다는 응답이 와도 재전송을 하지 않는다.
- 합리적인 시간(RTT보다 조금 더 길다.)동안 패킷에 대한 정상응답이 도착하지 않은 경우에만 재전송 한다.

rdt 3.0은 하위 채널에서 패킷 손실이 일어나는 것을 가정한다. Sender는 손상이나 손실에 대해을 신경쓰지 않는다. Receiver에서의 중복처리나 패킷 손실에 대한 처리방식은 rdt 2.2의 방식을 그대로 사용한다.

Sender

Receiver

1. Application으로부터 data를 받는 것을 기다린다.

2. rdt_send(data) : Application으로부터 data를 받는 event가 발생하면,
sndpkt = make_pkt(0, data, checksum) : 0번 이라는 sequence #와 data, checksum을 이용해 패킷으로 만들고,
udt_send(sndpkt) : Receiver에 패킷을 송신하고,
start_timer : 시간을 측정하는 action을 한다.

3. Receiver로 부터 0번 ACK에 대한 수신이 정상적으로 이루어 졌다는 응답을 기다린다.

4. rdt_rcv(rcvpkt)&&(corrupt(rcvpkt)||isACK(rcvpkt,1)) : 수신한 응답이 손상되거나 1번 ACK라는 event가 발생해도
∧ : 3의 상태를 유지하는 action을 한다.

5. timeout : 합리적인 시간안에 0번 패킷에 대한 정상 응답이 도착하지 않는 event가 발생하면,
udt_send(sndpkt) : 0번 패킷을 재전송하고, 
start_timer : 시간을 측정하는 action을 한다.

5-1. 3을 재수행한다.

6rdt_rcv(rcvpkt)&&notcorrupt(rcvpkt)&&isACK(rcvpkt,0) : 수신한 응답이 정상 수신되었고, 0번 ACK라는 event가 발생하면,
stop_timer : 시간 측정을 멈추는
 action을 한다.

7. 다음 패킷을 전송하기위한 Application으로부터 data를 받는 것을 기다린다.

rdt 2.2의 처리 방식과 동일하다.

 

2) rdt 3.0 시나리오

(a) 패킷 손실 없이 통신이 이루어진다.

(b) 송신측에서 패킷1을 보내지만 수신측에서 패킷1의 수신에 대한 응답이 없기 때문에 패킷1을 재전송한다.

(c) 송신측에서 보낸 패킷1에 대해 수신측이 정상 수신하였다. 하지만 수신측의 보낸 응답이 손실되거나 손상되어 수신측에서 패킷1에 대한 응답을 받지 못한다. 송신측에서 패킷1을 재전송한다. 수신측은 중복 패킷이기 때문에 중복 패킷을 제거 하고 정상 수신에 대한 응답을 재전송한다.

(d) 송신측에서 보낸 패킷1에 대해 수신측이 정상 수신하였다. 수신측의 보낸 응답이 지연되어 합리적인 시간 안에 수신측은 응답을 받지 못한다. 송신측에서 패킷1을 재전송한다. 수신측에서 지연된 수신하고 다음 패킷을전송한다. 송신측에서는 패킷1이 중복 되기 때문에 중복 패킷을 삭제하고 패킷1에 대한 정상 응답을 전송한다. 수신측에서는 다음 패킷을 전송했기 때문에 다음 패킷에 대한 응답을 기다리고 있다. 수신측에서 패킷1의 응답을 수신해도 무시한다.

 

반응형

'교육 > Netwrok' 카테고리의 다른 글

Day 61 (TCP_3_1)  (0) 2020.02.14
Day 60 (Network Layer)  (0) 2020.02.13
Day 59 (Network Layer 구조)  (0) 2020.02.12
Day 59 (TCP_1)  (0) 2020.02.12
Day 58 (Wireshark)  (0) 2020.02.11