轻推服务器保持连接打开的简便方法?

时间:2019-05-30 20:55:48

标签: c++ http libcurl keep-alive

好吧,那么一点点背景: 我有一个运行在嵌入式系统上的应用程序,该应用程序以下列间隔通过HTTP(在C ++中使用libcurl)发送了一些不同的请求: 5分钟 15分钟 1小时 24小时

我的目标:减少数据消耗(通过蜂窝网络运行)

我们同时具有客户端和服务器端TLS身份验证,因此握手成本很高。我们的想法是,我们使用持久连接(至少对于间隔较短的文件),以避免每次都进行握手。

不幸的是,经过反复修改后,我发现服务器在间隔过去之前关闭了连接。也许这是我们可以扩展的东西?我将不得不与服务器端人员交谈。

给我的印象是存在“ TCP keep-alive”数据包的原因,但是据推测这些“检查连接”数据包并不是像名称所暗示的那样“保持连接打开”。

我的想法是这样的:

让我的应用每2分钟左右(无论超时时间有多长)发送一个数据包(越小越好),以“微调”连接使其保持打开状态。

我的问题是:

  1. 那有意义吗?
  2. 我想libcurl中没有简单的方法可以做到这一点吗?
  3. 如果是这样,我们能收到多小的请求?
  4. 有没有更简单的方法?我唯一的问题是所有连接内容都“存在” libcurl中。

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您提供有关应用程序体系结构的更多详细信息,则给出更准确的答案会更容易。例如,它是RESTful API吗?使用HTTP是否绝对强制?如果是这样,您正在使用什么HTTP服务器(nginx,apache等)?您可以考虑将websockets替代纯HTTP吗?

如果您可以自由使用常规HTTP或HTTPs以外的其他内容-并且在客户端使用libcurl以外的其他内容-您将有更多选择。

如果另一方面,如果您同时受这两者约束

  1. 使用HTTP(而不是原始的TCP连接或websocket),并且
  2. 使用libcurl

那我认为您的任务要困难得多-但也许仍然可以。

您面临的第一个挑战是HTTP连接的典型超时时间非常短(对于Apache 2来说只有几秒钟)。如果可以配置服务器,则可以增加它。

  

给我的印象是存在“ TCP keep-alive”数据包的原因,但是据推测这些“检查连接”数据包并不是像名称所暗示的那样“保持连接打开”。

您的术语在这里含糊不清。您是指TCP保持活动数据包还是持久HTTP连接?这些不一定相互之间有任何关系。前者是TCP中的可选机制(默认情况下处于禁用状态)。后者是特定于HTTP的应用程序层概念,无论在传输层上是否使用保持活动数据包,都可以使用后者。

  

我唯一的问题是所有连接内容都“存在”于libcurl中。

使用libcurl的问题在于,它首先是 transfer 库。我认为它不是为长时间运行的持久TCP连接量身定制的。尽管如此,据Danielcurl(libcurl的作者)说,will automatically try to reuse existing connections where possible库-只要您重新使用相同的简单句柄即可。

  

如果是这样,我们能收到多小的请求?

假设您正在服务器上使用“ ping”终结点-不接受任何数据并返回204(成功但无内容)响应,那么应用层中的开销将是HTTP请求标头的大小+ HTTP响应标头的大小。也许您可以将其压缩到200-300字节左右。

(普通)HTTP的替代

如果您使用的是RESTful API,则这种范例违背了持久TCP连接的想法-尽管我想不出它为什么不起作用的任何原因。

您可能会考虑使用websockets作为替代方案,但是-同样-libcurl对此并不理想。尽管我对websocket知之甚少,但我相信它们会提供一些优势。

与纯HTTP相比,websocket提供了:

  • 每封邮件的开销远低于HTTP;
  • 连接自动保持持久状态:无需发送额外的“保持活动”消息以保持连接状态; <​​/ li>

与原始TCP连接相比,websockets的优势在于:

  • 您不必在服务器上打开自定义端口;
  • 它会自动为您处理TLS / SSL。

(欢迎对Websockets了解更多的人针对上述几点纠正我,尤其是有关TLS / SSL和保持活动消息的消息。)

libcurl的替代版本

{cursor} Mongoose networking library是libcurl的替代方法。它将为您提供一些不同的选择:

  1. 使用普通的TCP连接(和自定义应用程序层协议)
  2. 使用TCP连接并自己手动处理HTTP请求,
  3. 使用websockets-它对服务器和客户端都有很好的支持。

猫鼬允许您同时为所有这些选项启用SSL。