Comunicación servidor / cliente

Quien soy
Aina Martin
@ainamartin
Autor y referencias

[Esta página debería fusionarse en algún momento con la desincronización cliente / servidor] 


Un programa basado en red generalmente tiene dos lados: servidor y cliente. El cliente, como su nombre indica, es la parte del programa que se procesa localmente para cada usuario final, y el servidor es una cadena de procesamiento principal que se ejecuta independientemente de los clientes que estén conectados a él. Como se mencionó, los clientes pueden conectarse al servidor, enviando y recibiendo solicitudes e información a cambio. Un servidor, a menos que esté configurado de otra manera, no tiene límite en cuanto a la cantidad de clientes que se pueden conectar a él en un punto dado, pero un cliente solo se puede conectar a un servidor a la vez. El principal cuello de botella en cualquier aplicación de red es el ancho de banda de Internet, en otras palabras, la cantidad de datos a lo largo del tiempo que se pueden enviar desde el servidor (también la cantidad de datos que los clientes deben enviar al servidor, aunque es un problema menos significativo). . Esto significa que dicha aplicación debe intentar minimizar la cantidad de comunicación entre el cliente y el servidor, y solo enviar los datos necesarios (de otra manera no obtenibles) entre los 2, como la entrada del usuario, eventos en todo el servidor, otras actividades de clientes, etc. 



Contenido

  • 1 Cliente
  • 2 servidor
  • Comunicación 3
    • 3.1 paquetes

Testimonios de

En Minecraft, el cliente es su juego local que se ejecuta en su máquina y está a cargo de todos los cálculos locales, como gráficos, audio y UI (interfaz de usuario), así como también algunos de los cálculos del servidor, porque el cliente se ejecuta una semi-copia local del servidor, que está ahí para reducir la cantidad de uso de ancho de banda. A partir de este punto, nos referiremos a esta semi-copia local del servidor simplemente como "el cliente". El cliente calcula algunas cosas de manera similar al servidor, con una ligera variación. Por ejemplo, el cliente no tiene acceso a la semilla mundial y, por lo tanto, no puede procesar ninguna aleatoriedad que se produzca en el servidor. El cliente también solo puede lidiar con lo que tiene, por lo que otras cosas que maneja el servidor, como las acciones de otros jugadores, el chat, los comandos y algunas otras cosas, exclusivas del servidor, no pueden ser procesadas por el cliente. 


Servidor

Existe una distinción con respecto a la definición del servidor en Minecraft, dependiendo de si el juego es local (un jugador) o remoto (multijugador). 

Si el juego se ejecuta localmente, la versión local del servidor mencionado en la sección "Cliente" todavía está presente, pero también se ejecuta localmente otra copia completa del servidor. A esto se le llama servidor integrado, ya que está integrado dentro de su cliente. Debido a que un juego local también tiene 2 copias del servidor, una denominada "el servidor" (la versión completa) y la otra denominada "el cliente" (la semi-copia. Esta distinción se debe a que el cliente todavía solo se comunica con la semi-copia, y la semi-copia y la copia completa aún se comunican entre sí a través de un controlador de red, aunque la dirección es localhost), incluso este servidor local podría tener desincronizaciones cliente / servidor. 


Sin embargo, si el servidor es remoto, el cliente solo tiene una semi-copia del servidor, como se describe en la sección "Cliente". Un servidor remoto se diferencia de un servidor integrado en algunas cosas, a saber, las restricciones de los jugadores a los comandos y otras cosas, pero también ciertas estructuras de datos únicas, como listas de jugadores, listas blancas, listas negras, listas de permisos, etc. una máquina diferente a su juego local ("cliente"), utiliza la red de enrutamiento, más comúnmente conocida como Internet, para transferir datos entre el servidor y el cliente, y viceversa. Internet no es perfecto y tiene una cierta cantidad de retraso variable, lo que hace que algunas cosas funcionen con menos fluidez que en un solo jugador. Además, Internet puede perder la conexión en su extremo, el extremo del servidor o cualquier cosa intermedia, provocando que se desconecte de un servidor en ocasiones. 

Comunicación

El servidor y el cliente están separados y cada uno calcula bloques y entidades por separado. El cliente está a cargo del renderizado, la ubicación del jugador y algunas otras mecánicas. Esto significa que es posible renderizar bloques que no están realmente en el servidor. Estos son bloques fantasmas. Es posible utilizar un bloque fantasma como ancla para la colocación de otro bloque, lo que permite la colocación de bloques en el aire. Los paquetes de daño enviados desde el servidor contienen un vector de dirección de retroceso (incluso si no se aplica retroceso, en cuyo caso será el vector cero), que tiene en cuenta lo que el servidor piensa que está sucediendo con el movimiento del jugador. Esto hace que el cliente procese el movimiento de la misma manera que el servidor para 1 gametick, sincronizándose efectivamente entre los dos. 



A continuación, se muestra un ejemplo de cómo utilizar entidades para impulsar al cliente y volver a conectar la conexión entre el cliente y el servidor https://www.youtube.com/watch?v=P7FM1JRbNWo

Aquí hay otro ejemplo de impulso vertical usando bloques de limo fantasma. También se incluye una explicación. https://www.youtube.com/watch?v=sFAlX7TKz1s

Paquetes

Como se mencionó, el cliente y el servidor, independientemente de si están remotos entre sí o no, necesitan comunicarse entre sí. El método estándar para la comunicación cliente-servidor a través de Internet (y también localmente, para los propósitos de algunas aplicaciones, como Minecraft) se llama "paquetes". Un paquete es un paquete pequeño, bueno, de información o datos, que debe transferirse de una manera entre los dos lados. Una vez que se genera un paquete con todos los datos que debe contener, se envía a un manejador de red, que luego lo envuelve con encabezados, que contienen información genérica importante, como la dirección IP del origen, la dirección IP del destino, el tiempo de generación, etc. En el camino, está envuelto por otros encabezados generados por cada máquina ("enrutador") por la que pasó en su camino, para que pueda encontrar más fácilmente su camino de regreso, si es necesaria una respuesta. Por otro lado, se recibe y se desenvuelve de todos sus encabezados, de modo que solo los datos sin procesar del interior se exportan desde el controlador de red de ese lado y se envían al procesador de paquetes. Luego, se lee el contenido del paquete y se toman las acciones apropiadas, incluidas las respuestas devueltas, si es necesario.

Los paquetes son generalmente conjuntos de información muy pequeños, que por lo general no contienen más de varios cientos de bytes. Su información se comprime y minimiza, y luego se extrapola en el otro lado a datos reales. Debido a esto, las 2 partes deben tener un contrato entre ellas sobre cómo deben verse exactamente los datos. Puede leer más sobre paquetes en línea. Lo que podemos aprender sobre el comportamiento de Minecraft a partir del uso de paquetes es que (especialmente cuando Internet es lento o desconectado) a menudo, los datos transferidos entre el cliente y el servidor se pierden, se retrasan de manera diferente o se alteran, debido a las fallas de Internet, aplicándose de manera diferente a cada pequeño paquete de información, provocando una cierta fluctuación en el flujo de datos transferidos entre el cliente y el servidor (y viceversa).




Añade un comentario de Comunicación servidor / cliente
¡Comentario enviado con éxito! Lo revisaremos en las próximas horas.