2012-06-05 117 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