본문 바로가기

교육/Netwrok

Day 59 (TCP_1)

반응형

<목차>

1. TCP

2. FSM

3. rdt1.0

4. rdt2.0

5. rdt 2.1


1. TCP

TCP의 역할은 Transport layer에서의 신뢰적 Data transfer을 하기 위한 protocol(대응절차문서)를 의미한다.

(* event  : 대기중인 상태에서 영향을 받는 것, action : event가 발생했을때 수행하는 작업)

(좌) TCP의 입장에서는 Application layer에 대해 신뢰적인 채널이다. (우) TCP의 입장에서는 하부 채널에 대해 비 신뢰적인 채널이라고 판단한다.

rdt_send()는 application에서 보내는 message이다. tcp에서 message를 받는 event가 발생한다. tcp에서는 message를 segment로 변환한다. udt_send()는 TCP에서의 segment를 IP로 전송하는 action이다.

rdt_rev()는 IP에서 보내는 segment를  TCP가 수신 하는 event가 발생한다. tcp에서는 segment에서 message를 추출한다. deliver_data()는 tcp에서 message를 application에 보내는 action이다.

TCP입장에서 보면 rdt_send()는 신뢰적인 영역이고,  udt_send()는 비 신뢰적인 영역이다. rdt_rev()는 신뢰적인 영역으로 구분 되는데 거의 모든 통신은 블라인드 통신이기 때문에 수신하는 segment가 손상이 있는지 등에 대한 정보를 event가 발생한 시점에서는 알 수 없기 때문이다.

 

 

2. FSM

FSM(Finite state machine;유한상태기계)는 기계식 시스템 절차에 대한 추상적인 표현방식이다.

복잡해지는 하위채널을 고려하여 신뢰적인 data전송 protocol의 송신자 측면과 수신자 측면으로 전개하고, 단 방향 전송만을 고려한다. 하지만, 제어 패킷은 양방향 전송이 필요하다.

화살표는 다음 상태로 넘어가는 방향을 의미한다.

event와 action은 묶어서 사용한다. event는 선 위에 action은 선 아래에 적는다.

 

 

 

3. rdt 1.0

 - rdt 1.0는 하위 채널이 신뢰적인 경우에 TCP에서 일어나는 절차에 대한 내용이다.

<가정>

- 패킷의 깨짐이 발생하지 않는다.
- 패킷의 손실이 일어나지 않는다.
- 패킷의 순서가 변하지 않는다.

 

 - FSM

Sender Receiver

1. Application이 data를 주는 것을 대기한다.
2. rdt_send(data) : Application으로 부터 data를 받는 event가 발생한다.
3. packet = make_pkt(data) : data를 packet으로 변환하고,
udt_send(packet) : 하위 채널에 packet을 송신하는 action을 한다. 
4. 다시 Application이 data를 주는 것을 대기한다.

1. 하위 채널이 packet을 주는 것을 대기한다.
2. rdt_rcv(packet) : 하위 채널로 부터 packet을 받는 event가 발생한다.
3. extract (packet, data) : packet으로 부터 data를 추출하고,
deliver_data(data) : Application으로 data를 송신하는 action을 한다.
4.  다시 하위 채널이 packet을 주는 것을 대기한다.

 

 

 

4. rdt 2.0

<가정>
- 패킷의 손실이 일어나지 않는다.
- 패킷의 순서가 변하지 않는다.
rdt 1.0에 비해 rdt 2.0가 부가적으로 필요한 protocol
- error검출
- feedback : 제어 message (acknowledgement : ACK / negative acknowledgement : NAK)
- 재전송

 

Sender Receiver

1. Application이 data를 주는 것을 대기한다.
2. rdt_send(data) : Application으로 부터 data를 받는 event가 발생한다.
3. sndpkt = make_pkt(data,checksum) : data에 checksum을 추가하여 packet으로 변환하고,
udt_send(sndpkt) : 하위 채널에 packet을 송신하는 action을 한다. 
4. Receiver로 부터 ACK 또는 NAK가 오는 것을 대기한다.
5. rdt_rcv(rcvpkt)&&inNAK(rcvpkt) : Receiver로 부터 NAK를 받는 event가 발생한다.
6-1. udt_send(sndpkt) : 다시 하위 채널에 packet을 송신하는 action을 한다.
6-2. 4의 상태로 돌아간다.
7. rdt_rcv(rcvpkt)&&isACK(rcvpkt) : Receiver로 부터 ACK를 받는 event가 발생한다.
8. 다시 Application이 data를 주는 것을 대기한다.

1. 하위 채널이 packet을 주는 것을 대기한다.
2. rdt_rcv(rcvpkt)&&corrupt(rcvpkt) : 하위 채널로 부터 받은 패킷(rcvpkt)이 손상되었는지(corrupt)를 검사한다. corrupt상태이다.
3. udt_send(NAK) : Sender에게 NAK를 송신하는 action을 한다.
4. 1의 상태로 돌아간다.
5-1. rdt_rcv(rcvpkt)&&notcorrupt(rcvpkt) : 받은 패킷(rcvpkt)이 손상되었는지(currupt)를 검사한다. not corrupt상태이다.
5-2. extract (rcvpkt, data) : packet으로 부터 data를 추출하고,
deliver_data(data) : Application으로 data를 송신하고,
udt_send(ACK) : Sender에게 ACK를 송신하는 action을 한다.
6. 다시 하위 채널이 packet을 주는 것을 대기한다.

Sender : 5, 6-1, 6-2 : 패킷이 손상된 경우 / 7 : 패킷이 정상적으로 전송된 경우
Receiver : 2, 3 : 패킷이 손상된 경우 / 5-1, 5-2 : 패킷을 정상적으로 수신한 경우
<결함>
ACK / NAK가 손상되는 경우 블라인드 통신이기 때문에 Sender에서는 알 수 없다.
이때 Sender에서의 처리방식은 1. 제대로된 ACK 또는 NAK가 올때까지 기다린다. 2. 손상된 ACK 혹은 NAK를 전부 NAK로 가정한다.
1의 경우에서는 서로의 상태를 확인할 수 없기 때문에 무한대로 기다려 통신이 이루어 지지 않는다.
2의 경우에서는 패킷을 재전송 하게 되는데 만약 Receiver가 ACK를 받은 경우 패킷이 중복되는 상황이 발생한다.

Q? NAK / ACK 어떤 방식으로 구분? 패킷처럼 구성? - 상태 변화에 대한 내용 A!

 

 

 

5. rdt 2.1

stop&wait방식을 이용해 rdt 2.0의 문제점을 개선한다. stop&wait방식은 Sender가 packet하나를 송신 한 후 receiver로 부터 응답이 올때까지 대기하는 것이다. 또한 패킷에 Sequence #를 이용해 Receiver에서 수신된 패킷과의 중복여부를 확인한다.

(좌) Sender   (우) Receiver

대칭구조를 이루는 이유는 Sequence #에 따라 나누어 지는 것이다. Sequence #만 다르고 절차는 같다. Sequence #는 값에 의미는 없지만 순서에는 의미가 있다.

 

(절차 : Sequence #가 0인 경우)

Sender Receiver

1. Application이 data를 0번 packet으로 보내기 위해 대기한다.
2. rdt_send(data) : Application으로 부터 data를 받는 event가 발생한다.
3. sndpkt = make_pkt(0, data,checksum) : data에 Sequence #인 0과 checksum을 추가하여 packet으로 변환하고,
udt_send(sndpkt) : 하위 채널에 packet을 송신하는 action을 한다. 
4. 0번 packet에 대한 Receiver의 응답을 기다린다.
5-1. rdt_rcv(rcvpkt)&&(corrupt(rcvpkt)||isNAK(rcvpkt)) : Receiver로 부터 rcvpkt가 손상되거나 NAK라는 event가 발생한다.
5-2. udt_send(sndpkt) : 하위 채널에 packet을 재송신하는 action을 한다. 
5-3. 4를 수행한다.
6. rdt_rcv(rcvpkt)&&notcorrupt(rcvpkt)&&isACK(rcvpkt) : Receiver로 부터 rcvpkt가 손상되지 않고 ACK를 받는 event가 발생한다.
7. Application이 data를 1번 packet으로 보내기 위해 대기한다.
8. 1부터의 과정을 Sequence #가 1로 변경되어 수행한다.

1. 하위 채널이 Sequence #가 0인 packet을 주는 것을 대기한다.
2. rdt_rcv(rcvpkt)&&notcorrupt(rcvpkt)&&has_seq0(rcvpkt) : 하위 채널로 부터 손상되지 않고 Sequence #가 0인 packet을 받는 event가 발생한다.
3. extract (rcvpkt, data) : packet으로 부터 data를 추출하고,
deliver_data(data) : Application으로 data를 송신하고,
sndpkt = make_pkt(ACK,checksum) : ACK에 checksum을 추가하여 packet으로 변환하고,
udt_send(sndpkt) : Sender에 packet을 송신하는 action을 한다.
4. 하위 채널이 Sequence #가 1 packet을 주는 것을 대기한다.
5-1. rdt_rcv(rcvpkt)&&corrupt(rcvpkt) : 하위 채널로 부터 받은 패킷(rcvpkt)이 손상되었는지(corrupt)를 검사한다. corrupt상태이다.
5-2. udt_send(NAK) : Sender에게 NAK를 송신하는 action을 한다.
5-3. 4를 수행한다.
6-1. rdt_rcv(rcvpkt)&&notcorrupt(rcvpkt)&&has_seq0(rcvpkt) : 하위 채널로 부터 손상되지 않고 Sequence #가 0인 packet을 받는 event가 발생한다.
6-2. sndpkt = make_pkt(ACK,checksum) : ACK에 checksum을 추가하여 packet으로 변환하고,
udt_send(sndpkt) : Sender에 packet을 송신하는 action을 한다.
6-3. 4를 수행한다.
7. 1부터의 과정을 수행한다.

Sender : 5-1, 5-2 : 패킷이 손상되거나 Receiver의 응답이 손상된 경우 / 6 : 패킷이 정상적으로 수신했다는 응답을 받은 경우  
Receiver : 2, 3 : 패킷을 정상적으로 수신한 경우 / 5-1, 5-2, 5-3 : 패킷이 손상된 경우 / 6-1, 6-2 : 중복된 패킷을 수신한 경우

( 5-1, 5-2, 5-3과 6-1, 6-2의 순서는 5->6도 6->5도 가능하다.)

반응형

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

Day 60 (TCP_2)  (0) 2020.02.13
Day 59 (Network Layer 구조)  (0) 2020.02.12
Day 58 (Wireshark)  (0) 2020.02.11
Day 58 (패킷)  (0) 2020.02.11
Day 58 (Transport Layer)  (0) 2020.02.11