Pues mira, esto mas o menos funciona de esta manera:
TCP/IP: En verdad son la unión de dos protocolos de red, el TCP que gestiona las diferentes vias o caminos de la información dentro de un mismo adaptador de red hacia todos los programas mediante PUERTOS.
Y el IP, que basicamente encapsula todo el paquete de información de ese adaptador de red en un paquete mas grande que sirve para identificarte como una ENTIDAD = IP concreta.
Entonces ya sabemos que el protocolo TCP/IP en verdad son dos, el TCP que es la capa que gestiona ( APLICACIONES <> ADAPTADOR_DE_RED ) y el otro que es el IP que gestiona todos estos paquetes en otra capa superior, donde se encapsula todo lo que hace el TCP en un paquete que lleva tu "firma" osea.. tu IP para identificarte en la red.
Independientemente de todo esto que es a bajo nivel y no interesa para nada.. Existe una alternativa a PROTCOLO TCP, recuerda que el TCP es el que utiliza "n" puertos para "n" aplicaciones, como por ejemplo:
Telnet - Puerto 23.
Ftp - Puerto 21.
Esto son claros ejemplos de conexiones TCP, pues el FTP por ejemplo sirve para descargar/cargar archivos, y necesitas usar un proto que tenga control de errores y verificación de paquetes corruptos.
Esto como es normal.. resta una prociosa velocidad a la red y a la aplicación.. pues necesitas utilizar una parte del ancho de banda para toda la gestion de errores. Pero es un proto muy seguro y fiable.
Por ejemplo, para tener la necesidad de utilizar el protocolo TCP, tu juego tendria que tener alguna caracteristica que requiera la verificación 100% exaustiva de errores en la información.
Este protocolo es BLOQUEANTE, lo cual seguro que se habla de ello muchas veces.. y suena hasta mistico.. pero es muy facil de entender...
Mira para utilizar TCP sobre IP, osea, lo que hace un MSN messenger al enviar files, un ftp.. una conexión de terminal remoto.. necesitas usar "n" puertos, y como ya he dicho, al tener TCP tienes verificación de errores, ya depende de la aplicación y lo integrada que este a bajo nivel con el proto y la lib de red, pero basicamente al usar TCP tienes que ser muy cuidadoso, y al enviar una información por la red hacia un "DESTINO CONCRETO" tienes que "BLOQUEAR" el socket que has utilizado... para que el programa no se vuelva loco e intente recivir inmediatamente la respuesta.. entonces, cuando tu interlocutor, te contesta que ya está preparado para enviar, "TU" has de desbloquear el socket.. y asi le dices a la lib de red, que la info viene "YA".
Como ves... es super engorroso de programar a bajo nivel con TCP... Es el proto que tiene una fiabilidad mas alta.. pero es un autentico calbario para un principiante meterle mano a esto directamente.
NO TE LO ACONSEJO BAJO NINGUNA CIRCUNSTANCIA QUE EMPIECES CON "TCP".
---------------------------------------
El otro sistema se llama UDP... este es la salvación para todos los que no vamos a hacer aplicaciones hyper complejas y seguras, es diseñado para otro tipo muy diferente de conexión que te detallo ahora mismo mira:
UDP: Conexión ASINCRONA, aunque pueda parecer muy raro esto... es muy facil y es "GENIAL" para programar juegos concretamente.
Las conexiones UDP bajo IP son muchisimo mas sencillas que las TCP de gestionar...
La IDEA o el CONCEPTO de porqué fue creado este sistema diferente es muy simple mira, por TCP dijimos que la conexión es ultra segura, con control de errores... necesitas bloquear sockets en muchisimos casos..
Vamos un autentico coñazo...
Con UDP esto es muy diferente, realmente no existe conexión.
SIP!, no te conectas a ningún sitio... y tu diras... como leches recibo y envio info??
Pues muy facil, este sistema se creó en su dia para todos los softwares que necesitas enviar GRAN CANTIDAD DE INFO POR LA RED, como es normal... un juego multijugador es un caso estupendo para esto.. pues cada decimas de segundo las variables cambiand e valor y necesitas de un sistema de STREAMING.
STREAMING trabajo de esta forma: El servidor simplemente pasa de los clientes... sencillamente y para que lo entiendas.. el server se pone a enviar información como un poseso... a toda leche... ignorando si te ha llegado a ti o no, es mas, se la suda... si no te llega te jod.. jejej

Este sistema es genial para juegos en red, pues lo bueno que tiene es que el server está enviando a todo trapo información sobre toda la estructura de variables que comparte.. independientemente de si te han lelgado, si te han llegado bien... si se han corrompido por el camino por culpa de una interferencia...
Entoces, este sistema puede parecer muy poco fiable, si, y es cierto, pero para enviar una información a mas de 10 destinos... directamente la lanza a la red.. encapsulada con su "IP" claro.. y los clientes son como los cazamoscas.. cuando ven un paquete de este server, simplemente lo procesan y sacan sus conclusiones.
Nunca jugaste a un juego en red multijugador "MASIVO" y viste a un personaje en un sitio y al segundo siguiente estava 10 metros mas atras? U D P tiene la culpa.
-----------------------------------------
Entonces para Gemix, UDP es genial, el server hace Streaming como si estuviera emitiendo una pelicula... o como si fuera un canal de radio online... y tu simplemente le mandas un pauqete diciendo OYE!!! que estoy aki!
Y se lo mandas si te da la gana.. sino ni hace falta.. simplemente te pones a capturar la informacion de ese servidor y ya estas online con el, si quieres comunicarte tu hacia el pues entonces lo normal es que le avises.
Como ves, TCP y UDP son diferentes protocolos de red, que gestionan la información de maneras muy distintas, una es con control CRC y la otra es asi a saco.
Cada una tiene sus pros y sus contras.
Pero está claro que Gemix va a rendir infinito mas con UDP... Porlomenos para el sistema compatible con Div2, ya despues si se mete a bajo nivel la implementación de la libreria de red pues genial tambien.

Y respondiendo a tu pregunta, NO, no tiene que ser un server dedicado y lo demas todo clientes, puedes hacer que el que crea la partida tambien entre a jugar como cliente, es mas, el motodo normal de hacerlo es este:
Arranco el juego, si existen partidas ya las listo e indico si quiero conectarme a alguna de ellas.
Si no existen partidas activas, la creo yo y entro como cliente.
Como ves, el mismo programa puede hacer de Server/cliente al mismo tiempo.
Todo el toston de antes iva por si quieres saber conceptos ya mas avanzados que no se suelen explicar así yanamente. Espero te aya aclarado algo mas el tema. Cualquier duda ya sabes tio
