Cómo implementar la transmisión de datos de red

Tabla de contenido

prefacio

1. Comprender la dirección IP de origen y la dirección IP de destino

2. Comprender los números de puerto

2.1 La relación entre el número de puerto y el pid del proceso

2.2 Número de puerto de origen y número de puerto de destino

3. Acuerdo

3.1 Protocolo TCP

3.2 Comprender el protocolo UDP

4. Orden de bytes de red

5. interfaz de programación de enchufe

Resumir


prefacio

       En el artículo anterior, el marco de trabajo de la red le brindó una macro introducción a la red como un todo. En este artículo, veremos más de cerca cómo dos hosts realizan la comunicación de datos de la red.

1. Comprender la dirección IP de origen y la dirección IP de destino

        Al realizar la comunicación entre diferentes hosts, primero debe conocer la dirección IP de la otra parte, al igual que el monje Tang aprendió de la dinastía Tang del Este al Paraíso Occidental.La dinastía Tang del Este puede entenderse como la dirección IP de origen, y el Paraíso Occidental puede entenderse como la dirección IP de destino.El requisito previo para que cada host realice la comunicación de datos es la necesidad de tener una dirección IP.

Cómo verificar la dirección IP en su propio host: ifconfig

2. Comprender los números de puerto

        Cuando tenemos la dirección IP de la otra parte, llegamos al host de la otra parte a través del enrutamiento continuo en el medio, pero ¿se puede realizar la comunicación de datos de esta manera? La respuesta es que los datos que llegan a la computadora host de la otra parte solo completan el primer paso, y en realidad no completan la comunicación de datos, al igual que el monje Tang no recibió las escrituras cuando llegó a Xitian. Después de llegar al host, la comunicación real es el proceso en el host, entonces, ¿qué pasa si se encuentra el proceso en el host?

Para identificar la unicidad del proceso, se propone el concepto de número de puerto en la comunicación de red, y el número de puerto se utiliza para encontrar un proceso de forma única. En este momento, con la dirección IP más el número de puerto, se puede identificar un proceso único en toda la red y luego la transmisión de datos se puede realizar con precisión durante la comunicación de datos de la red.

2.1 La relación entre el número de puerto y el pid del proceso

        El número de puerto es un entero de 16 bits de 2 bytes que identifica un proceso en el host. En este momento, algunos amigos cuidadosos pueden pensar que dado que el número de puerto identifica de manera única un proceso en el host, el pid del proceso no es ¿Identifica de forma única un proceso? ¿Por qué introducir el número de puerto? ¿Por qué no reutilizar el pid directamente?

        La respuesta es que esta solución es técnicamente posible, pero la razón para introducir el número de puerto es considerar las siguientes razones:

A. Para el desacoplamiento de red y sistema.

b. Generalmente, el número de puerto del servidor no se puede cambiar fácilmente. Después de que el proceso finalice, reinicie el proceso y vuelva a iniciarlo, y el pid del proceso se enviará y cambiará.

c. No todos los procesos realizarán servicios y solicitudes de red, pero todos los procesos deben tener pid

¿Cómo encuentra el sistema operativo subyacente el proceso correspondiente en función del puerto?

El sistema operativo mantiene una tabla hash para el puerto como valor clave, y el valor es el PCB de proceso

Nota: un proceso puede vincular varios números de puerto, pero un número de puerto no puede vincularse a varios procesos;

2.2 Número de puerto de origen y número de puerto de destino

        Después de comprender el número de puerto, el llamado número de puerto de origen es el proceso del host emisor desde el que se envían los datos, y el número de puerto de destino es el proceso del host receptor.

3. Acuerdo

        En el artículo anterior, introdujimos que la implementación de la comunicación de datos de red debe cumplir con el acuerdo. Hoy, el acuerdo puede aclararse aún más. Con la dirección IP y el número de puerto, brinda soporte técnico para la realización de la comunicación de datos. Cuándo hacer ¿Necesita decirle a la otra parte su dirección IP y número de puerto? Obviamente, se necesita la respuesta, entonces, ¿cómo decirle a la otra parte?

Necesita usar el protocolo Al enviar datos, los campos de dirección IP y número de puerto correspondientes se completan en el encabezado del protocolo.

Aquí presentamos principalmente dos protocolos, uno es el protocolo TCP y el otro es el protocolo UDP.

3.1 Protocolo TCP

Aquí primero tenemos una comprensión intuitiva de TCP (Protocolo de control de transmisión); lo presentaremos en detalle más adelante.


Conexión de protocolo de capa de transporte Secuencia de bytes orientada
al transporte confiable

3.2 Comprender el protocolo UDP

Aquí también tenemos una comprensión intuitiva de UDP (Protocolo de datagramas de usuario); lo discutiremos en detalle más adelante.

Protocolo de capa de transporte
Sin conexión
Transporte no fiable
Orientado a datagramas

Nota: Los detalles específicos sobre el protocolo TCP y el protocolo UDP se presentarán más adelante. Después de leer la breve introducción anterior, creo que todos tienen una comprensión intuitiva de que TCP es una transmisión confiable y UDP es una transmisión no confiable. Tal vez los amigos curiosos pregunten: es una transmisión poco confiable, ¿por qué mantenerla? ¿No sería mejor utilizar un transporte fiable?

La respuesta es que confiable y no confiable son palabras neutrales en Internet. No significa que confiable sea necesariamente bueno y no confiable sea necesariamente malo. Confiable y no confiable se determinan de acuerdo con diferentes escenarios. La implementación confiable tiene un cierto costo y es más complicada en cuanto a mantenimiento y codificación, mientras que no confiable significa un mantenimiento y codificación más fáciles. En el proceso de transmisión de datos de red, no se permite la pérdida de datos. En este momento, se puede usar el protocolo TCP, pero en el proceso de transmisión de datos, se permite que se pierdan algunos paquetes y se puede usar UDP.

4. Orden de bytes de red

        Con el soporte técnico anterior, podemos realizar la comunicación de datos entre las dos partes. A continuación, debemos considerar algunos problemas cuando se envían los datos. Ya sabemos que los datos de varios bytes en la memoria tienen big-endian y Little endian. , los datos de varios bytes en el archivo de disco también se dividen en big endian y small endian en relación con la dirección de desplazamiento en el archivo, y el flujo de datos de red también se divide en big endian y small endian. Entonces, ¿cómo definir la dirección de el flujo de datos de la red?

El host emisor generalmente envía los datos en el búfer de envío en el orden de las direcciones de memoria de menor a mayor; el
host receptor almacena los bytes recibidos de la red en el búfer de recepción en secuencia, también en el orden de las direcciones de memoria de menor a mayor Por lo tanto
, la dirección del flujo de datos de la red debe especificarse de la siguiente manera: los datos enviados primero son la dirección baja y los datos enviados después son la dirección alta. El protocolo TCP/IP estipula
que el flujo de datos de la red debe adoptar la dirección grande. orden de bytes endian, es decir, la dirección baja es byte alto
Independientemente de si el host es big-endian o little-endian, enviará/recibirá datos de acuerdo con el orden de bytes de red especificado por este TCP/IP;
si el host de envío actual es un little-endian, necesita convertir los datos en una gran terminal, de lo contrario, ignórelo y envíelo directamente;

Para hacer que el programa de red sea portátil, de modo que el mismo código C pueda ejecutarse normalmente después de compilar en computadoras big-endian y little-endian, se pueden llamar las siguientes funciones de biblioteca para convertir el orden de bytes de la red y el orden de bytes del host.

 Instrucciones de uso:

h significa host, n significa red, l significa entero largo de 32 bits y s significa entero corto de 16 bits.
htonl significa convertir un entero largo de 32 bits del orden de bytes del host al orden de bytes de la red, por ejemplo, convertir una dirección IP y prepararla para enviarla.
Si el host es little-endian, estas funciones convierten los parámetros al final del tamaño correspondiente y los devuelven;
si el host es big-endian, estas funciones no convierten y devuelven los parámetros sin cambios.

5. interfaz de programación de enchufe

        Como programador, solo debemos preocuparnos por el desarrollo de la capa de aplicación para realizar la comunicación de datos de red. La capa de transporte y la capa de red son mantenidas por el sistema operativo para nosotros. Dado que la capa inferior es mantenida por el sistema operativo, debemos llamar el sistema operativo para mejorarlo para nosotros Interfaz, conozcamos juntos la interfaz utilizada en la programación de redes

// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,
socklen_t address_len);
// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address,
socklen_t* address_len);
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);

Introduciremos los parámetros específicos de cada interfaz más adelante cuando codifiquemos. Aquí presentamos principalmente struct sockaddr*. Obviamente, esta es una estructura, entonces, ¿qué es exactamente esta estructura?

Acerca de la programación de sockets se divide principalmente en tres categorías

A. Programación de tomas de red

B. Zócalo sin procesar

socket interdominio c.unix

El primero puede lograr una comunicación local y entre hosts.

El segundo puede omitir directamente la capa de transporte y la capa de red y acceder directamente a la capa de enlace de datos, principalmente para la implementación de herramientas de captura de paquetes.

El tercero es implementar la comunicación local.

Con respecto a estos tres métodos, presentaremos principalmente la programación de sockets de red en el seguimiento. Aunque aquí hay tres métodos de comunicación, obviamente solo introdujimos un conjunto de interfaces arriba, entonces, ¿son todos aplicables? La respuesta es aplicable, entonces, ¿cómo hacerlo?

Al usar, pase diferentes estructuras. Inicialmente, es struct sockaddr. Si es una programación de socket de red, se verá obligado a struct sockaddr_in. Si es un socket entre dominios de Unix, se verá obligado a sockadd_un

como muestra la imagen:

Resumir

        Con el conocimiento anterior, podemos completar la codificación para realizar la comunicación de datos entre diferentes hosts. En el próximo artículo se presentará cómo completar la codificación.

Supongo que te gusta

Origin blog.csdn.net/qq_65307907/article/details/130463840
Recomendado
Clasificación