【问题标题】:Default protocol for AF_UNIX socketsAF_UNIX 套接字的默认协议
【发布时间】:2012-06-05 17:14:00
【问题描述】:

我很好奇 AF_UNIX SOCK_STREAM 套接字的默认协议是什么。我试图准确地追踪数据包开销应该是什么,但我无法弄清楚默认使用什么协议。我怀疑它是不是 IPPROTO_TCP,因为:

socketpair(AF_UNIX, SOCK_STREAM, 0, sfd) 

工作时,这个:

socketpair(AF_UNIX, SOCK_STREAM, IPPROTO_TCP, sfd) 

给出“协议不受支持的错误”。

【问题讨论】:

    标签: linux sockets unix networking


    【解决方案1】:

    由于 AF_UNIX unix 套接字是本地的,因此在这种情况下不会增加协议开销。您可以在 SOCK_STREAMSOCK_DGRAM 模式下分别使用它来使其面向连接或无连接,但仅此而已:不添加任何协议标头,并且不遍历任何网络或网络堆栈中的传输协议实现。

    【讨论】:

    • 这与我在here 发布的另一篇文章有​​关,在该文章中我看到通过 AF_UNIX 管道发送数据的开销很大(看起来在 200 到 300 字节之间)。所以如果没有协议头我很困惑。
    • 在源套接字和目标套接字之间复制数据时,内核内部会产生一些开销,尽管它本身并不是协议开销。在内核内部,这种复制经过了一定程度的优化,以使 skb 内存分配不会占用太多内存,参见例如net/unix/af_unix.c unix_stream_sendmsg().
    • 我对内核领域非常熟悉,所以 unix_stream_sendmsg() 有点超出我的能力,但我无法想象有 200+ 字节的开销吗?这就是我所看到的。
    • 如果我使用管道,我可以准确地推送我认为应该能够的数据量,因此 unix 域套接字肯定会增加某种开销......
    【解决方案2】:

    AF 代表 A 地址 F amily 而 PF 代表 P rotocol F amily.

    AF_UNIX 系列没有该地址系列支持的协议 IPPROTO_TCP。 AF_UNIX 用于 UNIX® 域中同一系统上的进程之间的进程间通信。 AF_UNIX 和 AF_UNIX_CCSID 地址族支持 SOCK_STREAM 和 SOCK_DGRAM 的协议 0。

    在此处阅读更多信息:Sockets

    【讨论】:

    • 我知道他们支持协议 0,但据我所知,这只是告诉它使用默认值,我很好奇默认值是什么。
    • @gct:协议是AF_UNIX,这意味着它使用进程间通信通过文件进行通信。协议名称是 PF_UNIX。
    【解决方案3】:

    使用 AF_UNIX 时唯一有效的“协议”为零。

    看看socket(2)unix(7)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 2013-02-04
      相关资源
      最近更新 更多