Introducción
La cantidad de información que se generan en una red de datos tiene una manera sistemática de ordenarse y esto se hace a partir de una arquitectura de red la cual es TCP/IP pero no es la única existente, otra muy famosa conocida como OSI (Interconexión de sistemas abiertos), lo esencial es entender el funcionamiento de cada una de las capas y la manera de comunicarse una con la otra y las interfaz que proporciona cada una de ellas.
Cada capa tiene una cierta cantidad de protocolos que realizan ciertas operaciones desde la más baja hasta la más alta, en esta investigación se han estudiado 5 protocolos de comunicación los cuales son: TCP, UDP, ETHERNET TYPE 2,
IPV4, IPV6, cada uno de estos protocolos son el resultado de varias investigaciones, la información acerca de cada uno de ellos se encuentran en una serie de artículos publicado en internet por el IETF (Grupo de Trabajo de Ingeniería de Internet) llamados RFC (Request For Coment) estos artículos son muy interesantes ya que muestran de manera minuciosa el funcionamiento, la arquitectura, el formato de cabecera de cada uno de los protocolos entonces esta ha sido la bibliográfica esencial de esta investigación (Postel, 1981).
Luego de conocer íntimamente el funcionamiento de cada protocolo empezó lo más interesante, el desarrollo de una aplicación que puede captar de alguna forma todos esos paquetes que atraviesan la red, para ello surgió una gran pregunta, ¿Cómo lo hago? El proceso para capturar esos paquetes realmente es muy complejo pero existen herramientas que minimizan ese trabajo y ayuda al desarrollador de software a lograr su objetivo sin invertir una cantidad excesiva de tiempo, es por ello que utilizo el lenguaje de programación golang el cual es una tecnología moderna en el ámbito de desarrollo de software actual ofrece varias características como: tipado estático y dinámico, retorno de varios valores de diferentes tipos de datos en las funciones, programación concurrente, varios paradigmas de programación como el orientado a objetos, imperativo, compilado y un recolector de basuras muy eficiente etc (Socolofsky & Kale, 1991).
Google en 2016 libero una librería muy interesante llamada Gopacket desarrollada en golang y es esta librería la cual se usó en esta aplicación, junto a ella gopacket se comunica directamente con otra librería muy conocida en este ámbito llamada libpcap desarrollado en C/C++, aunque se pudo trabajar directamente con libpcap , realmente gopacket es más sencilla de utilizar es muy cómoda y se pueden obtener resultados rápidamente mientras que libpcap pues tomara un poco más de tiempo usarla pero se podrán entender otros conceptos acerca de cómo está formada y cómo se realiza la captura de los paquetes en un nivel más bajo de abstracción (Tanenbaum & Wetherall, 2012).
Una vez obtenido los datos es momento de visualizarlos para ello se desarrolló un cliente front-end en el lenguaje JavaScript que permita una comunicación full dúplex con el servidor de paquetes de red para ellos también se implementó tecnológía para el intercambio de datos bidireccional y al mismo instante, una de estas tecnologías es el protocolo Web Socket el cual permite este tipo de intercambio de información entre el cliente y el servidor atreves del formato de serialización JSON, se aplicó un poco de diseño para que interfaz gráfica sea más amigable con el usuario usando el framework Vue.js que tiene varias características interesantes (Postel, 1980).
Materiales y métodos
Este modelo se basa en una propuesta desarrollada por la Organización Internacional de Normas (ISO) como el primer paso hacia la estandarización internacional de los protocolos utilizados en las diversas capas. Este modelo se revisó en 1995 y se le llama Modelo de referencia OSI (Interconexión de Sistemas Abiertos, del inglés Open Systems Interconnection) de la iso puesto que se ocupa de la conexión de sistemas abiertos; esto es, sistemas que están abiertos a la comunicación con otros sistemas. Para abreviar, lo llamaremos modelo OSI.
El modelo OSI tiene siete capas. Los principios que se aplicaron para llegar a las siete capas se pueden resumir de la siguiente manera:
Se debe crear una capa en donde se requiera un nivel diferente de abstracción.
Cada capa debe realizar una función bien definida.
La función de cada capa se debe elegir teniendo en cuenta la definición de protocolos estandarizados internacionalmente.
Es necesario elegir los límites de las capas de modo que se minimice el flujo de información a través de las interfaces.
La cantidad de capas debe ser suficiente como para no tener que agrupar funciones distintas en la misma capa; además, debe ser lo bastante pequeña como para que la arquitectura no se vuelva inmanejable.(Figura 1)
El modelo de referencia TCP/IP
El término genérico "TCP/IP" usualmente significa cualquier cosa y todo con referencia a los protocolos específicos TCP e IP. Pueden incluir otros protocolos, aplicaciones e incluso los medios de red. Unos ejemplos de estos protocolos son: UDP, ARP e ICMP. Unos ejemplos de estas aplicaciones son: TELNET, FTP y RPC. Un término más preciso es "tecnología internet". A una red que usa una tecnología internet se le llama una "internet".
Esta es la estructura lógica de los protocolos divididos en capas dentro de un computador en internet. Cada computador que se puede comunicar usando una tecnología internet tiene también una estructura.
Es esta estructura lógica la que determina el comportamiento del computador en el internet. Las cajas representan el procesado de los datos conforme van atravesando el computador y las líneas que conectan las cajas muestran el camino de los datos. La línea horizontal de abajo representa el cable de Ethernet, el "o" es el transceptor. El "*" es la dirección IP y la "@" es la dirección Ethernet. Entender esta estructura lógica es esencial para entender la tecnología internet; hay referencias a ella a lo largo de todo este tutorial. (Figura 2)
Protocolos de Comunicaciones
TCP
El "protocolo de control de transmisión" ('Transmission Control Protocol', TCP) está pensado para ser utilizado como un protocolo 'host' a 'host' muy fiable entre miembros de redes de comunicación de computadoras por intercambio de paquetes y en un sistema interconectado de tales redes.
TCP es un protocolo orientado a la conexión, fiable y entre dos extremos, diseñado para encajar en una jerarquía en capas de protocolos que soportan aplicaciones sobre múltiples redes. TCP proporciona mecanismos para la comunicación fiable entre pares de procesos en computadoras 'host' ancladas en redes de comunicación de computadoras distintas, pero interconectadas.
Se hacen muy pocas suposiciones sobre la fiabilidad de los protocolos de comunicación por debajo de la capa de TCP. TCP sólo supone que puede acceder a un servicio de transmisión de datagramas simple, aunque en principio poco fiable, de los protocolos del nivel inferior. En principio, TCP debería ser capaz de operar encima de un amplio espectro de sistemas de comunicaciones que incluye desde conexiones por cables fijos ('hard-wired conections') hasta redes de intercambio de paquetes o redes de circuitos conmutados.
TCP se basa en los conceptos descritos primeramente por Cerfy Kahn, TCP encaja en una arquitectura de protocolos en capas justo por encima del protocolo de internet,
protocolo básico que proporciona un medio para TCP de enviar y recibir segmentos de longitud variable de información envuelta en "sobres" de datagramas de internet. El datagrama de internet proporciona un medio de direccionar TCPs de origen y de destino situados en redes diferentes. El protocolo de internet también trata con la fragmentación y el reensamble de segmentos de TCP que sean necesarios para conseguir el transporte y la entrega sobre múltiples redes y las puertas de enlace que las interconectan. El protocolo de internet también lleva información sobre la prioridad, clasificación de seguridad y compartimentación de los segmentos de TCP, de tal forma que esta información pueda ser comunicada de extremo a extremo entre múltiples redes (Figura 3).
Trama Ethernet. Type II
La trama es lo que se conoce también por el nombre de "frame". El primer campo es el preámbulo que indica el inicio de la trama y tienen el objeto de que el dispositivo que lo recibe detecte una nueva trama y se sincronice. El delimitador de inicio de trama indica que el frame empieza a partir de él. Los campos de MAC (o dirección) de destino y origen indican las direcciones físicas del dispositivo al que van dirigidos los datos y del dispositivo origen de los datos, respectivamente.
La etiqueta es un campo opcional que indica la pertenencia a una VLAN o prioridad en IEEE P802.1p Etherne type indica con que protocolo están encapsulados los datos que contiene la Payload, en caso de que se usase un protocolo de capa superior.
La Payload es donde van todos los datos y, en el caso correspondiente, cabeceras de otros protocolos de capas superiores (Según Modelo OSI, véase Protocolos en informática) que pudieran formatear a los datos que se tramiten (IP, TCP, etc.). Tiene un mínimo de 64 Bytes (o 42 si es la versión 802.1Q) hasta un máximo de 1518 Bytes. Los mensajes inferiores a 64 bytes se llaman tramas enanas (runt frames) e indican mensajes dañados y parcialmente transmitidos.
La secuencia de comprobación es un campo de 4 bytes que contiene un valor de verificación CRC (control de redundancia cíclica). El emisor calcula el CRC de toda la trama, desde el campo destino al campo CRC suponiendo que vale 0. El receptor lo recalcula, si el valor calculado es 0 la trama es válida. El gap de final de trama son 12 bytes vacíos con el objetivo de espaciado entre tramas.
User Datagram Protocol (UDP) este Protocolo de Datagramas de Usuario (UDP: UserDatagram Protocol) se define con la intención de hacer disponible un tipo de datagramas para la comunicación por intercambio de paquetes entre ordenadores en el entorno de un conjunto interconectado de redes de computadoras. Este protocolo asume que el Protocolo de Internet (IP: Internet Protocol) se utiliza como protocolo subyacente. [5]
Este protocolo aporta un procedimiento para que los programas de aplicación puedan enviar mensajes a otros programas con un mínimo de mecanismo de protocolo. El protocolo se orienta a transacciones, y tanto la entrega como la protección ante duplicados no se garantizan. Las aplicaciones que requieran de una entrega fiable y ordenada de secuencias de datos deberían utilizar el Protocolo de Control de Transmisión (TCP: Transmission Control Protocol) (Figura 4)
HTTP
El Protocolo de transferencia de hipertexto (en inglés: Hypertext Transfer Protocol o HTTP) es el protocolo de comunicación que permite las transferencias de información en la World Wide Web. HTTP fue desarrollado por el World Wide Web
Consortium y la Internet Engineering Task Force, colaboración que culminó en 1999 con la publicación de una serie de RFC, el más importante de ellos es el RFC 2616 que especifica la versión 1.1. HTTP define la sintaxis y la semántica que utilizan los elementos de software de la arquitectura web (clientes, servidores, proxies) para comunicarse. HTTP es un protocolo sin estado, es decir, no guarda ninguna información sobre conexiones anteriores. El desarrollo de aplicaciones web necesita frecuentemente mantener estado. Para esto se usan las cookies, que es información que un servidor puede almacenar en el sistema cliente. Esto le permite a las aplicaciones web instituir la noción de sesión, y también permite rastrear usuarios ya que las cookies pueden guardarse en el cliente por tiempo indeterminado.
Protocolo de Internet Versión 4
El Protocolo Internet está diseñado para su uso en sistemas interconectados de redes de comunicación de ordenadores por intercambio de paquetes. A un sistema de este tipo se le conoce como "catenet". El protocolo internet proporciona los medios necesarios para la transmisión de bloques de datos llamados datagramas desde el origen al destino, donde origen y destino son hosts identificados por direcciones de longitud fija. El protocolo internet también se encarga, si es necesario, de la fragmentación y el reensamblaje de grandes datagramas para su transmisión a través de redes de trama pequeña.
El protocolo internet implementa dos funciones básicas: direccionamiento fragmentación. Los módulos internet usan campos en la cabecera internet para fragmentar y reensamblar los datagramas internet cuando sea necesario para su transmisión a través de redes de "trama pequeña".
El modelo de operación es que un módulo internet reside en cada host involucrado en la comunicación internet y en cada pasarela que interconecta redes. Estos módulos comparten reglas comunes para interpretar los campos de dirección y para fragmentar y ensamblar datagramas internet. Además, estos módulos (especialmente en las pasarelas) tienen procedimientos para tomar decisiones de encaminamiento y otras funciones. (Figura 5)
Lenguaje de Programación Go (Golang)
Es un lenguaje de programación creado por la compañía google, La comunidad de Go recomienda llamar a "go" como "golang" para la publicación de información en la red, porque al momento de realizar una búsqueda en internet referente al lenguaje con la palabra "go" es un poco dificultoso encontrar resultados que te lleven al lenguaje de programación go, dicho lo anterior para cualquier tipo de búsqueda usar la palabra "golang" que además se está usando en este documento. El lenguaje de programación Go es un proyecto de código abierto que hace que los programadores sean más productivos.
Go es expresivo, conciso, limpio y eficiente. Sus mecanismos de concurrencia facilitan la escritura de programas que aprovechan al máximo las máquinas multicore y en red, mientras que su nuevo tipo de sistema permite la construcción de programas flexibles y modulares. Go compila rápidamente al código de la máquina, pero tiene la conveniencia de recolección de basura y el poder de la reflexión en tiempo de ejecución. Es un lenguaje rápido, escrito de forma estática y compilado que se siente como un lenguaje interpretado de forma dinámica
Resultados y discusión
Fase 1 Análisis de la Información
Para la realización de este proyecto el cual consiste en un aplicación web para capturar y visualizar los datos que se generan en una red de comunicación, se investigaron varios conceptos fundamentales enfocados en las redes de datos como: redes de área local, arquitectura de red la cuales TCP/IP, los protocolos que involucran esta arquitectura como tcp,udp,icmp,ipv4, ipv6 entre otros existen artículos científicos muy interesantes sobre todo que tienes que ver con las redes de comunicación, estos artículos son llamados RFC (Request for comment) los cuales son una serie de publicaciones del grupo de trabajo de ingeniería de internet que describen diversos aspectos del funcionamiento de internet y otras redes de computadoras, como protocolos, procedimientos, arquitecturas etc. Cada RFC constituye un memorando que ingenieros o expertos en la materia han hecho llegar al IETF el consorcio de colaboración técnica más importante en internet, para que este sea valorado por el resto de la comunidad. De hecho, la traducción literal de RFC al español es “Petición de Comentarios”.
En base a la información adquirida de esta seria de publicaciones RFC se pudo obtener los datagramas o formatos de cabeceras de cada uno de los protocolos para poder ser reflejados en la aplicación.
Pero basta con solo obtener la información también se debe de desarrollar el software que permita la obtención de estos campos de los protocolos, para ellos y además es uno de los pilares fundamentales la librería desarrollada por google en el 2016 llamada Gopacket programada en el lenguaje Go o también llamado Golang que además es el lenguaje con el cual esta aplicación está desarrollada junto con otras herramientas más, entonces básicamente esta librería ha proporcionado una ayuda inmensa en el desarrollo de esta aplicación telemática.
Fase 2 Diseño
Para el diseño de esta aplicación lo primero es saber que es protocolo se va a escanear esto se vio en la fase anterior en esta fase se verá los elementos necesarios para el desarrollo duro y puro de la App:
Primero utilizaremos un sistema operativo gnu/Linux este sistema operativo se utilizara porque es compatible con una librería muy interesante para la captura de tráfico de red la cual se llama libpcap esta librería esta diseña en c/c++ pero como anteriormente dije que usaremos la librería gopacket de google, sucede que Gopacket se comunica directamente con la librería lipcap pero una pregunta interesante seria porque no usar directamente lipcap, es correcto utilizar lipcap no hay ningún problema en cuanto a resultados pero en cuanto a desarrollo gopacketes más sofisticada por el sencillo hecho de estar hecho en golang un lenguaje moderno que acoge las mejores características de todos los lenguajes de programación, pero también gopacket proporciona decodificación de para paquetes para el lenguaje go, además contiene muchos su paquetes con funcionalidades adicionales que pueden resultar muy utilices.
Otro punto importante es tenerinstalado en lenguaje golang y bien configurado con la estructura recomendada por los desarrolladores de go porque al momento de realizar importaciones de librería estas se organizarán de tal forma como se muestra en la documentación del lenguaje, la versión de go utilizada en esta App es la versión 1.9 una versión estable y recomendada para trabajo duro.
El entorno de desarrollo utilizado será golang por jetbrain es un ide muy completo que ofrece soporte para el lenguaje golang tiene algunas características como: autocompletado de código, sintaxis de color, depuración directa conexión con control de versiones de software entre otras. La forma de envió de los datos se lo realizo vía JSON (JavaScript Object Notation) es un formato de texto ligero para el intercambio de datos JSON es un subconjunto de la notación literal de objetos de JavaScript aunque hoy, debido a su amplia adopción como alternativa a XML, se considera un formato de lenguaje independiente. Una de las supuestas ventajas de JSON sobre XML como formato de intercambio de datos es que es mucho más sencillo escribir un analizador sintáctico (parser) de JSON. En JavaScript, un texto JSON se puede analizar fácilmente usando la función eval (), lo cual ha sido fundamental para que JSON haya sido aceptado por parte de la comunidad de desarrolladores AJAX, debido a la ubicuidad de JavaScript en casi cualquier navegador web (Deering, Cisco, Hinden & Nokia, 1998).
El desarrollo del cliente front-ent es fundamental para la visualizaciónde los datos en formato json estos se envían atreves de un protocolo de comunicación llamado WEBSOCKET es una tecnología que proporciona un canal de comunicación bidireccional y full-duplex sobre un único socket TCP. Está diseñada para ser implementada en navegadores y servidores web, pero puede utilizarse por cualquier aplicación cliente/servidor. La API de Web Socket está siendo normalizada por el W3C, mientras que el protocolo Web Socket ya fue normalizado por la IETF como el RFC 6455 (Horning, 1984).
Debido a que las conexiones TCP comunes sobre puertos diferentes al 80 son habitualmente bloqueadas por los administradores de redes, el uso de esta tecnología proporcionaría una solución a este tipo de limitaciones proveyendo una funcionalidad similar a la apertura de varias conexiones en distintos puertos, pero multiplexado diferentes servicios Web Socket sobre un único puerto TCP (a costa de una pequeña sobrecarga del protocolo).
Y por último no menos importante el desarrollo del cliente Web Socket para ellos se ha desarrollado un Appsencilla que permita obtener los objetos json y mostrarlos para ello se ha utilizado el lenguaje JavaScript junto al framework Vue.Js es un marco de JavaScript de código abierto progresivo para crear interfaces de usuario La integración en proyectos que usan otras bibliotecas de JavaScript se hace más fácil con Vue porque está diseñada para ser adoptable incrementalmente. Vue también puede funcionar como un marco de aplicación web capaz de impulsar aplicaciones avanzadas de una sola página. (Figura 6)
Fase 3 Desarrollo
Para el desarrollo de esta aplicación primero es definir la estructura de los protocolos a analizar en este caso serían 5: TCP, UDP, IPV4, ETHERNET TYPE 2. (Figura 7)
Para ellos se usa en golang una estructura por cada protocolo (Figura 8, 9 y 10)
Definidas las estructuras se puede empezar el escaneo de los datos, la librería gopacket proporciona métodos para realizar esta operación en la siguiente imagen se podrá observar el escaneo básico de la red de datos.
Definir Configuración básica (Figura 11)
Iniciar Captura (Figura 12)
Front-end (Figura 13)
Para el desarrollo del cliente front-end se utilizó javascript para consumir el Web Socket y poder obtener los paquetes de red que son enviados por el servidor.
Esta captura indica la inicialización de aplicación la cual ya está corriendo en local host a través del puerto 8000.
Front-Web Test de Comunicación (Figura 14)
En esta captura se puede visualizar el cliente web que recibirá los datos proporcionado por el servidor, para ello se probara la comunicación entre cliente y servidor enviando este mensaje que dice “prueba de comunicación desde cliente hacia servidor” en el momento de presionar el botón “Iniciar Captura” el mensaje será enviado al servidor.
Recepción de Mensaje en el Servidor (Figura 15)
Visualización de Paquetes en el Cliente (Figura 16)
Ventana Modal Con Información del Paquete (Figura 17)
Basándose directamente en la arquitectura TCP/IP y los datagramas de cada protocolo se pudo obtener los campos o atributos de cada uno de ellos y mostrarlos al usuario en tiempo real para su posterior uso. (Figura 18)
Conclusiones
La bibliografía utilizada permitió obtener los campos de los protocolos tcp, udp, ipv4, Ethernet, Http lo interesante de las Request for comments es el nivel de especificaciones que estas publicaciones tienen además de una explicación excelente de cada uno de los campos de los protocolos analizados existen ciertas analogías humanas descritas en las publicaciones RFC que ayuda el entendimiento de los protocolos de comunicación.
Una vez obtenidos los campos tanto nombre como tipo de datos, se realizó la implementación de las estructuras de los diferentes protocolos en el lenguaje de programación golang para luego ser enviados atreves del protocolo Web Socket en formato json al navegador web.
Se realizó el desarrollo de un básico servidor Web Socket utilizando los paquetes de gorrilla mux en el lenguaje de programación para él envió en tiempo real de los datos al navegador web esto permite que el usuario no actualizar el navegador web a cada instante para visualizar los datos sino que automáticamente los datos serán visualizados atreves de este protocolo full duplex.