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

时间:2012-12-19 13:54:56

标签: linux sockets unix tcp udp

对于STREAM类型和DATAGRAM类型INTERNET套接字之间的区别,这个问题是 NOT 。我知道STREAM套接字使用TCP,Datagram套接字使用UDP和所有TCP,UDP内容,按顺序到达的数据包,ACK,NACK等。 我理解这些在互联网上的重要性。

Q1)当我创建一个本地套接字的UNIX域套接字时,如果套接字是STREAM套接字或DATAGRAM套接字,那将是多么重要。这种类型的套接字会将数据写入套接字文件,在这种情况下协议是否重要,因为我不通过网络传输数据?如果我使用基于UNIX的DATAGRAM套接字,在这种情况下是否有丢失数据的可能性?

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

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


感谢

4 个答案:

答案 0 :(得分:57)

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

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

另一方面,

数据报套接字保留了这些边界 - 发送方的一次写入始终对应于接收方读取的一条(即使接收方的缓冲区给予read(2)recv(2)小于那条消息)。

因此,如果您的应用程序协议包含消息大小已知上限的小消息,那么SOCK_DGRAM最好使用SOCK_STREAM,因为这样更容易管理。

如果您的协议要求任意长消息有效负载,或者只是非结构化流(如原始音频或其他内容),请选择{{1}}并执行所需的缓冲。

性能应该是相同的,因为两种类型都只是通过本地内核内存,只是缓冲区管理不同。

答案 1 :(得分:17)

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

使用SOCK_STREAM,您仍然可以获得所有连接处理,即listen / accept,您可以判断对方是否已关闭连接。

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:0)

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