¿Cómo usar sockets de linux?

  

Sabemos que muchas aplicaciones, como el correo electrónico, la web y la mensajería instantánea, dependen de la web para hacerlo. Cada una de estas aplicaciones se basa en un protocolo de red específico, pero cada protocolo utiliza el mismo método de transporte de red general. Muchas personas no saben que hay lagunas en el protocolo de red en sí. Este artículo aprenderá cómo usar sockets para hacer que las aplicaciones accedan a la red y cómo lidiar con las vulnerabilidades comunes de la red.

1. Sockets

Los sockets son una forma estándar de realizar la comunicación de red a través de OS (OS). Un zócalo puede considerarse como un terminal conectado a una conexión, como un zócalo en un panel de operador. Pero estos sockets son solo nombres abstractos para los programadores, y son responsables de todos los detalles básicos del modelo OSI descrito en el texto. Para los programadores, puede usar un socket para enviar o recibir datos a través de la red. Estos datos se transmiten a la capa inferior (procesada por sistema operativo
) en la capa de sesión (5), que es responsable del enrutamiento. Hay varios sockets diferentes que determinan la estructura de la capa de transporte. Los tipos más comunes son los sockets de flujo y los sockets de datagramas.

Los sockets de transmisión por secuencias brindan una comunicación confiable de dos vías, que es similar a llamarle a usted y a otros. Una parte inicia una conexión con la otra parte, y después de establecer la conexión, cualquiera de las partes puede comunicarse con la otra parte. Además, las palabras que dice que llegan al destino se pueden confirmar rápidamente. Los sockets de flujo utilizan un protocolo de comunicación estándar denominado Protocolo de Control de Transmisión (TCP), que existe en la capa de transporte (4) del modelo OSI. En las redes de computadoras, los datos generalmente se transmiten en forma de grandes bloques de lo que llamamos paquetes. TCP está diseñado para que los paquetes lleguen a su destino en orden y no haya ningún error, al igual que cuando se habla por teléfono, las palabras llegan al otro extremo en el orden en que se hablan. Los servidores web, los servidores de correo y sus respectivas aplicaciones cliente se comunican utilizando TCP y sockets de transmisión.

Otro tipo común de socket es un socket de datagrama. El uso de la comunicación de socket de datagrama es más como enviar una carta en lugar de hacer una llamada. La conexión es unidireccional y poco fiable. Si envía algunas cartas, no se asegurará de que lleguen a su destino en el mismo orden en que fueron enviadas, e incluso si se envían a su destino, no hay garantía. Los servicios postales son bastante confiables, pero Internet no es confiable. El zócalo de datagrama utiliza un protocolo estándar llamado UDP en lugar de TCP en la capa de transporte (4). UDP significa User Datagram Protocol, lo que significa que se puede usar para crear protocolos personalizados. Este protocolo es muy básico y liviano, solo tiene unas pocas protecciones integradas. No es una conexión real, es solo una forma básica de enviar datos de un extremo al otro. Cuando se usan sockets de datagramas, la sobrecarga del sistema en el protocolo es muy pequeña, pero el protocolo no tiene mucha funcionalidad. Si el programa necesita verificar que la otra parte ha recibido el paquete, debe programarse para que la otra parte envíe un paquete de confirmación. En algunos casos, la pérdida de paquetes puede ser aceptada. Los zócalos de datagramas y UDP se usan comúnmente en juegos en línea y en medios de transmisión porque los desarrolladores pueden ajustar sus comunicaciones con precisión según sea necesario sin la sobrecarga inherente de TCP.

2. Funciones de socket

En C, los sockets se comportan como archivos porque usan descriptores de archivo para identificarse. El comportamiento de un socket es muy similar al de un archivo. De hecho, al usar el descriptor de archivo de socket, puede recibir y enviar datos usando las funciones read () y write (). Sin embargo, hay varias funciones que están diseñadas específicamente para manejar sockets. Hay definiciones de estos prototipos de funciones en el archivo /usr/include/sys/socket.h.

extern int socket (int __domain, int __type, int __protocol) __THROW;

se utiliza para crear un nuevo socket, devolviendo un descriptor de archivo una vez que se muestra el socket. Vuelva a -1 cuando se produce el error. Conexión externa externa (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);

Conecte un socket (especificado por el descriptor de archivos fd) al host remoto. Devuelve 0 con éxito y el error devuelve -1.

Escucha (int fd, int backlog_queue_size)

Escucha las conexiones entrantes y las solicitudes de conexión en cola: hasta que el número llegue a backlog_queue_size. Devuelve 0 con éxito y el error devuelve -1.

extern int accept (int __fd, __SOCKADDR_ARG __addr, socklen_t * __ restrict __addr_len);

Se acepta una conexión entrante en un puerto vinculado. La información de dirección del host remoto se escribe en la estructura del host remoto y el tamaño real de la estructura de la dirección se escribe en addr_len. Esta función devuelve un nuevo descriptor de archivo de socket para identificar el socket conectado, y el error devuelve -1.

extern ssize_t send (int __fd, __const void * __ buf, size_t __n, int __flags);

Envíe n bytes desde * __ buf al socket fd, se envía el valor de retorno El número de bytes, el error devuelve -1.

extern ssize_t recv (int __fd, void * __ buf, size_t __n, int __flags);

Reciba n bytes del socket fd en * __ buf, se recibe el valor de retorno El número de bytes, el error devuelve -1.

Cuando creas un socket usando la función socket (), debes especificar el dominio, el tipo y el protocolo del socket. Un dominio se refiere a una familia de protocolos de sockets. Los sockets se pueden comunicar utilizando una variedad de protocolos, desde los protocolos estándar de Internet que se usan cuando se navega por Internet hasta los protocolos de radioaficionados, como AX.25 (si usted es un entusiasta de la radio). Estas familias de protocolos se definen en bits /socket.h y se incluyen automáticamente en sys /socket.h.

/usr/include/bits/socket.h Fragmento 1

/* Familias de protocolos. * /

#define PF_UNSPEC 0 /* Sin especificar. * /

#define PF_LOCAL 1 /* Local to host (canalizaciones y dominio de archivos). * /

#define PF_UNIX PF_LOCAL /* Nombre antiguo de BSD para PF_LOCAL. * /

#define PF_FILE PF_LOCAL /* Otro nombre no estándar para PF_LOCAL. * /

#define PF_INET 2 /* Familia de protocolos IP. * /

#define PF_AX25 3 /* Radioaficionado AX.25. * /

#define PF_IPX 4 /* Novell Internet Protocol. * /

#define PF_APPLETALK 5 /* Appletalk DDP. * /

#define PF_NETROM 6 /* Amateur Radio NetROM. * /

# define PF_BRIDGE 7 /* Puente multiprotocolo. * /

# define PF_ATMPVC 8 ​​/* ATM PVCs. * /

#define PF_X25 9 /* Reservado para el proyecto X.25. * /

#define PF_INET6 10 /* IP versión 6. * /

Como se mencionó anteriormente, aunque el flujo está conectado al molde y el datagrama está enchufado. Las palabras se usan con más frecuencia, pero hay varios otros tipos de enchufes. El tipo de socket también se define en bits /socket.h (/* comment * /en el código anterior es otra forma de comentario que comentará todo el contenido entre asteriscos). /usr/include/bits/socket.h Fragmento 2

/* Tipos de sockets. * /

enum __socket_type

{

SOCK_STREAM = 1 , /* Secuencias, confiables, basadas en conexión

flujos de bytes. * /

#define SOCK_STREAM SOCK_STREAM

SOCK_DGRAM = 2, /* Datagramas sin conexión y no confiables

de longitud máxima fija. * /

#define SOCK_DGRAM SOCK_DGRAM

Copyright © Conocimiento de Windows All Rights Reserved