tcp 와 udp
By SeukWon Kang
goguelike2는 서버 클라이언트간 패킷전송을 초당 2 번, 즉 2 frame / sec 로 하고 있습니다.
사용자 행동(입력)은 각 frame 마다 서버로 전송되고
서버에서는 각 frame 별로 사용자 액션을 실행 결과를 돌려주는 동시에 그 결과로 변화된 field 상황을 viewport로 만들어 각 클라이언트에 전송합니다.
처음에는 초당 3번을 하도록 했었는데
local 이 아닌 wifi로 연결된 서버와 클라이언트에서 테스트라 했더니
서버 - 클라이언트간 전송 latency가 들쑥날쑥해서 클라이언트가 처리하기가 애매 했습니다.
frame jitter(?) 가 100% 가 넘는 경우가 생기더군요.
( 즉 클라이언트가 보기에 서버가 주는 viewport frame이 일정하게 330 ms 마다 오는 것이아니고 어떤 경우는 660ms 지나서 오는 경우가 생기는 겁니다. )
이게 서버 / 클라이언트 문제가 아닌게 wire lan으로 연결하면
이 jitter(프레임 도착 간격 오차) 가 5%를 넘지 않습니다.
wifi로 연결하며 -50% 가 됬다가 +80%가 된다가 난리가 나는 거지요.
일단은 초당 2번으로 줄여서 jitter문제를 완화하기는 했읍니다만
그래도 30% 정도 까지 오락 가락 하는 것은 어쩔수 없었습니다.
결국 오늘 TCP로 되어 있는 server - client 연결을
UDP로 바꿔 볼까 하는 생각으로 UDP 테스터를 만들어 봤습니다.
일단 echo 서버를 만들고 기존 goguelike2 패킷을 클라이언트에서 보내서 round trip time을 재보니
wifi에서 3ms 이하로 “일정하게” 잡히는 군요.
그리고 throughput test를 해봤는데
서버 처리 패킷 수와 클라이언트 패킷 처리 량(의 합 - 3개 클라이언트를 걸었으니 ) 이 다른 겁니다.
잠시 당황 했는데 생각해보니 UDP는 패킷 전달을 보장하지 않는 거란걸 떠 올렸습니다.
일단 UDP로 바꾸는 작업을 계속 하기는 할 생각입니다만
UDP의 여러 문제들을 성공적으로 해결할 수 있는 packet 처리 를 구현 할 수 있을지는 계속 고민해봐야 할 것 같습니다.
참고로 latency는 아주 만족스러운데 throughput은 생각보다 별로 안나오는 것 같습니다.
초당 10만 패킷을 못 넘기네요.