더북(TheBook)

예를 들어 스트림을 패킷(P1, P2, P3, P4, P5) 5개로 나누어서 보냅니다. P3이 유실되면 수신 측에서는 P1, P2, P4, P5를 받습니다. 그리고 TCP 소켓을 가진 프로세스는 P1, P2까지 조립된 데이터 스트림을 받습니다. P4, P5는 이미 받았지만 P3이 없으므로 조립하지 못합니다.

한편 송신 측에서는 P3에 대한 ack를 기다렸지만, 오지 않으므로 P3을 다시 보냅니다. P3이 수신 측에 도착하면, 수신 측은 비로소 P3, P4, P5를 조립해서 여러분 프로세스의 TCP 소켓이 나머지 스트림을 받게 됩니다. 결국 P3의 재전송 시간만큼 지연 시간이 발생합니다.

이러한 이유 때문에 패킷 유실이 발생하면 TCP와 UDP에 다음 차이가 발생합니다.

• UDP에서는 데이터그램이 유실됩니다.

• TCP에서는 중간에 지연 시간이 발생합니다.

이 때문에 평균 레이턴시도 차이가 납니다.

• UDP의 레이턴시 = 네트워크 기기의 레이턴시

• TCP의 레이턴시 = 네트워크 기기의 레이턴시 + (100% - 패킷 유실률) * 재전송 대기 시간

그러나 TCP의 레이턴시는 네트워크 게임에서 더 불쾌하게 느껴집니다. 네트워크가 아주 나쁘지 않는 한 패킷 유실률은 20% 이하이지만, 재전송 대기 시간은 수백 밀리초 수준입니다. TCP의 체감 레이턴시는 높은 편차 때문에 더 불쾌함을 줍니다.

따라서 UDP는 주로 레이턴시가 민감하거나 패킷 유실이 있어도 괜찮은 곳에서 주로 사용합니다. 예를 들어 캐릭터 이동이나 기관총 난사, 음성이나 화상 데이터 전송에는 UDP를 많이 사용합니다. 대전 격투 게임이나 실시간 전략 시뮬레이션 게임(RTS)에서도 UDP를 사용하기도 합니다. 그 외의 모든 경우에서는 TCP를 사용합니다.

네트워크 게임 개발에서 거의 모든 메시지 종류에는 TCP를 사용합니다. 앞서 언급했듯이 캐릭터 이동 같은 몇몇 상황에서만 UDP를 사용합니다. 그러나 실제 통신량의 대부분은 캐릭터 이동 같은 UDP가 차지합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.