Implementación de enlace y escucha de socket
El uso de la función bind() es muy sencillo, pero ¿cómo se implementa?
Este artículo comenzará desde la capa de aplicación y analizará las llamadas al sistema de bind() y listening(), la implementación de la capa de Socket y su implementación de la capa TCP a lo largo de la pila de protocolos de red.
Capa de aplicación
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
bind() le da al socket sockfd la dirección local my_addr);
Vincula la IP y el puerto al descriptor del socket, que generalmente es requerido por el servidor. El rango de números de puerto es 0 ~ 65535. Al llamar a bind(), generalmente no establezca el número de puerto en un valor inferior a 1024, porque del 1 al 1023 son números de puerto reservados.
La llamada al sistema
bind() la proporciona glibc, la declaración se encuentra en include/sys/socket.h y la implementación se encuentra en sysdeps/mach/hurd/bind. .c Principalmente se utiliza para ingresar la llamada al sistema llamada sys_socketcall desde el espacio de usuario y pasar parámetros. sys_scoketcall() es en realidad la entrada común para que todas las funciones de socket ingresen al espacio del kernel.
sys_bind() se llamará en sys_socketcall().
Después de pasar la entrada general de la capa de socket, sys_socketcall(), ahora ingresa sys_bind().
Después de pasar la entrada general de la capa de socket, sys_socketcall(), ahora ingresa sys_bind().
Busque la estructura de archivo correspondiente a través del descriptor de archivo.
Encuentre la estructura de socket correspondiente a través de la estructura del archivo.
Copie la dirección del socket del espacio del usuario al espacio del kernel y verifique si es legal. Devuelve 0 si tiene éxito.
capa de socket
El ejemplo del conjunto de funciones de operación de la capa de socket del socket SOCK_STREAM es inet_stream_ops, y la función de enlace es inet_bind().
Lo principal que hace la capa de socket es verificar la legalidad y vincular la dirección IP, mientras que la vinculación del puerto real se realiza en la capa TCP.
Capa de aplicación
int listening(int sockfd, int backlog
Acepta conexiones entrantes y un límite de cola para conexiones entrantes
Ahora especifica la longitud de la cola para sockets completamente establecidos en espera de ser aceptados,
en lugar del número de solicitudes de conexión incompletas. La longitud máxima de la cola
. p>
p>
para sockets incompletos se puede configurar usando tcp_max_syn_backlog sysctl. Cuando las cookies sincronizadas
están habilitadas, no hay una longitud máxima lógica y esta configuración de sysctl se ignora. p> Cola de conexión completa La longitud máxima:
El trabajo pendiente guarda la conexión completa que ha completado el protocolo de enlace de tres vías y está esperando aceptación, no la media conexión.
Cuando la carga no es alta, no es necesario que el trabajo pendiente sea demasiado grande. (Para conexiones completas)
El número máximo de conexiones completas sin procesar en el sistema es: min (atrasos, somaxconn), net.core.somaxconn por defecto es 128.
La longitud máxima de la cola semiconectada:
El valor predeterminado de tcp_max_syn_backlog es 256. (Para conexiones incompletas)
Cuando se utiliza la cookie SYN, este parámetro deja de ser válido.
La longitud máxima de la cola semiconectada es el valor mínimo de backlog, somaxconn y tcp_max_syn_backlog.
listen() es proporcionado por glibc. La declaración se encuentra en include/sys/socket.h y la implementación se encuentra en sysdeps/mach/hurd/listen.c. el programa llamado System call of sys_socketcall y pasa parámetros. sys_socketcall() es en realidad la entrada única para que todas las funciones de socket ingresen al espacio del kernel.
sys_listen() será llamado en sys_socketcall().
Después de pasar la entrada general de la capa de socket, sys_socketcall(), ahora ingresa sys_listen().
El ejemplo del conjunto de funciones de operación de la capa de socket del socket SOCK_STREAM es inet_stream_ops, y la función de escucha es inet_listen().
Verifique si el estado del socket y la conexión actual son legales y luego llame a inet_csk_listen_start() para comenzar a escuchar.
Al comenzar a escuchar, el trabajo incluye principalmente:
La estructura listening_sock se utiliza para guardar el bloque de solicitud de conexión en el estado SYN_RECV, por lo que también se le llama cola de semiconexión.
(1) Crear cola
es el bloque de control de solicitud de conexión, nr_table_entries es el número máximo de semiconexiones, es decir, acumulación.
(2) Destrucción
Destruye la instancia de listening_sock en el bloque de solicitud de conexión y libera la cola de semiconexión.