В простой реализации всё просто. Сорри за тавтологию, но это реально так. Клиент посылает свою позицию серверу (абсолютные координаты) сразу послед изменения. Сервер посылает эти координаты остальным.
А вот когда появится шанс столкновения (к примеру) и это нужно будет обрабатывать, либо игроки вообще научаться стрелять друг в друга (шутер), вот здесь начнутся проблемы. Проблемы будут заметны при большом пинге. И ответ здесь уже не простой. Придется чем-то жертвовать - точностью, либо возможностью читерить.
Также есть всякие клиентские оптимизации, когда пакеты приходят с разной задержкой, но движение объекта при этом выглядит плавно. Красота тоже требует жертв.
P.S. tcp не советую. Если данных мало (т.е. 4 игрока и 0 других объектов), то без разницы. Но на большом трафике даже 0.5% потерь пакетов приведет к лагам. Так что если планируете расти, лучше сразу выбрать udp (хотя вторым соединением по tcp можно административные задачи решать - поиск игроков, создание сессии и т.д.)
P.P.S.
Здесь неплохо иллюстрируется проблема синхронизации.