UNIX域STREAM和DATAGRAM套接字之间的区别?

这个问题不适用于STREAMtypes和DATAGRAMtypesINTERNET套接字之间的区别。 我知道STREAM套接字使用TCP,数据报套接字使用UDP和所有的TCP,UDP的东西,数据包到达顺序,ACK,NACK等。我明白这些在互联网上的重要性。

Q1)当我创build一个本地套接字的UNIX域套接字时,如果套接字是STREAM套接字或DATAGRAM套接字,会有什么关系。 这种types的套接字会将数据写入套接字文件,在这种情况下协议是否很重要,因为我不通过networking传输数据? 如果我使用基于UNIX的DATAGRAM套接字,在这种情况下是否有数据丢失的机会?

Q2)UNIX DATAGRAM套接字是否比UNIX STREAM套接字提供更好的性能?

Q3)如何决定一个STREAM / DATAGRAM基于UNIX的套接字在我的应用程序?

谢谢

正如手册页所说,Unix套接字总是可靠的。 SOCK_STREAMSOCK_DGRAM之间的区别在于从套接字中消耗数据的语义。

stream套接字允许读取任意数量的字节,但仍保留字节序列。 换句话说,发送者可以向套接字写入4K数据,接收者可以逐字节地使用该数据。 反过来也是如此 – 发送者可以向接收者在一次读取中消耗的套接字写入几个小消息。 stream套接字不保留消息边界。

另一方面,数据报套接字确实保留了这些边界 – 发送方的一个写操作始终对应于接收方读取的一个(即使接收方给出read(2)recv(2)的缓冲区小于那个消息)。

因此,如果您的应用程序协议具有消息大小已知上限的小消息,则最好使用SOCK_DGRAM因为这样更易于pipe理。

如果你的协议需要任意长的消息负载,或者只是一个非结构化的stream(比如原始audio或者其他东西),那么selectSOCK_STREAM并且执行所需的缓冲。

性能应该是相同的,因为这两种types只是通过本地内核内存,只是缓冲区pipe理是不同的。

主要区别在于一个是基于连接STREAM ),另一个是无连接DGRAM ) – stream和面向分组的通信之间的区别通常不那么重要。

使用SOCK_STREAM你仍然可以获得所有的连接处理,比如listen / accept ,你可以判断连接是否被另一端closures。

请注意,还有一个仍然面向连接的SEQPACKET套接字types,但保留了消息边界(这可能使您无法在STREAM套接字上实现面向消息的层)。

我希望所有这些types的数据传输性能都是相似的,主要区别在于你想要什么语义。

  1. 一个可能的区别是消息边界。 数据报将作为一个整体来提供,数据报是自然的消息边界。 使用stream套接字,您可以读取N个字节,套接字将阻塞,直到N个字节准备就绪。 但这意味着没有明显的信息界限。
  2. 也许。 带TCP的stream套接字至less需要最初的三次握手来build立连接。 一个UDP套接字不。
  3. 所有的事情都是平等的,如果速度是一个问题,仪器和措施。 (我假设你已经知道只有TCPstream套接字提供了内置的可靠的有序传输,并且只有数据报套接字可以用来发送给多个接收器)。

如果客户端和服务器将始终在同一台计算机上,并且目标是具有最小的延迟和最大的带宽,则使用共享内存。