본문 바로가기
학교 수업/컴퓨터 네트워크

Transport layor - 1.3 개요 // 컴퓨터 네트워크

by Godgil 2020. 5. 6.

자 여기서부터는 잠깐 Reliable data를 어떻게 전송할지 한번 볼거야.

 

Transport layor에서는 이걸 rdt protocol로 해결해

 

이게 막 rdt 1.0부터시작해서 2.0 2.1 2.2 ...3.0 하면서 버전 업 하면서 지금까지 왔대.

 

근데 깊게 들어가면 머리아프니까 맨 처음 시작인 1.0과 3.0만 살펴볼거야.

 

맨 처음은 당연히 RDT 1.0이야.

아 RDT는 Reliable Data Transfer의 약자야

 

1.0에서는 한가지 상황을 가정하고 가는데 

바로 네트워크 환경에서 모든 것이 완벽하게 처리 된다고 가정해.

 

이게 무슨말이냐면, 보낸 데이터가 망가지지도 않고, 잃어버리지도 않는 경우야.

그러면 Transport layor에서는 할게 아~무것도 없어 그냥 보내고 받기만 하면 되는거야

 

보내는 쪽 Transport layor에서는 App에서 데이터를 보내달라고 요청이 올 때까지 기다리고 있다가,

요청이 오면 데이터를 세그먼트로 쪼개고, 이걸 네트워크 레이어로 보내기만 하면 되는거지.

그리고 또 보내달라고 요청이 올 때 까지 기다리고를 반복하는거야

 

받는 쪽도 마찬가지야. network layor에서 뭔가 올 때까지 기다리고 있다가, 데이터가 왔대, 그러면 조각 나 있는

세그먼트들을 합쳐서 app한테 주기만 하면 되는거지 

 

자 이걸 좀 그림으로 이해하기위해서 FSM이라는 유한 상태 머신을 살펴볼거야

먼저 이걸 보는 방법은, 동그라미는 현재의 상태야 그리고 화살표를 통해 다음 상태로 넘어간다는 말이고

화살표에 줄이 그어져있지? 줄 위는 Event야. 이 이벤트를 받으면 줄 아래의 행동을 취한다는거야.

 

근데 과연 실제로 이렇게 움직일까? 

당연히 안그렇다는거지. 손실이 일어 날 수 있고, 변형이 될 수도 있는거야.

그렇게 2.0, 2.1, 2.2 막 진화해 왔어

그러다가 3.0까지 발전해 온거지

 

발전해온 과정들을 대충 설명해 볼게

 

데이터가 변형이 되니까 이걸 막아야해, 그래서 뭘 도입했냐면

Check Sum 이라는 개념을 도입했어. 

UDP에서 사용하는것과 동일한건데, 데이터를 보낼 때, data와 check sum을 함께 보내는거야

만약 체크섬이 보내는쪽과 받는쪽이 다르다면 망가졌다고 판단하고, 재전송을 요청하는거지

 

근데 잘 생각해보면, 재전송을 요청해야하는데, 보내는 쪽 입장에서 그냥 막 재전송을 할까?

당연히 아니지, 받는 쪽에서 피드백을 해 줘야해, 난 이걸 잘 받았다, 못받았다에 해당하는 응답을 해 줘야

보내는쪽에서 다시 보내 줄 거니까

그래서 나온게 ACK와 NAK라는 개념이야.

 

ACK는 잘받았다는거에 대한 피드백이고, NAK는 망가졌다는거에 대한 피드백이야.

 

자자.. 그럼 또 여기서 의문이 하나 생길거야

아니 그러면 ACK와 NAK은 안망가져?

 

당연히 망가질 수 있지. 그래서 이걸 또 확인하려고 나온 게 순서번호라는 개념이야.

Sequence number라고 하는데, 이게 내가 받은 어떤 세그먼트에 대한 ACK인지, NAK인지 확인 하려는거야

 

자 근데 문제는, 보내는 쪽에서는 ACK가 오기 전까지는 보낸 데이터가 잘 갔는지 모른단 말이지

또, 운이 나쁜 경우에는 받는 쪽에서 ACK를 보냈는데, 뭐 어떻게 네트워크 환경이 이상해서

늦게 올 수도 있는거고, 없어질 수도 있는거야. 

그러면 마냥 기다리고 있지는 않을거 아냐.

 

그렇게해서 나온게 Timer에 대한 개념이야. 합리적인 시간만큼 기다렸다가, ACK가 오지 않으면

그냥 자체적으로 재전송을 하는거지.

 

아. 하나 빼먹었네

마지막으로 아까 잘 받았나 못받았나에 대한 피드백으로 ACK, NAK를 쓴다 그랬지?

근데 이게 생각해보면 NAK는 사용할 필요가 없는거야, 어차피 재전송을 해야 할 상황이고

타이머가 있으니까 자동으로 재전송해주는데, 중복된 일을 하는거지

그래서 그냥 잘 받았을때 ACK를 주는거로 합의를 했어.

 

위에 내가 막 길게 쓴게

1.0과 3.0의 차이야.

 

3.0의 FSM을 한번 볼까?

먼저 보내는 쪽 입장이야.

막 복잡해도 이게 하나하나 살펴보면 되게 쉬워

막 설명을 다 해놓으면 보기도 힘들고 읽히지도 않을테니 생략을 할게

이런 과정들로 이루어진다고 생각하면 될거 같아.

 

이건 받는 쪽 입장이야.

막 코드들이 어려워보이지만 컴공생이라면 읽어보면 다 이해할거야

 

 

댓글