为什么 TCP/IP 套接字被视为“打开文件”?

为什么 TCP/IP 套接字被视为“打开文件”?

我需要一些帮助来理解 Linux 中的一个基本概念:打开文件的限制。具体来说,我很困惑为什么打开的套接字可以计入系统上“打开的文件”的总数。

有人可以详细说明一下原因吗?我知道这可能可以追溯到 Linux 中的整个“一切都是文件”原则,但任何其他细节将不胜感激。

答案1

“打开文件”的限制实际上不仅仅针对文件。这是数量限制内核句柄单个进程可以同时使用。从历史上看,程序通常会打开大量文件,因此这被称为对打开文件数量的限制。有一个限制可以帮助防止进程打开大量文件并意外忘记关闭它们,这最终会导致系统范围的问题。

套接字连接也是内核句柄。因此,相同的限制适用于相同的原因 - 进程可能打开网络连接并忘记关闭它们。

正如评论中所指出的,内核句柄传统上称为文件描述符在类 Unix 系统中。

答案2

原因为什么 TCP/IP 套接字使用文件描述符是这样的,当套接字接口第一次被设计和实现时(在 BSD Unix 中,1983 年),其设计者认为网络连接类似于文件 - 可以readwrite、 ,并且close两者都可以,并且它非常适合 Unix 的“一切都是文件”的理念。

其他 TCP/IP 网络堆栈实现不一定与其操作系统的文件 I/O 子系统集成,例如MacTCP。但是由于 BSD 套接字接口非常流行,甚至这些其他实现也选择使用其类 Unix 功能来复制套接字 API,因此您得到了“文件描述符”,仅用于 TCP/IP 通信,而系统上则不然有文件描述符。

你问题的另一部分是为什么有限制?这是因为实现文件描述符查找表的最快方法是使用数组。从历史上看,该限制被硬编码到内核中。

下面是 Unix release 7 (1979) 中的代码,每个进程硬编码限制 20 个文件描述符:

相比之下,Linux 为进程的文件描述符表动态分配空间。绝对限制默认为 8192,但您可以将其设置为您喜欢的任何值。我的系统在/proc/sys/fs/file-max.

尽管Linux不再有绝对的限制,但我们不想让程序变得疯狂,因此管理员(或发行版打包者)通常会设置资源限制。看看/etc/security/limits.conf,或者跑ulimit -n

答案3

文件不仅仅是磁盘上或内存中的文件;它们是数据流,这只是其中的两个例子。

远程端点是第三个示例,您可以使用套接字与远程端点进行交互。

相关内容