Unix域套接字的原理。它是如何工作的?

16

我正在研究Unix域套接字,特别是它的工作原理。我使用了多个关键词进行谷歌搜索,但结果都是关于API、系统调用、如何使用以及示例等方面的内容。我也读到了有关管道和FIFO的文章,因为Unix域套接字被称为与管道和FIFO相同,但我仍想更多地了解Unix域套接字的概念/原理。它是如何工作的?(也许在内核级别,因为维基百科说:“这允许两个进程打开同一个套接字以进行通信。然而,通信完全发生在操作系统内核中。”)

我仍然想知道为什么Unix域套接字的文档比管道或FIFO少呢?也许是因为它出生于很多年前?

请问有没有人能给我一些想法或者推荐一些书籍/链接来阅读?

提前致谢!


对于一本书,建议阅读 W. Richard Stevens 的《Unix 网络编程》第一卷。第三版是最新的,但如果你在当地图书馆找不到,买一本二手的第二版会便宜得多,也足够使用。 - rob mayoff
感谢@robmayoff提供的书籍,我已经阅读了它。但是它只讲解了UDS API :( 我需要关于内核级别下数据如何发送或接收的信息。就像这里讲到的管道一样:http://www.tldp.org/LDP/lpg/node10.html#SECTION00721000000000000000 谢谢! - leokaka
TCP/IP详解卷3:TCP事务、HTTP、NNTP和UNIX域协议,同样由W. Richard Stevens所著。 - rob mayoff
@robmayoff:谢谢,我正在阅读那本书! - leokaka
UDS实际上比FIFO更强大,而不是更弱。 - Omnifarious
1个回答

33

Unix套接字与其他套接字类型一样使用。这意味着,它们使用套接字系统调用。FIFO和Unix套接字之间的区别在于,FIFO使用文件系统调用,而Unix套接字使用套接字调用。

Unix套接字被视为文件。这允许使用文件权限进行访问控制。

Unix套接字通过套接字系统调用创建(而FIFO由mkfifo创建)。如果您需要客户端套接字,则调用connect,传递其服务器套接字地址。如果您需要服务器套接字,则可以绑定以分配其地址。而对于FIFO,则使用打开调用执行IO操作的读/写。

Unix套接字可以区分其客户端,而FIFO不能。有关同行的信息由accept呼叫提供,它返回同行的地址。

Unix套接字是双向的。这意味着每个方向都可以执行读取和写入操作。而FIFO是单向的:它有一个写入对等点和一个读取对等点。

Unix套接字创建的开销较小,通信速度比本地主机IP套接字快。数据包无需像本地主机套接字那样经过网络堆栈。因为它们仅存在于本地,所以没有路由。

如果您需要了解Unix套接字在内核级别上的工作原理的更多详细信息,请查看Linux内核源代码中的net/unix/af_unix.c文件。


如果您对我的回答感到满意,请将其设置为最佳答案。或者在评论中添加需要进一步解释的内容。 - Андрей Москвичёв
谢谢您提供的信息,但我已经阅读了这些信息。 :( 您能否请给我更多关于如何发送和接收数据的细节?它是否使用文件I/O?谢谢! - leokaka
请查看此链接http://tkhanson.net/cgit.cgi/misc.git/plain/unixdomain/Unix_domain_sockets.html。我认为它会很有帮助。 - Андрей Москвичёв
1
谢谢您的信息,Андрей Москвичёv。我同意您关于如何通过套接字API使用UDS的看法。但我仍想确切地知道当调用发送/接收函数时内核会做什么。它们是文件,但它们如何连接,发送和接收数据?我需要有关内核级别发生的情况的信息。一些关于UDS概念的东西,就像这个链接中的Pipes:http://www.tldp.org/LDP/lpg/node10.html#SECTION00721000000000000000 谢谢! - leokaka
你的文本没有回答问题“它是如何工作的”。你只是从互联网上复制/粘贴了关于套接字的一般事实。你没有解释它们是如何工作的,一个套接字如何“监听”。 - Green
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接