AF_UNIX套接字的默认协议是什么?

7

我很好奇AF_UNIX SOCK_STREAM套接字的默认协议是什么。我正在尝试查找数据包开销应该是多少,但我无法确定默认使用的协议是什么。我怀疑它不是IPPROTO_TCP,因为:

socketpair(AF_UNIX, SOCK_STREAM, 0, sfd) 

工作时,这样做:

socketpair(AF_UNIX, SOCK_STREAM, IPPROTO_TCP, sfd) 

会出现“不支持的协议错误”。
3个回答

5

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


这与我之前发布的另一篇帖子有关在这里,在那里我发现通过AF_UNIX管道发送数据存在显着的开销(似乎在200到300字节之间)。所以如果没有协议头,我非常困惑。 - gct
当数据在源套接字和目标套接字之间进行复制时,内核中会存在一些开销,尽管这不是协议开销本身。在内核中,这种复制被优化,以使skb内存分配不会占用太多内存,例如参见net/unix/af_unix.c unix_stream_sendmsg()。 - ldx
我对内核领域有一定的了解,所以unix_stream_sendmsg()函数有点超出我的能力范围,但我想象不到会有200多个字节的开销,这就是我看到的。 - gct
1
如果我使用管道,我可以推送我认为应该能够推送的确切数据量,因此Unix域套接字肯定会添加某种开销... - gct

4

AF代表A地址F族,而PF代表P协议F族。

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

阅读更多信息:套接字


我知道它们支持协议0,但据我所知,那只是告诉它使用默认值,我想知道默认值是什么。 - gct
1
@gct:协议是AF_UNIX,这意味着它使用文件进行进程间通信。协议名称为PF_UNIX。 - user195488

2
使用 AF_UNIX 时唯一有效的“协议”是零。
请查看 socket(2)unix(7)

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