2012-06-05 104 views
4

我很好奇AF_UNIX SOCK_STREAM套接字的默认协议是什么。我试图找出数据包开销应该是什么,但我无法弄清楚默认使用哪种协议。我怀疑这是不是IPPROTO_TCP这是因为:AF_UNIX套接字的默认协议

socketpair(AF_UNIX, SOCK_STREAM, 0, sfd) 

作品,同时,这样的:

socketpair(AF_UNIX, SOCK_STREAM, IPPROTO_TCP, sfd) 

提供了一个 “不支持错误协议”。

回答

2

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

+0

这涉及到另一篇文章我发[这里](http://stackoverflow.com/questions/10899814/af-unix-socket-overhead),其中我看到一个大量的开销通过AF_UNIX管道发送数据(看起来在200到300个字节之间)。所以如果没有协议头我很困惑。 –

+0

当在源套接字和目标套接字之间复制数据时,内核中会有一些开销,尽管它本身不是协议开销。在内核内部,这种复制有点优化,可以使skb内存分配不会占用过多的内存,请参阅net/unix/af_unix.c unix_stream_sendmsg()。 – ldx

+0

我有一个非常熟悉的内核的土地,所以unix_stream_sendmsg()是有点超越我,但我无法想象有200多个字节的开销在那里?这就是我所看到的。 –

3

AF代表 ddress ˚F爱米莉而PF代表P rotocol ˚F爱米莉。

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

在这里阅读更多:Sockets

+0

我知道他们支持协议0,但就我而言知道这只是告诉它使用默认值,我很好奇默认值是什么。 –

+0

@ gct:该协议是AF_UNIX,这意味着它使用通过文件进行通信的进程间通信。协议名称是PF_UNIX。 – 2012-06-05 18:31:10