似乎至少有3种不同的本地/ unix套接字类型(AF_UNIX
),SOCK_STREAM
,SOCK_DGRAM
和SOCK_SEQPACKET
。
虽然我知道SOCK_STREAM
为您提供了双向字节流,如TCP或双向管道,而另外两个为您提供了一个消息/数据包API,但是{i}的unix套接字之间的区别是什么? {1}}和SOCK_DGRAM
?
因为这些只是本地的,所以我想不出有人以一种可以重新排序数据包的方式实现SOCK_SEQPACKET
的好理由。
此外,SOCK_DGRAM
/ SOCK_DGRAM
是否使用流量控制,或者在读取速度慢的情况下可以删除邮件?
答案 0 :(得分:23)
这是一篇关于SOCK_SEQPACKET
的预期用例的好文章,它在IP协议系列中并不真正可用,以及如何使用现有的TCP语义获得相同的东西:
http://urchin.earth.li/~twic/Sequenced_Packets_Over_Ordinary_TCP.html
请注意SOCK_SEQPACKET
与SOCK_STREAM
的行为距离SOCK_DGRAM
更接近。
引用引用的网站:
SOCK_SEQPACKET套接字类型类似于SOCK_STREAM类型,也是面向连接的。这些之间的唯一区别 types是使用的维护记录边界 SOCK_SEQPACKET类型。可以使用一个或多个输出发送记录 操作和使用一个或多个输入操作接收,但a 单个操作永远不会传输多个记录的部分内容。记录 通过MSG_EOR标志,接收器可以看到边界 收到recvmsg()函数返回的消息标志。它是 特定于协议的是否强加了最大记录大小。
答案 1 :(得分:8)
SOCK_SEQPACKET为您提供SOCK_STREAM的保证(即保留排序,保证传送,无重复),但是具有描述的数据包边界,就像SOCK_DGRAM一样。所以,基本上它是两种协议类型的混合。
在TCP / IP系列中,SCTP实现SOCK_STREAM(类似TCP)和SOCK_SEQPACKET。不幸的是,Windows上没有库存。
答案 2 :(得分:6)
socket(2)linux提供的联机帮助页:“DGRAM:数据报(无连接,不可靠的消息),SEQPACKET:有序,可靠,[双向]基于连接的数据报数据传输路径”。显着差异。
unix(7)linux提供的manpage说:“SOCK_DGRAM,用于面向数据报的套接字,用于保存消息边界[但不一定是顺序] [...] SOCK_SEQPACKET,用于面向连接的套接字,它保留消息边界并按照发送的顺序传递消息。“
标准允许您使用SOCK_DGRAM重新排序数据包。 (换句话说,如果操作系统按顺序将它们交给你,那就是特定于实现的功能。或者只是纯粹的计时运气。)
Linux中的af_file / af_unix实现中有流控制,但根本不需要与标准指定行为相关联。
答案 3 :(得分:1)
与TCP和UDP套接字一样,SCTP(流控制传输协议)套接字在端点之间有两种形式,(一对一)和(一对多)。一对一使用SOCK_STREAM,一对多使用SOCK_SEQPACKET
答案 4 :(得分:1)
我认为这里的主要区别是SOCK_SEQPACKET
不是面向连接的,而SOCK_DGRAM
不是。
当有多个客户端进程正在与之通信时,这在连接的 server 端(在UNIX套接字上侦听的进程)方面尤为重要:>
使用SOCK_DGRAM
,您将直接在侦听套接字上获得交错的客户端数据报。使用SOCK_SEQPACKET
,您将使用accept
为每个客户端生成一个单独的 client 套接字,从而分别从每个客户端接收数据报。
引用man 3 accept
:
accept()系统调用与基于连接的套接字类型(SOCK_STREAM,SOCK_SEQPACKET)一起使用。