TCP는 신뢰성있는 통신을 제공한다고 알려져있다. 그렇다면 TCP를 사용하지 않으면 신뢰성 확보할 수 없다는 것이다. 왜 그럴까? transport밑으로 존재하는 계층들이 현실적으로 완벽하지 않기 때문이다. 어떤 기술이든 완벽한것은 없기 마련이다. 특히 router의 queue에서 90% 이상의 Loss가 발생한다.

 

그렇다면 신뢰성을 확보하기 위해서는 어떤것을 해주어야 할까?

 

packet error와 packet loss. 이 두가지에 대해 대처해주면 완벽한 신뢰성이 확보되었다고 할 수 있다. error와 loss를 해결하기 위해 어떤 기술적 원칙들이 사용되는지 확인해보자.

 

1. Packet error 대처

- error detection

ckecksum을 통해서 패킷에 에러가 있는지 없는지 확인을 해야 한다.

 

- feedback

만약 에러가 있다면 에러가 있는 데이터를 받았기 때문에 재전송을 요구하는 피드백을 보내고, 정상적인 패킷을 받았다면 잘 받았다는 피드백을 보낸다.

 

- retransmission

만약 에러가 있는 패킷을 받았다는 피드백을 받은 경우 sender는 동일 패킷을 재전송을 한다.

 

- sequence #

그런데 문제가 발생한다. 재전송되어서 온 패킷이 receiver입장에서는 재전송되어서 온것인지 아니면 sender 동일한 패킷을 보낸 것인지 판단할 수 없다. 이 문제를 해결하기 위해서 패킷을 특정할 수 있는 seq #를 사용하여 통신한다.

 

 

2. Packet loss 대처

- timer

만약 sender가 패킷을 보내고 receiver에게 도달하기도 전에 패킷이 유실되었다면 어떻게 될까. receiver는 자신에게 어떤 패킷도 오지 않았으므로 그저 침묵이 흐를 것이다. 이러한 경우에 대비하기 위해 timer를 사용한다. timer를 통해서 일정시간동안 feedback이 오지 않을 경우 패킷이 유실되었다고 판단하여 재전송을 한다.

 

- timer의 시간설정 문제

그렇다면 timer의 시간은 얼마로 설정해야 할까? 결론만 말하자면 정답은 없다. ‘적당히’ 설정해야 한다. 짧으면 무조건 좋을까? 만약 짧다면 네트워크 상황으로 인해 패킷이 약간 지연될 경우 오는 도중에 timer가 터져서 재전송이 진행될 수 있다. 정말로 패킷유실이었다면 빠른 대처가 되는 것이지만 그렇지 않을 경우에는 중복된 패킷으로 인해 네트워크 상황만 더 혼잡하게 만드는 가능성이 있다. 너무 길면 통신 자체가 원할하지 않을 수 있겠다.

+ Recent posts