当前位置: 首页 > 知识库问答 >
问题:

用于实时数据和元数据的TCP通信协议

慕弘深
2023-03-14

我是相当新的网络协议设计,并希望对我的问题提出建议。

我的要求

  1. 我需要将实时数据从TCP套接字客户端传输到服务器。我在这里没有UDP的选择
  2. 数据需要元数据描述符才能在服务器端正确解码。此描述符可以在运行时代表客户端用户更改
  3. 我需要偶尔从客户端向服务器发送控制命令以进行数据操作

设计A

  • 设置两对套接字服务器和客户端,一对用于需求#1,另一对用于需求#2和#3;现在就叫它们“数据隧道”和“元数据隧道”

专业人士

  • 概念清晰,易于在实现中隔离元数据和数据模块。
  • 实时数据,即#1,可以以字节形式发送,不需要额外的数据封装。

欺骗

  • 需要在两个隧道之间进行同步,以避免由于控制更改而导致的解码错误或小故障

设计B

  • 仅使用一个通道
  • 分别为实时数据和元数据设计至少两个分组数据结构。实时数据包将包括其解释
  • 让数据和元数据共享唯一的通道

专业人士

  • 每个实时封包都与元数据捆绑在一起,并保证正确解码。
  • 只使用一个线程。

欺骗

  • 在接收器数据处理上更复杂的实现,例如,在接收数据包时必须区分数据和元数据。
  • 单个隧道上的流量更繁忙。我打赌控制消息不会阻塞实时数据消耗,但我真的不知道。

我倾向于设计一个比正确解码更安全的“实时”保证。但我想和专家们再次核实我的想法。

我知道有数百种通信协议,但老实说,当看到随机的协议文档时,我会感到头晕目眩。毕竟,我的应用程序相对轻量级,所以滚动自己的应用程序似乎更有意义。

顺便说一下,我使用Google Protobuf进行协议设计。我假设它的性能是实时的。

如有任何建议,将不胜感激。

共有1个答案

魏英勋
2023-03-14

正如@RonMaupin在评论中提到的,TCP和“实时”并不特别兼容,因为TCP优先考虑“正确获取字节”而不是“在特定时间框架内获取字节”。

也就是说,您可以通过TCP实现的是“尽可能快地获取字节”,只要您同意在某些情况下(例如,一个正在丢弃大量数据包的网络),“尽可能快”可能不会那么快。

关于要使用多少个TCP流,与做出该决定相关的TCP质量是TCP流始终强制按顺序/FIFO传递该流中的字节。也就是说,您发送()到TCP套接字的所有字节都将按照接收程序的确切顺序为recv()'d——这是一种对您有效或对您不利的行为,因此您希望以适合您的方式设计您的程序。特别是,在决定是使用一个还是多个TCP连接时,问问自己,“我发送的数据是否需要以与发送相同的顺序接收,还是没关系?”如果严格的FIFO排序很重要,那么单个TCP流是最好的选择;OTOH如果您有两种类型的数据,并且B型数据在逻辑上独立于A型数据,那么您可以考虑为B型数据提供自己的单独TCP流,这样A型数据的丢包就不会减慢B型数据的传输。

在任何情况下,您都希望至少有一些最小的协议/帧(例如,在每个数据消息之前至少有消息类型和消息大小标头字段),以便接收方不必猜测其接收的字节的含义。(即使您一开始不需要它们,您也希望在第二个版本中使用它们,以帮助保持与协议早期版本的向后兼容性)

让您的TCP数据尽可能快/低延迟的其他一些建议:

>

  • 禁用Nagle算法(永久或至少在您完成send()-ing特定的数据突发之后)-否则您将获得200毫秒的不必要延迟大部分时间。

    假设您的程序在具有大量RAM的平台上运行,setockopt()带有SO_SNDBUFSO_RCVBUF选项,以使您的发送和接收套接字缓冲区尽可能大;这减少了由于缓冲区中没有空间可用而导致缓冲区填满和数据包丢失的可能性。

    如果可能,请设计发送算法,以便仅在最后一个可能的时刻生成要发送的数据,而不是将要提前发送的大量数据排队。例如,如果(由于某些触发事件)您的代码决定需要尽快通过TCP套接字发送特定数据结构的当前状态,而不是序列化数据结构并立即将序列化的字节排入队列(和/或)只需设置指示需要发送结构的脏标志。然后,下次套接字指示它已准备好写入时,即序列化数据结构并将其发送到套接字的时间。这样做的好处是,如果您快速连续收到10个触发事件,使用这种脏标志设计,最终仍然只能跨一次发送最终版本的数据结构,而不是连续发送10次。第二个好处是,这限制了可以排队等待发送的积压数据,从而减少了数据更新的平均延迟。

    在接收端,由一个专用的高优先级线程在一个紧密的循环中完成recv()调用,该线程只需尽快接收数据,然后将其排队以供进一步处理。这里的想法是尽量减少接收TCP套接字的传入数据缓冲区变满的可能性,因为如果它变满,一些传入的TCP数据包可能会被丢弃,迫使TCP退避并重新发送,这将减慢传输速度。

  •  类似资料:
    • 主要内容:本节引言:,1.运行效果图:,2.实现流程图:,3.代码示例:,4.代码下载:,5.本节小结:本节引言: 上节中我们给大家接触了Socket的一些基本概念以及使用方法,然后写了一个小猪简易聊天室的 Demo,相信大家对Socket有了初步的掌握,本节我们来学习下使用Socket来实现大文件的断点续传! 这里讲解的是别人写好的一个Socket上传大文件的例子,不要求我们自己可以写出来,需要的时候会用 就好! 1.运行效果图: 1.先把我们编写好的Socket服务端运行起来: 2.将一个音

    • 主要内容:本节引言:,1.什么是Socket?,2.Socket通信模型:,3.Socket服务端的编写:,4.Socket客户端的编写:,5.增强版案例:小猪简易聊天室,本节小结:本节引言: 上一节的概念课枯燥无味是吧,不过总有点收获是吧,本节开始我们来研究基于TCP协议的Socket 通信,先来了解下Socket的概念,以及Socket通信的模型,实现Socket的步骤,以及作为Socket服务 端与客户端的两位各做要做什么事情!好的,我们由浅入深来扣这个Socket吧! 1.什么是Sock

    • 数据通信 HTTP HTTP 为一个通信协议。HTTP 客户端发起请求并创建端口。HTTP 服务器在端口监听客户端的请求。 HTTP 服务器在收到请求后则返回状态和所请求的内容。 网页浏览全过程 (粗浅流程) 域名解析 搜索浏览器自身 DNS 缓存 搜索操作系统自身 DNS 缓存(如上一级未找到或已失效) 读取本地 HOST 文件 (如上一级未找到或已失效,/etc/hosts) 浏览器发起 DN

    • 主要内容:蓝牙,Z-Wave,ZigBee智能能源,LoRaWAN物联网数据链路通信协议为网络层提供服务。不同组织为数据链路协议指定了各种协议和标准技术。 蓝牙 蓝牙是射频上的短程无线通信网络。蓝牙主要集成到智能手机和移动设备中。蓝牙通信网络工作在2.4 ISM频段内,数据速率高达3Mbps。 蓝牙技术分为三类: 蓝牙经典 低功耗蓝牙 蓝牙SmartReady 蓝牙5.0版本的功能引入到蓝牙5,它完全是为物联网开发的。 蓝牙网络的属性 标准:蓝牙4.2 频率:2

    • 关于元数据 元数据是一组有关文件的标准化信息,如作者姓名、分辨率、色彩空间、版权以及为其应用的关键字。例如,大多数数码相机将一些基本信息附加到图像文件中,如高度、宽度、文件格式以及图像的拍摄时间。您可以使用元数据来优化工作流程以及组织文件。 关于 XMP 标准元数据信息是使用可扩展元数据平台 (XMP) 标准进行存储的, Adobe Bridge、 Adobe Illustrator、 Adobe

    • 元数据是“关于数据的数据”。描述数据库的任何数据—作为数据库内容的对立面—是元数据。因此,列名、数据库名、用户名、版本名以及从SHOW语句得到的结果中的大部分字符串是元数据。还包括INFORMATION_SCHEMA数据库中的表中的内容,因为定义的那些表存储关于数据库对象的信息。 元数据表述必须满足这些需求: ·全部元数据必须在同一字符集内。否则,对INFORM一个TION_SCHEMA数据库中的