首页 文章

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

提问于
浏览
47

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

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

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

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

谢谢

4 回答

  • 17

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

  • 3
    • 一个可能的区别是消息边界 . 数据报将作为一个整体提供,数据报是自然的消息边界 . 使用流套接字,您可以读取N个字节,套接字将阻塞,直到N个字节准备就绪 . 但这意味着没有明显的信息边界 .

    • 也许吧 . 具有TCP的流套接字至少需要初始三次握手来 Build 连接 . UDP套接字没有 .

    • 所有条件都相同,如果速度是一个问题,工具和措施 . (我假设您已经知道只有TCP流套接字提供内置的可靠有序传输,并且只能使用数据报套接字发送到多个接收器) .

  • 55

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

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

    另一方面,数据报套接字确实保留了这些边界 - 发送方的一次写入总是对应于接收方读取的一条(即使给予read(2)recv(2)的接收方缓冲区小于该消息) .

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

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

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

  • 0

    主要区别在于一个是 connection basedSTREAM )而另一个是 connection-lessDGRAM ) - 流和面向分组的通信之间的区别通常不那么重要 .

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

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

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

相关问题