Beruflich Dokumente
Kultur Dokumente
2. Semántica.
a. Especificación de entidades y su relación.
b. Especificación de protocolos entre entidades.
c. Servicios que requerirá/proveerá cada protocolo.
1
Ejemplo puesto en clase: Controlar un coche teledirigido a través de un ordenador portátil.
-Entidades. El ordenador portátil (actúa como cliente porque “pide” cosas) y el coche
que actúa como servidor (“hace lo que le pido”).
Aunque principalmente el coche actúe como servidor, habrá momentos en los que el coche haga
peticiones al portátil y se intercambien los roles.
1.1Sintaxis
En la sintaxis de un protocolo hay que especificar:
-Tipos de mensajes
-Tipo de protocolo (versión) Normalmente el primer byte (o los dos primeros) bytes de
un mensaje es un campo que nos dice el tipo de protocolo. Si estamos en una red interna
en la que solo vamos a utilizar nuestro protocolo es mejor dedicar 1 byte a este campo,
si no, es preferible dedicarle 2 bytes.
2
-Timestamp (de fuente sincronizada). El tiempo de cada computador en el sistema de
cada máquina es relativo, y por eso se hace necesario un campo que permita sincronizar
a los hosts que se comunican.
-Id por mensaje. Es un identificador único en cada sesión que permite identificar
unívocamente un mensaje. Permite, por ejemplo, que si recibimos dos mensajes con el
mismo id podamos descartar uno de ellos.
-Longitud del payload. Campo de longitud variable que define la longitud de los datos
que continúan este encabezado.
-ID de siguiente cabecera. Se utiliza para indicar al parser (programa que se encargar de
leer el buffer recibido) cómo interpretar los datos que vienen a continuación. Se utiliza
en protocolos dinámicos que están formados por una cabecera fija seguida de
cabeceras/campos opcionales.
-ID del origen del mensaje. Para identificar al origen del mensaje se utiliza un
identificador único universal (UUID), una cadena alfanumérica que está estandarizada
por la RFC 4122 En esta cadena se incluye la IP/puerto del origen del mensaje.
Un ejemplo puede ser hacer una suma con todos los bits y poner el resultado en este
campo. En el destino se vuelve a sumar y vemos si el resultado coincide. Si no coincide
se descarta el mensaje. No obstante, la técnica más sencilla es la de paridad, que
consiste en determinar cuántos 1’s hay en el mensaje: si el resultado es par se pone un
1 en el campo CRC, en caso contrario se pone un 0.
-Código. Es un campo que permite saber que tipo de mensaje es para ayudarte a
interpretarlo.
1.2Semántica y Temporización
-La semántica explica la función de cada tipo de mensaje. Para ello, explica la misión de cada
campo, el valor de cada campo, y el significado de cada valor.
3
Ejemplo: RFCs TFTP
1. Mensajes enviados.
2. Mensajes recibidos.
3. Cambios internos de la entidad (ej: timeout)
4
Todos los lenguajes de programación tienen librerías para serializar en diversos formatos:
-JSON. También se define como “Human Readable”, es verboso y poco eficiente (pero
más eficiente que XLM).
5
3. Ejemplo: Alquiler de Bicis
Queremos diseñar un protocolo para un sistema de alquiler de bicis. El sistema cuenta con una
serie de postes que tienen un ordenador dentro, a los que llegan las bicis y se enganchan. En
cada bici tenemos una etiqueta RFID y en cada poster un lector RFID.
1. Teléfono Móvil.
2. Estación de bicis
3. Servicio Central
4. Bici
5. Candado
Servicios ofrecidos
6
Servicio central: AlquilerP
1. Autorización alquiler
2. Notificación alquiler.
Candado: BlockP
1. Bloquear
2. Desbloquear
Bici: BiciP
1. Identificar Bici
Paso 3. Temporización
7
4. Protocol buffers de Google
Protocol Buffers es un mecanismo de Google para serializar estructuras de datos
independientes a la plataforma y al lenguaje, que luego podremos compilar al lenguaje que
utilicemos en nuestra aplicación, obteniendo a la vez métodos de lectura y escritura de los
mismos.
Características
-Fuertemente tipado.
-Esquema evolutivo.
8
Como se puede observar el lenguaje usado en los archivos .proto es muy sencillo. Solamente
hay que indicar el nombre, el tipo de cada campo (bool, int32, float, double, string) y un
modificador:
-En proto2 cada campo puede llevar un modificador required (obligatorio que
tenga un valor, si no, excepción), optional (si no tiene valor se asigna uno por defecto) o
repeated (puede repetirse cualquier número de veces incluida cero).
Además, en Protocol Buffers los campos se etiquetan de manera única con un entero que
después es utilizado en la codificación binaria para identificarlos.
2. Una vez que tenemos preparado el fichero .proto, procedemos a compilarlo para
generar las clases de acceso a los datos. Como resultado, se genera una clase por cada
mensaje que hayamos definido, con una plantilla en cada una de ellas.
protoc -I --python_out=. archivo.proto
3. Importar las clases generadas en el proyecto para empezar a manipular los mensajes.
Versiones
-No se pueden cambiar los números de los campos existentes.
-No se puede añadir o borrar campos requeridos. Hay que tener cuidado con incluir estos
campos con estos modificadores.