Programación del sistema Linux C (13) Programación en red TCP y protocolo UDP

1 Introducción a los conceptos básicos de la red informática.

1.1 Introducción a la arquitectura de red informática

La arquitectura de la red informática se implementa de acuerdo con un método de diseño altamente estructurado, utilizando el principio de capas. Las ventajas de la estratificación son: buena flexibilidad; fácil mantenimiento e implementación, propicio para la colaboración entre varias capas y estandarización.

Dos estándares para redes de computadoras:

  1. OSI / RM (Open_Systems_Interconnection_Reference_Model): un estándar internacional que se ha logrado en teoría. Las 7 capas de la arquitectura OSI: capa de aplicación, capa de presentación, capa de sesión, capa de transporte, capa de red, capa de enlace de datos y capa física.
  2. TCP / IP: estándar internacional en la práctica. Es decir, el estándar TCP / IP se adopta en realidad. Las cuatro capas de la arquitectura TCP / IP: capa de aplicación, capa de aplicación, capa de transporte, IP de capa de Internet y capa de interfaz de red.

1.2 Introducción al modelo TCP / IP

  • Capa de interfaz de red: responsable de la recepción y transmisión de datagramas IP; responsable del protocolo de la capa de interfaz de red.
  • IP de capa de Internet: enrutamiento, control de flujo y control de congestión; protocolo de capa de red para proporcionar servicios sin conexión.
  • Capa de transporte: establezca una conexión de extremo a extremo; ejecute los protocolos TCP y UDP.
  • Capa de aplicación: protocolo para ejecutar comunicación entre procesos; procesamiento de datos.

1.3 Servicios orientados a la conexión y servicios sin conexión

Los tipos de servicios se dividen en dos categorías: servicios orientados a la conexión y servicios sin conexión.

  1. Servicios orientados a la conexión: antes de transmitir datos, se debe establecer una conexión, y cuando se completa la transmisión de datos, se libera la conexión. Se caracteriza por tres procesos: establecimiento de la conexión, transmisión de datos y liberación de la conexión; cada paquete de datos lleva la IP de origen y la IP de destino de los datos del paquete; la transmisión es confiable, pero el protocolo es más complicado.
  2. Servicio sin conexión: no se requiere establecimiento de conexión o liberación de conexión durante la comunicación. La característica es que no es necesario establecer una conexión, transmisión de datos y proceso de liberación de la conexión; la transmisión no es confiable, pero el protocolo es relativamente simple.

2 Introducción a CS (cliente / servidor)

En la red TCP / IP, la comunicación del proceso entre los dos hosts adopta el modo CS, donde el cliente y el servidor se refieren al proceso. La descripción del cliente y el servidor es la siguiente:

@ 1 cliente: la parte que inició la solicitud de conexión primero. El proceso del cliente es el siguiente:

//1 运行一个客户进程,向服务器特定端口发送请求连接报文;
//2 等待并接收服务器的应答;
//3 继续提出请求;
//4 通信结束后关闭通信通道。

Servidor @ 2: la parte que acepta la solicitud y proporciona el servicio. El proceso del lado del servidor es el siguiente:

//1 开启服务器进程;
//2 loop:等待并检测客户/下一个客户的连接请求;
//3     如果接收到客户的连接请求,则处理该请求;
//4     goto loop

3 Protocolo de datagramas de usuario UDP (protocolo de datos de usuario)

3.1 Formato de datagrama de usuario

El datagrama de usuario UDP tiene dos campos: campo de encabezado (pseudo encabezado de datagrama de usuario + encabezado de datagrama de usuario) y campo de datos.

@ 1 El formato de pseudo encabezado del datagrama de usuario se muestra en la figura:

Entre ellos:

  • Dirección IP de origen: 4 bytes, utilizada para marcar la dirección IP del final del envío.
  • Dirección IP de destino: 4 bytes, utilizada para marcar la dirección IP del extremo receptor.
  • 0: 1 byte, que indica bits de relleno.
  • Protocolo: 1 byte, el número de protocolo UDP es 17.
  • Longitud del datagrama UDP: 2 bytes.

@ 2 El encabezado del informe de datos del usuario se muestra en la figura:

Entre ellos:

  • Número de puerto de origen: el número de puerto de origen utilizado para marcar el datagrama.
  • Número de puerto de destino: el número de puerto de destino utilizado para marcar el datagrama.
  • Longitud del datagrama UDP: contiene la longitud del encabezado del datagrama + la longitud de la parte de datos.
  • Campo de suma de control: evita errores de datagramas de usuario durante la transmisión.

Nota: El pseudo encabezado del datagrama de usuario es una estructura de datos virtual, que se utiliza principalmente para calcular la suma de verificación y conectarse con los datos de usuario de UDP para obtener un datagrama temporal para calcular la suma de verificación del datagrama de usuario de UDP.

3.2 Inspección y cálculo de datagramas de usuario

La suma de comprobación del datagrama UDP se calcula dos veces, una en el extremo emisor y otra en el extremo receptor. (Código inverso + código fuente = 0x11111111 ... usado aquí)

  1. En el extremo de envío: establezca el campo de suma de verificación en el encabezado del datagrama UDP en 0; considere que el pseudo encabezado y el datagrama de usuario UDP están conectados por múltiples cadenas de 16b (si la porción de datos del datagrama de usuario no es siquiera Bytes, debe agregar un byte de todos los 0, es decir, el último 16b es todo 0, y este 16b se refiere al bit inferior), calcule la suma de estos 16b de acuerdo con el código binario inverso; finalmente invierta este número, el resultado Esta es la suma de comprobación del primer byte del datagrama enviado.
  2. En el extremo receptor: el datagrama de usuario UDP recibido junto con el pseudo encabezado (y el posible relleno de todos los 0 bytes), y la suma de estas palabras de 16 bits en inverso binario. Cuando no hay errores, el resultado debe ser todo 1. De lo contrario, indica que se ha producido un error, y el extremo receptor debe descartar este datagrama de usuario UDP (también se puede entregar a la capa de aplicación, pero con una advertencia de error).

3.3 Características y usos de los datagramas de usuario UDP

Características de los datagramas de usuario UDP:

  1. Para los protocolos sin conexión, no se establece ninguna conexión antes de transferir los datos.
  2. La fiabilidad de la entrega no está garantizada, solo la entrega de mejor esfuerzo.

Aunque UDP es un protocolo poco confiable, tiene grandes ventajas en la transmisión de ciertos aspectos de los datos. Las aplicaciones de UDP son las siguientes:

  1. Conversión de nombre de dominio
  2. Protocolo de enlace
  3. Gestión de red
  4. Servicio de archivos remotos
  5. Teléfono IP

4 Protocolo de control de transmisión TCP (protocolo de control de transmisión)

4.1 Introducción a TCP

TCP proporciona servicios orientados a la conexión y es un canal full-duplex confiable. En comparación con UDP, el protocolo TCP es más complejo, pero también es más confiable, principalmente porque la conexión está orientada y los números TCP y confirman los datos transmitidos.

4.2 Encabezado del segmento TCP

El segmento de mensaje TCP también se divide en dos partes: encabezado y datos. El formato del encabezado se muestra en la figura:

Entre ellos:

  • Número de puerto de origen: el número de puerto de origen utilizado para marcar el datagrama.
  • Número de puerto de destino: el número de puerto de destino utilizado para marcar el datagrama.
  • Número de secuencia: el número de secuencia del primer byte en los datos enviados en este segmento.
  • Confirmar número de secuencia: el número de secuencia del primer byte de los datos del siguiente segmento.
  • Desplazamiento de datos: ocupa 4 bits, la unidad de desplazamiento es de 4 bytes, por lo que el desplazamiento máximo que se puede expresar es de 60 bytes.
  • Reservado: el valor es 0.
  • 6 bits
  • Ventana: usada para controlar la cantidad de información enviada por la otra parte, la unidad es byte, usada principalmente en control de flujo y control de congestión.
  • Suma de verificación: el método de suma de verificación es el mismo que UDP, solo el número de protocolo es diferente.
  • Opcional: se utiliza para tratar algunas situaciones especiales. El campo de opción utilizado actualmente se puede usar para definir la longitud máxima del paquete en el proceso de comunicación y solo se puede usar cuando se establece la conexión.
  • Relleno: se utiliza para llenar el segmento de paquete TCP, el contenido del relleno debe ser 0; se utiliza para garantizar que la opción sea un múltiplo entero de 32b.  

Los siguientes 6 bits se explican en detalle aquí:

  1. Bit urgente URG: cuando URG es 1, indica que hay datos urgentes en el mensaje, y debe transmitirse lo antes posible, en lugar de estar de acuerdo con la secuencia de espera original.
  2. Bit de reconocimiento ACK: se utiliza al establecer una conexión; el indicador de reconocimiento en el encabezado del paquete TCP confirma el mensaje TCP recibido.
  3. Push bit PSH: cuando PSH es 1, el remitente enviará el mensaje lo antes posible, y cuando el receptor reciba el mensaje con el bit push de 1, se sacará del búfer de recepción lo antes posible y se entregará al proceso de solicitud.
  4. Restablecer bit RST: cuando RST es 1, indica que se ha producido un error grave en la conexión TCP, la conexión debe liberarse y luego restablecerse.
  5. Bit de sincronización SYN: se utiliza para sincronizar el número de secuencia al establecer una conexión.
  6. Bit de terminación FIN: se utiliza para liberar una conexión. Cuando FIN es 1, indica que los datos en el extremo emisor de este segmento se han enviado y se solicita que se libere la conexión; FIN = 0 no es válido.

4.3 Número de datos TCP y confirmación

La razón por la cual TCP puede lograr una transmisión de datos confiable es a través del etiquetado y la confirmación de datos TCP.

  1. El valor del número de secuencia en el encabezado del segmento enviado por TCP cada vez indica el número de secuencia del primer byte en la porción de datos del segmento (dado que el número de secuencia en el encabezado del segmento TCP ocupa 4 bytes, puede marcar 4G Bytes de datos), para la transmisión general de datos, puede garantizar que el número de secuencia de cada byte no se superponga con el número de secuencia de otros bytes.
  2. Confirmación de datos TCP: confirme el número de secuencia del último byte en los datos que se han recibido con éxito.
  3. El número de secuencia de confirmación devuelto por el extremo receptor: el extremo receptor espera el valor del número de secuencia del primer byte en los siguientes datos recibidos (este valor debe ser igual al número de secuencia del último byte de los datos que se han recibido correctamente + 1).

La relación entre la secuencia de envío y la secuencia de recepción se muestra en la figura:

4.4 Control de flujo TCP y gestión de congestión

El protocolo TCP generalmente usa una ventana deslizante de tamaño variable para el control de flujo.

  1. Ventana de envío: la cantidad máxima de bytes que el remitente puede enviar datos a la vez durante la comunicación de datos. El valor del campo de la ventana al comienzo del segmento TCP es el tamaño de la ventana actual.
  2. Ventana de recepción: ajuste dinámicamente el tamaño de la ventana de envío de la otra parte de acuerdo con la situación real durante la comunicación de datos.

Durante la comunicación TCP, el extremo emisor mantiene un puntero que apunta a los siguientes datos que se enviarán. Cada vez que el remitente envía un mensaje, el puntero se mueve hacia adelante por la distancia de un segmento de mensaje. El movimiento de la ventana de envío se realiza después de que el extremo de envío recibe la confirmación del extremo de recepción, y el segmento de paquete enviado por el extremo de envío cada vez no es mayor que el tamaño de la ventana de envío. La ventana deslizante describe esencialmente el tamaño del búfer de datagramas TCP del receptor, y el emisor calcula la longitud máxima de datos que pueden enviarse en función de estos datos. Si el remitente recibe un datagrama TCP con un tamaño de ventana de 0 en el receptor, deja de enviar datos hasta que el receptor envíe un datagrama con un tamaño de ventana distinto de 0.
Control de flujo de ventana variable:

  1. Ventana de notificación: el tamaño de la ventana establecida por el extremo receptor de acuerdo con la capacidad de recibir segmentos TCP en ese momento.
  2. Ventana de congestión: El tamaño de la ventana establecida por el remitente de acuerdo con la congestión de la red. (Cuanto mayor sea la ventana de congestión, mayor será la cantidad de datos que se pueden enviar)

En circunstancias normales, el valor de la ventana de envío es MIN (ventana de notificación, ventana de congestión). Durante el proceso de transmisión de datos, el flujo se puede controlar cambiando la ventana. (El control de flujo no solo puede permitir al extremo receptor suficiente tiempo para recibir y procesar datos, sino también evitar que la red se bloquee). El proceso de usar ventanas variables para el control de flujo se muestra en la figura:

4.5 gestión de la conexión de transporte TCP

El método de establecimiento de la conexión TCP es un protocolo de enlace de tres vías, y el método de desconexión es de cuatro manos de onda. Los dos mecanismos se describen a continuación:

@ 1 El proceso de apretón de manos de tres vías se muestra en la figura:

La descripción del proceso es la siguiente:

  1. El cliente envía un SYN al servidor y luego espera a que el servidor envíe un mensaje de confirmación.
  2. El servidor envía un SYN y ACK al cliente para confirmar que ha recibido el mensaje del cliente.
  3. Después de que el cliente recibe el mensaje de confirmación del servidor, devuelve un ACK al servidor y luego se puede establecer una conexión confiable con el servidor.

Cuatro ondas: debido a que la conexión TCP / IP es full-duplex, cada dirección debe cerrarse individualmente. El proceso de agitar cuatro veces se muestra en la figura:
 

La descripción del proceso es la siguiente:

  1. Después de que el cliente envía datos al servidor, establece FIN en 1 y le dice que cerraré la conexión de datos en esta dirección.
  2. Después de recibir el FIN, el servidor cierra la conexión de datos en esta dirección. Establezca ACK en 1 para decirle al cliente que la información del cliente ha sido recibida y procesada.
  3. Al mismo tiempo, el servidor solicita al cliente que desconecte la conexión de datos en la dirección opuesta. Establezca FIN en 1.
  4. El cliente recibe la aplicación del servidor, establece ACK en 1 y ambas partes cierran la conexión al mismo tiempo.
Publicado 289 artículos originales · elogiados 47 · 30,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/vviccc/article/details/105172478
Recomendado
Clasificación