# DNP3

DNP3 (acrónimo del inglés Distributed Network Protocol, en su versión 3) es un protocolo industrial para comunicaciones entre equipos inteligentes (IED) y estaciones controladores, componentes de sistemas SCADA. Es un protocolo ampliamente utilizado en el sector eléctrico, de gran difusión en Estados Unidos y Canadá, y menor presencia en Europa donde el uso de alternativas como IEC-60870 101 e IEC-60870 104 gozan de mayor popularidad. También se puede encontrar en otros campos (agua, gas, entre otros tipos de empresas de servicio).

## Seguridad

Aunque el protocolo fue desarrollado sobre la base de requisitos de gran fiabilidad, no se prestó demasiada importancia a los aspectos de seguridad relacionada con los ataques de Hackers u otros factores malintencionados que pudiesen interferir en el correcto comportamiento de las comunicaciones entre los diversos sistemas de control. Esto supuso un importante error de diseño.
Debido a que el protocolo puede utilizar los niveles de transporte y enlace proporcionados por la suite TCP/IP, gran parte del problema de añadir un Sistema de Autenticación Seguro quedaba resuelto.
DNP3 es actualmente compatible con las especificaciones de seguridad IEC 62351-5.
Cabe destacar además que el protocolo DNP3 se menciona en el estándar IEEE 1379-2000, el cual recomienda un conjunto de prácticas recomendables para la implementación de enlaces de comunicación entre maestros SCADA - RTU/IED. Este estándar no sólo incluye cifrado, sino toda una serie de prácticas que mejoran la seguridad frente a métodos intrusivos conocidos.

## Detalles Técnicos

El protocolo DNP3 presenta importantes funcionalidades que lo hacen más robusto, eficiente y compatible que otros protocolos más antiguos, tales como Modbus, con la contrapartida de resultar un protocolo mucho más complejo.
DNP3 es un protocolo de tres capas o niveles según el modelo OSI: nivel de enlace (Data Link Layer), Nivel de Aplicación (Application Layer), y un tercer nivel de Transporte (Transport Layer) que realmente no cumple con todas las especificaciones del modelo OSI, y por lo cual se suele denominar pseudo-nivel de Transporte. Por este motivo suele referirse a él como un protocolo de dos capas o niveles.
El formato de trama utilizado está basado en el FT3 recogido en las especificaciones IEC 60870-5 (es una redefinición de este formato, no una implementación idéntica), y hace uso de la Comprobación de Redundancia Cíclica (CRC) para la detección de errores.
La estructuración en capas o niveles, sigue el siguiente esquema:
* Los mensajes a nivel de aplicación son denominados Fragmentos. El tamaño máximo de un fragmento está establecido en 1024 bytes.
* Los mensajes a nivel de transporte son denominados Segmentos.
* Los mensajes a nivel de enlace son denominados Tramas. El tamaño máximo de una trama DNP3 es de 292 bytes.
Cuando se transmiten datos, estos sufren las siguientes transformaciones al pasar por las diferentes capas:
* Los datos se encapsulan en fragmentos a nivel de aplicación.
* El nivel de transporte es el encargado de adaptar los Fragmentos para poder encapsularlos en segmentos, para lo cual, secciona el mensaje del nivel de aplicación si es necesario, y les agrega la cabecera de transporte, formando de este modo los segmentos.
* En el nivel de enlace, los segmentos recibidos del nivel de transporte son empaquetados en tramas, para lo cual se les añade a estos una cabecera de enlace, y además, cada 16 bytes un CRC de 2 bytes.
Cuando se reciben datos, las transformaciones se suceden de la siguiente forma:
* El nivel de enlace se encarga de extraer de las tramas recibidas los Segmentos que son pasados al nivel de transporte.
* El nivel de transporte lee la cabecera de los segmentos recibidos del nivel de enlace, y con la información obtenida extrae y compone los fragmentos que serán pasados al nivel de aplicación.
* En el nivel de aplicación los fragmentos son analizados y los datos son procesados según el modelo de objetos definido por las especificaciones del estándar.

## Nivel de enlace

Los mensajes DNP3 a nivel de enlace se encuentran en bloques de no más de 292 bytes denominados tramas. El formato de trama es similar al FT3, si bien presenta ciertas diferencias.
Una trama DNP3 consta de tres bloques bien diferenciados:
Cabecera DNP3: son los diez primeros bytes de la trama, y está constituida por los siguientes campos:
* 2 bytes de inicio (start bytes), cuyo valor es fijo. 0x05 (valor en hexadecimal) para el primero y 0x64 para el segundo.
* 1 byte con el tamaño de la trama. Este valor no tiene en cuenta ni la cabecera, ni los CRC.
* 1 byte con el código de control, que permite fijar los servicios del nivel de enlace, el sentido del flujo, etc.
* 2 bytes con la dirección de destino, codificada en big-endian.
* 2 bytes con la dirección de origen, codificada en big-endian.
* 2 bytes de CRC.
Datos.
Cada 16 bytes de datos, así como al final de la trama, se encontrarán 2 bytes de CRC.
El nivel de enlace en DNP es balanceado, de modo que tanto la estación controladora como la controlada tienen responsabilidad tanto en los envíos de los datos como en la gestión (establecimiento y liberación) del nivel de enlace (fuera del alcance de las especificaciones del protocolo).
El empleo de doble direccionamiento (dirección de origen y dirección de destino) se debe a la funcionalidad que proporciona DNP3 basado en funcionamiento por excepción. De tal modo las comunicaciones no son iniciadas únicamente por la estación controladora, enviando preguntas a las estaciones controladas, sino que además estas últimas pueden iniciar una conversación dependiendo de la alteración de determinada información configurada en ella para ser reportada en estas condiciones. A este tipo de mensajes, en los cuales la estación controlada transmite los eventos de determinados objetos configurados en ella, se les denomina "respuestas no solicitadas".
El nivel de enlace proporciona una serie de servicios para la gestión de la comunicación entre las estaciones, tales como la petición o envío con o sin confirmación, las confirmaciones de tramas recibidas (ACK), las confirmaciones negativas (NACK), el reset de enlace (Reset Link) o el chequeo del estado del enlace (Link Status).

## Nivel de transporte

El nivel de transporte es el encargado de permitir mensajes únicos estructurados tanto en múltiples tramas como en múltiples fragmentos. Esta es una de las características diferenciadoras de DNP3 frente a otros protocolos de comunicación industriales del mismo ámbito, tales como IEC 60870, y permite el concepto de mensajes de tamaño ilimitado.
A continuación se describirá el funcionamiento de este nivel, dependiendo del sentido del flujo de los datos dentro de la estructura de capas del protocolo.

### Datos transmitidos desde el nivel de aplicación hacia el nivel de enlace

El nivel de aplicación pasa los fragmentos al nivel de transporte, y este se encarga de trocearlos y agregarles al principio la cabecera de transporte, la cual ocupa un byte y contiene el número de secuencia que identifica el segmento dentro del fragmento. El tamaño de los fragmentos ha de ser tal, que una vez agregadas las cabeceras del nivel de enlace (diez bytes) y los correspondientes CRCs, el tamaño total no exceda los 292 bytes máximos permitidos para una trama.

### Datos transmitidos desde el nivel de enlace hacia el nivel de aplicación

En este caso, el nivel de transporte se encarga de recomponer los fragmentos del nivel de aplicación a partir de las tramas que le proporciona el nivel de enlace. Para ello, recurre a las cabeceras de transporte y al número de secuencia que identifica la posición de cada segmento dentro del fragmento.

## Nivel de aplicación

El nivel de aplicación se encarga de procesar los fragmentos que le pasa el nivel de transporte, y obtener la información de control y monitorización en ellos encapsulados atendiendo al modelo de datos.
Entre los servicios que proporciona este nivel, se encuentran la escritura y lectura de valores, la congelación de contadores y la selección y ejecución de mandos. El código de función es el que permite indicar qué operación debe realizarse en este nivel.
Por otro lado, las estaciones controladas disponen de la posibilidad de informar a la estación controladora de diferentes aspectos relacionados con este nivel gracias a dos bytes denominados indicaciones internal (Internal Indications, IIN). La estación controlada puede servirse de estas indicaciones para informar acerca de la presencia de eventos de clase 1, clase 2 o clase 3, de la necesidad de ser sincronizada o de la presencia de anomalías en la configuración o en la base de datos.
El modelo de datos en DNP3 está basado en un esquema de objetos.

### Modelo de Objetos en DNP3

El modelo de objetos en DNP3 permite, en rasgos generales, definir los tipos de datos que se manejarán en las diferentes transacciones entre estación controlada y estación controlante. A pesar de ello, existen objetos orientados más bien a servicios a nivel de aplicación que a formato de datos en sí, como pueden ser el objeto 60 (Objeto de Clase), o el objeto 80 (indicaciones internas).
Mediante las denominadas variaciones, es posible establecer, además del tipo de dato definido por el objeto, el formato del mismo (tamaño y formato de los valores, por ejemplo).
A continuación, se describen algunos de los objetos más comúnmente utilizados en comunicaciones DNP3:
* Objeto 1 - Entradas digitales: este objeto hace referencia a las entradas digitales. Permite la lectura de las mismas, mediante el código de función 1, o la asignación de clase mediante el código de función 22 (códigos de función también soportados por otros objetos como contadores o entradas analógicas).
* Objeto 2 - Eventos de las entradas digitales: es importante destacar que DNP3 maneja los valores estáticos y sus eventos como objetos diferentes. Así, los eventos de las entradas digitales (objeto 1) se agruparán en el objeto 2.
* Objeto 12 - Mandos digitales: este objeto hace referencia a los controles digitales. Mediante los códigos de función de selección, ejecución, selección y ejecución y ejecución sin confirmación, se podrán realizar estas operaciones sobre los elementos especificados bajo este objeto.
* Objeto 20 - Contadores: mediante este objeto, DNP3 permite la lectura o manipulación (congelación, reseteo, etc.) de contadores.
* Objeto 22 - Eventos de contadores: este es el objeto utilizado para agrupar la información relativa a eventos generados por contadores (objeto 20).
* Objeto 30 - Entradas analógicas: los valores analógicos se agrupan bajo este objeto.
* Objeto 32 - Eventos de las entradas analógicas: este es el objeto utilizado para los eventos de las entradas analógicas definidas mediante el objeto 30.
* Objeto 41 - Mandos analógicos: este es el objeto utilizado para ejecutar mandos analógicos o Set Points. Admite las mismas funciones que los mandos digitales.
* Objeto 50 - Hora y fecha: la variación 1 de este objeto permite a la estación controladora sincronizar a la estación controlada.
* Objeto 60 - Objeto de clase: como se comentó más arriba, este objeto no distingue exactamente entre un tipo de dato, sino más bien hace alusión a una serie de servicios del nivel de aplicación. Dependiendo del código de función utilizado, mediante este objeto la estación controlada puede realizar peticiones por clase, o asignar clases a los eventos de los objetos estáticos configurados en la estación controlada.
Las clases en DNP3 permiten agrupar los eventos en tres niveles diferentes (recurso útil para priorizar el esquema de peticiones del maestro). Las peticiones por clase permiten el polling por eventos. Un caso excepcional es una cuarta clase denominada clase 0, mediante la cual el maestro puede solicitar al esclavo el envío de todos los valores estáticos configurados en su base de datos.

## Más información

* IEC 60870-5
* IEC 60870-5-101
* IEC 60870-5-104
* IEC 60870-5-103
* IEC 61850