Unix 域SOCK_DGRAM和 SOCK_SEQPACKET 之间的区别?

Difference between Unix domain SOCK_DGRAM and SOCK_SEQPACKET?

提问人:RTC222 提问时间:5/3/2020 更新时间:5/4/2020 访问量:1914

问:

根据 Unix 套接字的 Linux 手册页,“UNIX 域中的有效套接字类型是......SOCK_DGRAM,对于保留消息边界的面向数据报的套接字(与大多数 UNIX 实现一样,UNIX 域数据报套接字始终是可靠的,并且不会对数据报重新排序);(从 Linux 2.6.4 开始)SOCK_SEQPACKET,对于面向连接的序列数据包套接字,保留消息边界,并按照发送消息的顺序传递消息。(http://man7.org/linux/man-pages/man7/unix.7.html)。

我认为“始终可靠,不要对数据报重新排序”与“按发送顺序传递消息”相同。

SOCK_DGRAM 和 SOCK_SEQPACKET 有什么实际区别?

C Linux 套接字 Unix POSIX

评论

1赞 bruno 5/3/2020
套接字SOCK_DGRAM是流,套接字SOCK_SEQPACKET交换数据包(如SOCK_DGRAM所以UDP除了UDP连接较少,您可能会丢失数据包)
0赞 RTC222 5/3/2020
根据上面引用的手册页,“SOCK_STREAM,对于面向流的套接字;SOCK_DGRAM,用于面向数据报的套接字。我认为差异可能包括更多的东西。
1赞 bruno 5/3/2020
您了解数据包/消息之间的区别吗?
1赞 bruno 5/3/2020
它不是写的SOCK_SEQPACKET总是可靠的,可能不是,你可以松开数据包
1赞 RTC222 5/3/2020
非常好的观点。因此,它们都按照发送的顺序传递消息,但不能保证SOCK_SEQPACKET可靠,就像SOCK_DGRAM一样。

答:

0赞 Yashasvi.G 5/3/2020 #1

在UDP和TCP的帮助下,可以更好地理解这种差异。 像UDP(less-connection-less)这样的协议使用SOCK_DGRAM、实现

像TCP(connection-oriented )这样的协议使用SOCK_STREAM。但是,甚至可以使用SOCK_SEQPACKET。两者之间的差异非常小,TCP也可以使用后者来实现。事实上,SOCK_SEQPACKET在某种程度上是两者的混合体。 STCP 是 SOCK_SEQPACKET 的一个用例。本文说明:http://urchin.earth.li/~twic/Sequenced_Packets_Over_Ordinary_TCP.html

这是一篇详细讨论这个问题的帖子

3赞 Erki Aring 5/3/2020 #2

在 UNIX 域套接字的上下文中,两者之间的主要区别是“面向数据报”与“面向连接”。

如果SOCK_DGRAM您不创建连接(例如,与服务器),则只需将数据包发送到服务器套接字。如果服务器需要回复,你需要创建自己的套接字,让服务器知道这个套接字,然后服务器可以向它发送回复。非常不方便,如果你真的需要连接,但当你只需要单向通信时会很有用,即发送一些通知。

当您需要面向连接的方法时,SOCK_SEQPACKET是要走的路。