好吧,那么一点点背景: 我有一个运行在嵌入式系统上的应用程序,该应用程序以下列间隔通过HTTP(在C ++中使用libcurl)发送了一些不同的请求: 5分钟 15分钟 1小时 24小时
我的目标:减少数据消耗(通过蜂窝网络运行)
我们同时具有客户端和服务器端TLS身份验证,因此握手成本很高。我们的想法是,我们使用持久连接(至少对于间隔较短的文件),以避免每次都进行握手。
不幸的是,经过反复修改后,我发现服务器在间隔过去之前关闭了连接。也许这是我们可以扩展的东西?我将不得不与服务器端人员交谈。
给我的印象是存在“ TCP keep-alive”数据包的原因,但是据推测这些“检查连接”数据包并不是像名称所暗示的那样“保持连接打开”。
我的想法是这样的:
让我的应用每2分钟左右(无论超时时间有多长)发送一个数据包(越小越好),以“微调”连接使其保持打开状态。
我的问题是:
谢谢!
答案 0 :(得分:1)
如果您提供有关应用程序体系结构的更多详细信息,则给出更准确的答案会更容易。例如,它是RESTful API吗?使用HTTP是否绝对强制?如果是这样,您正在使用什么HTTP服务器(nginx,apache等)?您可以考虑将websockets替代纯HTTP吗?
如果您可以自由使用常规HTTP或HTTPs以外的其他内容-并且在客户端使用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字节左右。
如果您使用的是RESTful API,则这种范例违背了持久TCP连接的想法-尽管我想不出它为什么不起作用的任何原因。
您可能会考虑使用websockets作为替代方案,但是-同样-libcurl对此并不理想。尽管我对websocket知之甚少,但我相信它们会提供一些优势。
与纯HTTP相比,websocket提供了:
与原始TCP连接相比,websockets的优势在于:
(欢迎对Websockets了解更多的人针对上述几点纠正我,尤其是有关TLS / SSL和保持活动消息的消息。)
{cursor} Mongoose networking library是libcurl的替代方法。它将为您提供一些不同的选择:
猫鼬允许您同时为所有这些选项启用SSL。