通过TCP连接发送(易于压缩)数据的最有效方法

时间:2018-08-05 13:56:54

标签: performance tcp compression client-server

我在TCP开发了一个C/C++服务器,该服务器接受客户端的连接。功能之一是读取客户端指定的任意服务器内存。

注意:这里不关心安全性,因为客户端和服务器应用程序仅在本地运行。

当前未压缩的内存发送方式如下

  1. 客户端将起始地址和结束地址发送到服务器。
  2. 每次发送缓冲区满时,服务器都会以块的方式答复在接收到的起始地址和结束地址之间读取的内存。
  3. 客户端读取预期的字节数(长度=结束地址-起始地址)

发送大块内存(可能带有大量0内存)很慢,因此使用某种压缩似乎是个好主意。这使通信变得相当复杂。

压缩内存发送当前的工作方式如下

  1. 客户端将起始地址和结束地址发送到服务器。
  2. 服务器读取一块内存,并使用zlib对其进行压缩。如果压缩的内存小于原始内存,它将保留压缩后的内存。服务器保存内存大小(无论是否压缩)以及发送缓冲区中的压缩字节。当缓冲区已满时,它将被发送回客户端。发送缓冲区的布局如下:

Total bytes remaining in the buffer (int) | memory chunks count (int) | list of chunk sizes (int each) | list of whether a chunk is compressed or not (bool each) | list of the data (variable sizes each)

  1. 客户端读取一个int(剩余的总字节数)。然后,它使用剩余的字节信息读取剩余的缓冲区大小。现在,客户端读取内存块计数(另一个int),以便能够解析块大小列表以及它们是否已压缩的列表。然后,使用大小和压缩信息,客户端可以访问数据列表,并在必要时进行解压缩。然后从所有解压缩的接收数据中组装原始内存缓冲区。继续从服务器读取,直到组装了预期数量的原始字节为止。

我的问题是压缩方法看起来是否最佳,或者我是否缺少重要的东西。发送TCP消息是这里的瓶颈,因此在仍然传输相同数据的同时将它们最小化应该是优化性能的关键。

1 个答案:

答案 0 :(得分:1)

嘿,我给你一些起点。请记住,这些只是起点。

首先阅读本文: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.156.2302&rep=rep1&type=pdf 还有这个 https://www.sandvine.com/hubfs/downloads/archive/whitepaper-tcp-optimization-opportunities-kpis-and-considerations.pdf

这会提示您可能出什么问题了,而且很多。基本上,我的建议是集中在服务器/网络系统的行为上。我的意思是尝试对其进行压力测试,并尝试获得一致的行为。

如果系统出现拥塞,请制定相应的策略。优化套接字的缓冲区大小。研究环形缓冲区如何为网络协议工作。研究是否可以使用巨型MTU。测试抖动是否是系统中的问题。通常,由于功率更高,协议开始表现为不稳定(操作系统很忙,或者有一些内存分配)。

现在最重要的是,您每时每刻都需要进行压力测试。进行一致的可重复测试,您可以随时进行测试。

如果您使用的是Linux,则setsockopt是您的朋友和敌人。了解它是如何工作的。

定义边界,您的服务器必须能够做什么,不能做什么。

祝你好运。我正在针对延迟优化我的系统,至少可以说这很棘手。