¿Por qué los sockets TCP / IP se consideran "archivos abiertos"?

29

Necesito ayuda para comprender lo que estoy seguro es un concepto fundamental en Linux: el límite para archivos abiertos. Específicamente, estoy confundido sobre por qué los sockets abiertos pueden contar para el número total de "archivos abiertos" en un sistema.

¿Alguien puede explicar por qué? Entiendo que esto probablemente se remonta a todo el principio de "todo es un archivo" en Linux, pero cualquier detalle adicional sería apreciado.

Mike B
fuente

Respuestas:

34

El límite en "abrir archivos" no es realmente solo para archivos. Es un límite en la cantidad de controladores de kernel que un solo proceso puede usar al mismo tiempo. Históricamente, lo único que los programas normalmente abrían muchos archivos eran, por lo que esto se conoció como un límite en la cantidad de archivos abiertos. Hay un límite para ayudar a evitar que los procesos digan, abriendo muchos archivos y olvidando accidentalmente cerrarlos, lo que eventualmente causará problemas en todo el sistema.

Una conexión de socket también es un controlador de kernel. Por lo tanto, se aplican los mismos límites por los mismos motivos: es posible que un proceso abra conexiones de red y olvide cerrarlas.

Como se señaló en los comentarios, los identificadores de kernel se denominan tradicionalmente descriptores de archivos en sistemas tipo Unix.

Greg Hewgill
fuente
23
"Manijas del núcleo" es una terminología de Windows. Prefiere referirse a los "descriptores de archivo", que es como se llama generalmente a estas entidades con Unix y Linux.
jlliagre
11
Esta respuesta cubre demasiado. Los sockets son archivos. Proporcionan acceso a secuencias de bytes a través de la interfaz read/ write, que es el corazón de lo que significa ser un archivo.
44
@ WumpusQ.Wumbley, pero luego tienes la shutdown(2)llamada al sistema en ellos, pero no en los archivos, y no puedes leer desde un socket usando cat, esa es la razón por la que netcatse ha creado. Diría que (afortunadamente) los sockets en núcleos tipo Unix se comportan como archivos en términos de E / S, pero la similitud termina allí. (Honestamente, también me gustaría saber de alguien con experiencia en el Plan 9, ya que escuché que obtuvieron la unificación de estas cosas más allá de los unices tradicionales).
kostix
@MikeB, este libro debería ponerte al día con la mayoría de los conceptos relacionados con Unix. Muy recomendable.
kostix
3
La idea de "todo es un archivo" significa que "archivo" es un tipo de datos abstracto con muchos subtipos. La mayoría de los subtipos admiten métodos adicionales además de los elementos básicos que admiten todos los archivos. los enchufes tienen muchos extras. bloquear dispositivos y archivos regulares tienen buscar. los directorios son realmente raros (la escritura no funciona y si la lectura funciona, no es útil). La presencia de métodos adicionales no significa que estas cosas no sean parte de la categoría general de cosas que llamamos "archivos".
27

La razón por qué sockets TCP / IP descriptores de fichero uso es que, cuando la interfaz de sockets fue diseñado e implementado (primero en BSD Unix, en 1983 ), sus diseñadores consideró que una conexión de red fue análoga a un archivo - que puedas read, writey closetanto , y que encajaría bien con la idea de Unix de "todo es un archivo".

Otras implementaciones de pila de red TCP / IP no necesariamente se integraron con el subsistema de E / S de archivo de su sistema operativo, un ejemplo es MacTCP . Pero debido a que la interfaz de sockets BSD era tan popular, incluso estas otras implementaciones optaron por replicar la API de sockets con sus funciones tipo Unix, por lo que obtuviste "descriptores de archivos", que solo se utilizan para la comunicación TCP / IP, en sistemas que no lo hicieron de otra manera tener descriptores de archivo.

La otra parte de su pregunta es ¿por qué hay un límite? Se debe a que la forma más rápida de implementar una tabla de búsqueda de descriptores de archivo es con una matriz. Históricamente, el límite estaba codificado en el núcleo.

Aquí está el código en Unix versión 7 (1979) con un límite codificado de 20 descriptores de archivo por proceso:

En comparación, Linux asigna dinámicamente espacio para la tabla de descriptores de archivo de un proceso. El límite absoluto predeterminado es 8192, pero puede establecerlo en lo que quiera. Mi sistema enumera 191072 en /proc/sys/fs/file-max.

A pesar de que ya no existe un límite absoluto en Linux, no queremos dejar que los programas se vuelvan locos, por lo que el administrador (o el empaquetador de distribución) generalmente establece límites de recursos. Echa un vistazo /etc/security/limits.confo corre ulimit -n.

Stuart Caie
fuente
Una de las mejores respuestas en este tema, gracias
user859375
6

Los archivos no son solo archivos en el disco o en la memoria; son flujos de datos, de los cuales esos son solo dos ejemplos.

Los puntos finales remotos son un tercer ejemplo, e interactúa con aquellos que usan sockets.

La ligereza corre con Mónica
fuente
2
Bienvenido a U & L.SE. Me gusta esta respuesta
eyoung100