2009년 10월 8일 목요일

[TCP] 신뢰적인 전송 3 : Ack number

이전 포스트를 통해 Sequence Number가 송신자의 입장에서 오류가 있거나 변형된 Ack 혹은 Nak을 받았을 때, 오류로부터 회복하기 위한 방법으로 재전송을 쓸 수 있도록 해주고, 그 때 수신자로 하여금 송신자가 보낸 패킷이 자신이 이미 가지고 있는 패킷이 다시 재전송된 것인지, 아니면 정말 새로운 패킷인지 구분할 수 있게 해준다는 것을 다루었다.

 

사실 재전송은 송신자의 입장에서 봤을 때, 만병통치약과 같다. 내가 의사전달을 하려고 하는데 상대방이 못알아듣는다면, 알아들을때까지 다시 얘기하면 되는 것이다. 하지만 좀 더 깊이 생각해보면 재전송이라는 만병통치약을 무작정 아무 때나 사용할 수 없다는 것을 알 수 있다.

 

우선 생각해봐야 할 사항은 재전송을 해야할 때는 언제인가? 라는 것이다.

Ack나 Nak이 정확하게 도착을 했다면 좋지만, 설령 오류가 생겼더라 하더라도 송신자에게 도착만 한다면, 송신자는 재전송 여부를 쉽게 결정할 수 있다. 그러나 실제 우리가 사용하는 네트웍에서는 종종 패킷이 아주 많이 지체가 되거나 아예 손실이 되어 도착하지 못하는 경우가 있을 수 있다. 그러면 송신자는 그 점에 대한 판단을 무엇으로 해야하는가?

쉽게 생각할 수 있듯이 그 점에 대한 답은 바로 타이머다. 일정 시간을 기다려보고 그 시간이 지났는데도, 응답이 오지 않는다면 다시 재전송하면 되는 것이다. 그렇다면 이번에는 그 일정 시간은 어떻게 정해야 하는가라는 질문이 생긴다. 사실 이 기준은 명확하지가 않다. 송신자는 일단 내보낸 패킷이 어떤 경로를 통해 목적지까지 갈지 전혀 알 수가 없기 때문에 정상적인 왕복 시간을 알 수 있는 방법이 없다. 그럼에도 불구하고, 송신자는 이 타이머의 타임 아웃 시간을 "현명하게" 결정해야 하는데, 이 점을 해결하기 위한 방법은 추후 Round Trip Time에 대해 다룰 때 설명할 것이다.

 

재전송과 관련하여 생각해봐야 할 두번 째 문제는 재전송이 만병통치약인 동시에 골칫거리라는 점이다.

송신자의 입장에서, 송신 경로는 트래픽 상황이 좋은데, 수신 경로는 과도한 트래픽에 의해 정체되고 있다고 가정을 해보자. 이러한 상황에서 송신자가 A라는 패킷을 수신자에게 보냈다면, 송신 경로의 상태는 좋기 때문에, 수신자는 이 패킷을 잘 수신했을 것이다. 그러나 수신 경로는 상황이 안좋기 때문에 수신자가 보낸 B라는 Ack는 송신자의 타임아웃이 지날만큼 오랜 시간동안 네트웍에서 지연된 후에 송신자에게 도착할 것이다.

이러한 상황은 정상적인 Ack가 송신자에게 도착했음에도 불구하고 재전송을 일으키게 하고 수신자 입장에서는 이미 받은 패킷을 또 받는 상황을 발생하게 한다. 이미 이전 포스트에서 언급했듯이 Sequence Number가 있기 때문에 수신자 입장에서 패킷을 수용할 것인지의 여부를 결정하는 것은 어렵지 않다. 하지만 수신자가 다시 이 중복된 패킷에 대해 Ack를 보낼 때 송신자는 이 Ack가 가장 최근에 전송된 패킷에 대한 응답인지, 중복된 패킷에 대한 응답인지 알 수 없는 문제가 생긴다.  

 이 문제를 해결할 수 있는 것이 바로 Ack Number이다. Ack number는 송신자로 하여금 자신이 받은 Ack 혹은 Nak이 자신이 보낸 패킷 중 어느 패킷에 대한 응답인지를 알 수 있게 해주면서, 그와 동시에 수신자가 어떤 패킷까지 잘 받고 있는지에 대한 상황 정보를 알려준다.

 

즉 신뢰적인 전송의 핵심은 바로 재전송이며, 그 재전송을 언제, 어떻게 할 것인지에 대한 정보를 Ack bit와 Sequence number, Ack Number를 통해 결정한다고 생각하면 되겠다. 물론 그와 관련된 timer의 역할 역시 중요하지만 그 점은 추후에 다시 다루도록 하겠다.

 

Reference : Computer Networking (A top down approach featuring the internet), James F. Kurose, Keith W. Ross 저.


댓글 없음:

댓글 쓰기