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

Transport layor - 2.1 Pipelining, Go Back N, Selective Repeat

by Godgil 2020. 5. 7.

Rdt 3.0에서는 세그먼트 하나 보내고, 그에 대한 응답으로 ACK를 받고, 만약에 ACk가 오지 않으면 

타이머가 자동으로 오버되면서 재전송하고, 이런 매커니즘을 보였어

 

근데 이게 세그먼트가 한두개도 아닐텐데, 언제 보내고 받고하고 있어?

너무 비효울적이라는 생각 들지?

 

그래서 나온 개념이 Pipelining이야.

이건 뭐냐면, 그냥 ACK가 오지 않아도, 네트워크 상황이 허락하는 만큼 그냥 연달아서 보내고

그에 대한 ACK를 각각 받는거지

 

 

이 매커니즘에는 두 가지 방법이 있는데

그게 바로 Go Back N이랑, Selective Repeat 방법이야.

 

간단하게 차이점을 말하면, 보내는 쪽에서 재전송을 할 때, 묶음으로 보낼지 못받은것만 보낼지 하는거에 대한 차이야

 

둘 다 공통점은 윈도우가 허락하는 만큼 보내는거야.

자 여기서 윈도우는 뭐냐면, 내가 위에서 네트워크 상황이 허락하는 만큼 그냥 보낸다 그랬잖아

그러면 그 수치가 어떻게 알고리즘을 통해서 정해지겠지? 이것도 나중에 제어하는걸 배울텐데

일단은 보낼수 있는 크기를 윈도우라고 하자.

 

다시 한번 말하지만, 윈도우 크기가 지정되어 있는데, 그 크기만큼 한번에 보내는거야.

 

GO Back N은 

특징이 뭐냐면 Cumulative Ack이야. 해석하자면 축척된 ACK를 보낸다는거야.

무슨 말이냐면, 순서에 맞게 온 세그먼트 중에, 가장 큰 번호의 ACK를 보낸다는거지

만약에 1번 2번 3번 4번 5번을 보내는쪽에서 보냈는데, 4번이 손실이 되어서 못받았어.

그러면 5번을 받아도 3번에 대한 ACK를 보내는거야.

 

Go back N에서 ack 3의 의미는 3번까지 잘 받았다. 라는 의미가 되는거지.

 

자 그러면 5번까지 보낼 수 있으니까 윈도우의 크기가 5야.

보내는쪽에서도 타이머가 있어야겠지? ACK가 안올 수도있으니까.

이 타이머를 ACK를 아직 받지 못한 가장 오래된 패킷에 대해서 하나만 가지고있어.

이게 또 특징이야.

 

전부 다 쓸 필요가 없는거지. 어차피 윈도우 크기 안에서 보낸 것 중에

못받은게 있으면, 그 윈도우 크기만큼 어차피 재전송을 해야하는거니까.

 

그러니까 정리하자면

Go back N은 윈도우가 허락하는 만큼 보낼 수 있는데,

Cumulative Ack를 특징으로 가지고 있어서, 순서에 맞게 온 세그먼트 중에서 가장 큰 순서번호의 ACK를 보내는거고

만약 ACK3을 받았으면 "3번을 잘 받았다"가 아닌 "3번까지 잘 받았다"의 의미다.

또, 보내는쪽에서 타이머를 ACK를 받지 못한 가장 오래된 패킷에 대해서 하나만 가지고있고,

이 타이머가 오버되면 그 윈도우는 다시 재전송을 하는거다.

go back N 개요

 

아니 근데 생각해봐,

왜 전부 다 보내는거야, 못받은게 있으면 못받은것만 보내면 되는거 아냐?라고 생각 할 수 있지?

그래서 있는게

Selective repeat이라는 개념이야.

 

얘도 역시 윈도우가 허락하는 만큼 보낼거야. 근데 Go back N과의 차이점은

못받은 거에 대한 패킷만 재전송을 하는거야.

 

자 그러면 생각해보자.

보내는 쪽에서는 1번 2번 3번 4번 5번 이렇게 보낼거야.

근데 몇번 패킷이 손실이 될 지, 알 수가 없는거지 그래서 각각의 패킷들에 대해서

전부 타이머를 부착해 줘야해. 

 

받는 쪽에서도 생각해볼게,

만약에 여기서 4번이 안왔어, 1,2,3,5번은 도착했는데 4번이 안왔단말이야.

그러면 1,2,3번은 순서에 맞아서 조합해서 보낼수 있는데, 이게 5번은 4번이 올 때 까지 기다려야한단말이지,

그러면 5번을 저장할 공간이 필요하겠네? 그래서 Selective Repeat의 Receiver는 순서에 맞지 않는 패킷을 저장할

buffer가 필요해. 4번이 오기까지 기다렸다가 4번이 오면 조합을 해서 app한테 주는거야.

 

여기도 정리하자면 Selective Repeat은 수신된 패킷에 대해서 각각의 ACK를 보내는 것이고,

GO back N과는 다르게 ACK 5라는 의미는 5번 패킷을 잘 받았다 라는 의미다.

보내는 쪽 입장에서는 패킷을 따로 보내는 거니까, 각각의 패킷에 대한 타이머가 전부 존재 해야한다.

만약 타이머가 오버되면 오버된 패킷에 대해서만 재전송을 한다.

 

 

자 그럼, 마지막으로 이게 궁금할 수 있지

 

아니 그러면, 두개 이렇게 설명했는데 뭐가 더 좋다는거야?

 

이 두 방식은, 각각의 방식에서 이점이 있고 단점이 있어, 

그래서 개발자가 뭘 어떻게 사용할지 잘 판단해서 개발해야 해.

막 얘가 더 좋다 단정지어서 말할 수 없는 부분이야.

댓글