【问题标题】:How to build a protocol on top of tcp?如何在 tcp 之上构建协议?
【发布时间】:2013-08-17 11:23:48
【问题描述】:

我搜索了很多,但我找不到任何资源可以通过构建使用 TCP 作为传输层的自己的协议。 有哪些必要的步骤? 该协议应该是设备的某种“控制协议”。所以我可以向设备发送命令并控制它们并获取信息。

那么如何实现自定义协议呢?是否所有关于定义what 可以发送命令和how 接收者对不同命令作出反应?假设我正在使用 tcp 使用xml 定义一些自定义命令,通过有线/空中发送它们,并在那里有一些对发送的命令和回复做出反应的逻辑。这是一种可以实现“协议”的方式吗?这甚至被称为“协议”吗?

亲切的问候。

【问题讨论】:

  • 是的,这是一个“协议”。查看一些经典 TCP/IP 协议的原始文档以获取示例。 SMTP 的RFC 821 就是一个很好的例子。

标签: networking tcp network-programming protocols


【解决方案1】:

只要你能编写一个规范来定义你通过 TCP 套接字发送的数据,你就有了自己的协议。

主要是关于定义命令和有效负载。您必须先序列化您的命令数据包,然后再将它们通过 TCP。如果您以二进制格式打包数据包,则字节顺序是一个常见的缺陷。 XML 和 JSON 是常见的基于文本的数据交换格式。我个人是支持 JSON 的。

请参考BSONMessagePackprotobuf 进行二进制序列化。它们将 typed 数据打包成二进制,因此它们通常比基于文本的序列化具有更高的性能、更紧凑的大小和更好的类型检查。它们还处理字节序转换、数据包版本控制并提供各种语言的驱动程序/绑定。服务器和客户端可以用不同的语言编写。

编辑:添加 RFC 示例

看到 Ross Patterson 的评论,我还建议阅读 RFC 以获取协议定义参考。 RTSPHTTP 是文本协议,RTP 和媒体格式(MPEG4 AVH-264)是二进制协议。

编辑:

Demystifying Protocols and Serialization Performance with Todd Montgomery

【讨论】:

  • 序列化是一回事,但是消息的框架呢?我知道 protobuf 不是自定界的,所以你需要发送长度 + 数据。使用 JSON 时,您通常会在 JSON 负载前添加长度吗?
  • 我没有尝试发送原始 protobuf 数据,我使用了 gRPC,它使用 HTTP2 来指定内容长度。当您将消息格式定义为{ length, data } 时,您确实在定义您的协议,根据定义,数据是帧的方式,序列化是先决条件。
猜你喜欢
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多