协议/数据包设计问题

4

我想设计一个客户端-服务器应用程序的协议,并需要一些资源链接来帮助我。

重要的部分是我试图创建自己的“数据包”格式,以便我可以最小化发送的信息量。我正在寻找一些资源来解析他们的协议,但似乎有些完全缺乏数据包设计,例如SMTP(它只发送由CLRF终止的字符串)。使用类似SMTP的系统与使用自定义数据包的系统相比,有什么优缺点?SMTP是否可以仅使用几个字节通过位标志覆盖所有命令并节省带宽/空间?

只是尝试理解所有这些。

4个回答

1

没错,但SMTP并没有特别优化空间,也不是基于分组的协议。它位于TCP之上,并使用TCP的流功能。您需要决定协议中什么是可取的:是性能敏感?延迟?带宽?

它是否需要作为超级用户运行?如果不需要,您可能希望使用UDP或TCP。

您是否需要传递保证?如果是,TCP可能是您最好的选择,除非您处理相当极端的性能或大小问题。

现在很少有协议设计单个数据包,虽然许多使用TCP通过网络发送非常特定的数据结构,或者较少情况下使用UDP。

如果要真正优化空间或带宽,请尽可能将数据压缩为单个位和字节,并定义和打包结构以通过TCP发送。现代网络适配器已经对TCP进行了如此优化,因此通常很难从其他策略中获得优势。


我将要发送大量的数据,我想在问题出现之前进行微观优化。我想我将不得不在TCP之上分层一个数据结构。但是假设我确实想设计自己的基于数据包的协议,我应该从哪里开始?我该如何开始在C++中实现它? - cam
你需要先设计结构体。然而,这是一件非常复杂的事情,如果你要封装IP,你需要非常熟悉它的内部机制,因为有很多故障情况需要处理:数据包可能会丢失、损坏、分段或乱序传递。你只需要设计一个算法来处理所有这些问题,然后就可以开始了 ;) - WhirlWind
UDP会为您处理数据完整性问题,但您仍然需要处理其他事情。要实现此功能,请查看套接字层。W. Richard Stevens有几本书可能会有所帮助。 - WhirlWind
如果您想要UDP的优点,但仍需要一些控制机制,您也可以考虑实现自己的RTP配置文件。 - b_erb

1
首先,您是要实现增强型传输协议(如基于UDP的RTP)还是应用层协议(如HTTP/SMTP)?
在这两种情况下,您都应该考虑以下几个方面,以便设计出适合您的协议或满足应用需求: 基于流还是基于数据包, 单向/双向, 有状态和会话性或无状态, 可靠或尽力而为, 时间要求, 流量/拥塞控制, 安全或普通。
对于应用层协议,您还应该考虑以下问题: 文本或二进制数据,将应用数据映射到网络数据单元/数据包,安全需求和完整性等。

0

SMTP、HTTP和其他基于TCP的协议不关心数据包设计,因为它们是基于流的。因此,更有意义的是谈论协议设计。

至于为什么使用基于文本的协议而不是二进制协议...

通过数据包嗅探程序(如Wireshark)读取协议的可读性非常有用。

而且,能够简单地通过telnet进入您的端口并通过指定纯文本与服务器通信通常非常有用。

此外,像HTTP这样的协议实际上资源通常是通信的有效载荷,资源可以是二进制或任何其他指定格式。因此,仅使用纯文本的标头和状态并不是坏事。


0
  • TCP是一种基于的协议,而不是基于数据包的。
  • 使用带有行的文本可以使临时调试变得更加容易。
  • 使用带有行的文本可以通过telnet来测试您的协议。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接