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).
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.
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:
Cuando se transmiten datos, estos sufren las siguientes transformaciones al pasar por las diferentes capas:
Cuando se reciben datos, las transformaciones se suceden de la siguiente forma:
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:
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).
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.
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.
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.
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.
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:
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.