SOCKETS.
Los sockets son una herramienta que le permite al desarrollador de soluciones automatizadas, en el contexto de las redes de comunicación industrial, comunicar los distintos procesos que corren en los diversos equipos de una
Red de Comunicación industrial:
- SCADAS
- CNC
- ROBOTS INDUSTRIALES
- SENSORES
- CONTROLADORES DE NIVEL
- BANDAS TRANSPORTADORAS
Dibujo de maquinas corriendo procesos sobre el modelo OSI.
Un socket puede ser básicamente de tres tipos: Crudo, UDP, o TCP.
- Un Socket Crudo es un Socket que se encuentra sobre la capa de aplicación de datos. Puede propociona conexión, intercambio de datos, pero no puede entregar enrutamiento ni confiabilidad.
- Un Socket UDP es un Socket sobre la capa de enrutamiento, es decir, soporta protocolo IP predominantemente, proporciona conectividad y enrutamiento, pero no confiabilidad.
- Un Socket TCP es un Socket sobre la capa de transporte, es decir soporta Conexión de datos, Robustez y Enrutamiento.
Este seminario está enfocado hacia los Sockets TCP. A lo largo del curso iremos enfocándonos hacia los Sockets UDP y los sockets crudos (Raw).
1. TCP Sockets.
1.1. TCP en el OSI.
La capa de transporte, es la capa en la que vive el protocolo TCP. El protocolo TCP provee conexión, robustez y comunicación no sincronizada.
1.2. Socket TCP.
Un Socket TCP utiliza el protocolo mencionado para establecer, mantener y apagar una conexión entre dos servicios en una red de comunicación de datos o una red de comunicación industrial. Adicionalmente es una comunicación robusta porque está garantizada la lectura y escritura de datos de manera correcta.
Una conexión entre dos procesos TCP tiene las siguientes características:
- Orientada a Conexión.
- Confiable / Robusta.
- En Secuencia.
- Continua.
- Full Duplex.
1.3. Operación del Socket TCP.
Antes de que la transferencia de datos comience TCP establece una conexión entre dos aplicaciones, estableciendo los parámetros de la conexión. Una vez configurados comienza la transferencia.
Durante la transferencia se pueden cambiar los parámetros para mejorar la eficiencia de la comunicación.
Al final de la conexión la conexión se cierra.
Es un contrato a termino indefinido, es decir se cierra en cualquier momento sin que se avise a ninguna de las partes.
Explicar como todas estas cosas las gestiona el Socket sin necesidad de preocuparse por la gestión a bajo nivel.
1.3.1. Segmento TCP.
La capa 4, provee la unidad de dato llamada SEGMENTO. Es aquí donde se encuentran los protocolos TCP y UDP entre otros.
Un segmento está definido por el siguiente cabezal:
- Source port (16 bits).
Identifica el puerto fuente, en el que se origina la comunicación.
- Destination port (16 bits).
Identifica el puerto destino, al que llega la comunicación.
- Sequence number (32 bits)
- Tiene dos roles:
- Si la bandera SYN está puesta (1), entonces este es el número de secuencia inicial. El número de secuencia del actual primer byte de datos y el número recibido en el correspondiente ACK que son entonces este número de secuencia más 1.
- Si la bandera SYN no está puesta (0), entonces este es el número de secuencia acumulado del primer byte de datos de este segmento para la sesión actual.
- Acknowledgment number (32 bits)
-
- Si la bandera ACK está puesta entonces el valor de este campo es número de secuencia próximo que el receptor espera. Esto hace de acuse de recibo de los bytes previos (si es que los hay). El primer ACK enviado por cada extremo, hace de acuse de recibo para el número de secuencia inicial de la contraparte, aunque sin datos. Si la bandera ACK no está puesta, entonces este campo no significa nada.
- Data offset (4 bits)
- Especifica el tamaño del encabezado TCP in palabras de 32-bits. El tamaño mínimo de encabezado son 5 palabras (20 bytes) y el máximo es de 15 palabras (60 bytes).
- Reserved (3 bits)
- Para uso futuro y se debe colocar en 0.
- Flags (9 bits) (aka Control bits)
- contains 9 1-bit flags
- NS (1 bit) – Protección Oculta de Notificación de Congestión Explícita. (experimental por lo general se coloca en cero: ver RFC 3540).
- CWR (1 bit) – Ventana de Congestion Reducida, se coloca en (1) enviado por el transmisor, para indicar que recibió un segmento TCP con la bandera ECE puesta y comenzó un mecanismo de gestión de congestión. (Añadido al encabezado en RFC 3168).
- ECE (1 bit) – ECN-Echo has a dual role, depending on the value of the SYN flag. It indicates:
- Si la bandera SYN está puesta (1), quiere decir que es una máquina TCP con capacidad de manejo de la congestion( ECN capable ).
- Si la bandera SYN flag no esta puesta (0), quiere de cir que un paquete IP con congestión se ha recibido durante la transmisión normal.(añadido al encabezado por RFC 3168).
- URG (1 bit) – Mensaje Urgente
- ACK (1 bit) – Si está puesto indica que el campo Acknowledge number es significativo. Todos los paquetes después del paquete SYN inicial deben tener puesta esta bandera.
- PSH (1 bit) – Función Push. Solicita enviar el buffer de datos a la aplicación receptora.
- RST (1 bit) – Resetear la conexión.
- SYN (1 bit) – Sincronizar los números de secuencia. Solo el primer paquete enviado de cada extremo debe tener esta bandera puesta. Algunas otras banderas y campos cambian de significado, basándose en el valor de esta bandera.
- FIN (1 bit) – No hay más datos desde el emisor.
- Window size (16 bits)
- El tamaño de la ventana de recepción, el cual se especifica en unidades de tamaño de ventana.
- Checksum (16 bits)
- El campo checksum de 16 bits.
- Urgent pointer (16 bits)
- Si la bandera URG está puesta, entonces este campo de 16 bits es un offset desde el número de secuencia indicando el último byte de dato urgente.
- Options (Variable 0–320 bits, divisible by 32)
- La longitud de este campo va determinado por campo offset data . Este campo está dividido hasta en tres subcampos: Option-Kind (1 Byte) Option Lenght (1 byte) Option Data (variable). El campo Option-Kind indica el tipo de opción y es el único que no es opcional. Dependiendo de qué tipo de opción los siguientes 2 campos pueden ser configurados: El campo de longitud de configuración. Depending on what kind of option we are dealing with, the next two fields may be set: the Option-Length field indicates the total length of the option, and the Option-Data field contains the value of the option, if applicable. For example, an Option-Kind byte of 0x01 indicates that this is a No-Op option used only for padding, and does not have an Option-Length or Option-Data byte following it. An Option-Kind byte of 0 is the End Of Options option, and is also only one byte. An Option-Kind byte of 0x02 indicates that this is the Maximum Segment Size option, and will be followed by a byte specifying the length of the MSS field (should be 0x04). Note that this length is the total length of the given options field, including Option-Kind and Option-Length bytes. So while the MSS value is typically expressed in two bytes, the length of the field will be 4 bytes (+2 bytes of kind and length). In short, an MSS option field with a value of 0x05B4 will show up as (0x02 0x04 0x05B4) in the TCP options section.
- Some options may only be sent when SYN is set; they are indicated below as [SYN]. Option-Kind and standard lengths given as (Option-Kind,Option-Length).
- 0 (8 bits) – End of options list
- 1 (8 bits) – No operation (NOP, Padding) This may be used to align option fields on 32-bit boundaries for better performance.
- 2,4,SS (32 bits) – Maximum segment size (see maximum segment size) [SYN]
- 3,3,S (24 bits) – Window scale (see window scaling for details) [SYN][6]
- 4,2 (16 bits) – Selective Acknowledgement permitted. [SYN] (See selective acknowledgments for details)[7]
- 5,N,BBBB,EEEE,... (variable bits, N is either 10, 18, 26, or 34)- Selective ACKnowledgement (SACK)[8] These first two bytes are followed by a list of 1–4 blocks being selectively acknowledged, specified as 32-bit begin/end pointers.
- 8,10,TTTT,EEEE (80 bits)- Timestamp and echo of previous timestamp (see TCP timestamps for details)[9]
- (The remaining options are historical, obsolete, experimental, not yet standardized, or unassigned)
- Padding
- The TCP header padding is used to ensure that the TCP header ends and data begins on a 32 bit boundary. The padding is composed of zeros.[10]