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


29

我需要一些帮助,以确保我确定这是Linux中的一个基本概念:打开文件的限制。具体来说,我对为何打开的套接字可以计入系统中“打开文件”总数的情况感到困惑。

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

Answers:


34

“打开文件”的限制并不仅仅针对文件。这是对单个进程一次可以使用的内核句柄数量的限制。从历史上看,程序通常只能打开很多文件,因此这被称为对打开文件数量的限制。有一个限制可以防止进程说,打开很多文件而无意间忘记关闭它们,这最终会导致系统范围的问题。

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

如注释中所述,在类似Unix的系统中,内核句柄通常称为文件描述符


23
“内核句柄”是Windows术语。您宁愿参考“文件描述符”,这是在Unix&Linux中通常如何调用这些实体的方式。
jlliagre 2014年

11
这个答案对冲太多。套接字文件。它们通过read/ write接口提供对字节流的访问,这是文件的核心。

4
@ WumpusQ.Wumbley,但是然后您对其进行了shutdown(2)syscall,但是对文件却没有,并且无法使用套接字从套接字读取cat-这就是netcat创建原因。我会说(幸运的是)类Unix内核中的套接字在I / O方面的行为类似于文件,但相似之处到此就结束了。(说实话,我也想听听有Plan 9经验的人,因为我听说他们对这些事情的统一程度远胜于传统的unices)。
kostix

@MikeB,这本书应该使您掌握与Unix有关的大多数概念。强烈推荐。
kostix

3
“一切都是文件”的想法意味着“文件”是具有许多子类型的抽象数据类型。除了所有文件都支持的基本内容之外,大多数子类型还支持其他方法。套接字有很多附加功能。阻止设备和常规文件进行查找。目录确实很奇怪(写不起作用,如果读有效,则没有用)。多余方法的存在并不意味着这些东西不属于我们称为“文件”的事物的总类别。

27

究其原因,为什么TCP / IP套接字使用文件描述符的是,当套接字接口最初设计和实施(在BSD Unix的,于1983年),它的设计者认为,网络连接是类似于一个文件-你可以readwriteclose两个,并且非常适合Unix的“一切都是文件”的想法。

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

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

以下是Unix版本7(1979)中的代码,每个进程使用硬编码限制20个文件描述符:

  • user.hstruct file *u_ofile[NOFILE]
  • param.h#define NOFILE 20

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

尽管Linux中不再存在绝对限制,但是我们不想让程序发疯,因此管理员(或分发打包程序)通常会设置资源限制。看一看/etc/security/limits.conf,还是跑ulimit -n


这个主题中最好的答案之一,谢谢
user859375 '18

6

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

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


2
欢迎来到U&L.SE。我喜欢这个答案。
eyoung100
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.