눈팅하는 게임개발자 블로그
패킷 유실시 UDP / TCP에서 발생하는 일 본문
www.gilbut.co.kr/book/view?bookcode=BN002400
해당 책의 내용 중 일부를 정리.
OSI 모델의 계층 1~3에서는 패킷 유실이 발생할 수 있다.
UDP의 경우
UDP에서는 패킷 유실이 발생하면 데이터그램 자체가 유실된다.
게다가 UDP 데이터그램의 크기가 클수록 유실될 확률도 높다.
IP 패킷은 보통 1300바이트인데, 1만 바이트의 데이터그램을 UDP로 전송하면
운영체제는 이를 대략 1300바이트 정도 크기로 나누어서 보낸다.(IP 패킷 헤더 등이 있으므로 실제로는 조금의 차이가 있다.)
이 경우 대략 8개 정도의 패킷으로 나뉘어져 IP 패킷 8개가 수신측으로 전송된다.
이 중 하나라도 유실되면 수신 측은 8개의 패킷을 모두 받지 못한다.
따라서 IP 패킷 8개로 구성된 1만 바이트짜리 데이터그램 1개가 최종 유실되게 된다.
TCP의 경우
TCP에서는 패킷 유실이 발생하면 유실된 패킷에 대한 ack(패킷을 받았다는 확인메시지)가 도착하지 않는다.
송신 측에서는 ack가 올 때까지 기다리지만, ack가 결국 오지 않으면 다시 패킷을 보내게 된다.
한편 수신 측에서는 도착하지 않은 패킷이 있으므로 다른 패킷이 도착하더라도 데이터 스트림을 조립하지 못한다.
예를 들어 스트림을 5개의 패킷(P1 ~ P5)으로 나누어서 보낸다면
P3이 유실될 경우 수신 측에서는 P1, 2, 4, 5를 받는다.
그리고 TCP 소켓을 가진 프로세스는 P1, P2까지 조립된 데이터 스트림을 받게 되고
P4, P5는 이미 받았지만 P3이 없으므로 조립하지 못한다.
한편 송신 측에서는 P3에 대한 ack를 기다리지만 오지 않으므로 P3를 다시 보낸다.
P3이 수신 측에 도착하면 수신 측은 비로소 P3, P4, P5를 조립해서
나머지 스트림을 받게 된다.
결국 P3의 재전송 시간만큼 지연 시간이 발생하게 된다.
결국에는
이러한 이유 때문에 패킷 유실이 발생하면
UDP에서는 데이터그램이 유실되며.
TCP에서는 중간에 지연 시간(재전송 시간)이 발생하게 된다.
이 때문에 평균 레이턴시도 차이가 나게 된다.
UDP의 레이턴시 = 네트워크 기기의 레이턴시
TCP의 레이턴시 = 네트워크 기기의 레이턴시 + (100% - 패킷 유실률) * 재전송 대기 시간
그러나 네트워크 게임에서 TCP의 레이턴시는 게이머에게 더 불쾌한 느낌을 주고는 한다.
네트워크가 아주 나쁘지 않은 이상 패킷 유실률은 20% 이하지만
재전송 대기시간은 수백 밀리초 수준이 된다.
TCP의 체감 레이턴시는 이와같은 높은 편차 때문에 더 큰 불쾌감이 생긴다.
따라서 레이턴시가 민감하거나 패킷 유실이 있어도 괜찮은 곳에서는 주로 UDP를 사용한다.
예를 들어 캐릭터 이동, 기관총 난사, 음성이나 화상 데이터 전송에는 UDP를 많이 사용한다.
대전격투 게임이나 실시간 전략 시뮬레이션 게임에도 UDP를 사용하기도 한다.
그 외의 모든 경우에는 TCP를 사용한다.
'공부한거 > 게임서버 프로그래밍' 카테고리의 다른 글
수직 확장, 수평 확장 (0) | 2020.11.03 |
---|---|
블로킹 소켓(송신, 수신) 버퍼 (0) | 2020.10.24 |
게임 메시지(데이터) 형식 (0) | 2020.10.22 |