繁体   English   中英

轻松“轻推”服务器以保持连接打开?

[英]Easy way to “nudge” a server to keep a connection open?

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

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

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

不幸的是,在经过多次修补之后,我发现服务器在间隔通过之前正在关闭连接。 也许这是我们可以延伸的东西? 我将不得不与服务器端人员交谈。

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

我的想法是这样的:

让我的应用程序每2分钟发送一个数据包(尽可能小)(无论多长时间),以“轻推”连接保持打开状态。

我的问题是:

  1. 这有任何意义吗?
  2. 我不认为在libcurl中有一种简单的方法可以做到这一点吗?
  3. 如果是这样,我们可以获得多少请求?
  4. 有更简单的方法吗? 我唯一的问题是所有连接内容都存在于libcurl中。

谢谢!

如果您在应用程序体系结构上提供更多详细信息,那么给出更精确的答案会更容易。 例如,它是RESTful API吗? HTTP的使用绝对是强制性的吗? 如果是这样,你使用的是什么HTTP服务器(nginx,apache,...)? 您能否将websockets视为普通HTTP的替代方案?

如果您可以自由地使用除常规HTTP或HTTP之外的其他东西 - 并且在客户端使用除libcurl其他东西 - 那么您将有更多选择。

另一方面,如果你受到两者的限制

  1. 使用HTTP(而不是原始TCP连接或websockets),和
  2. 使用libcurl

那么我觉得你的任务有点困难 - 但也许还有可能​​。

您的第一个挑战之一是HTTP连接的典型超时非常低(Apache 2的低至几秒)。 如果您可以配置服务器,则可以增加此值。

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

你的术语在这里含糊不清。 您是指TCP保持活动数据包还是持久HTTP连接? 这些并不一定与彼此有任何关系。 前者是TCP中的可选机制(默认情况下禁用)。 后者是一种特定于HTTP的应用层概念 - 无论是否在传输层使用保活分组,都可以使用它。

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

使用libcurl的问题在于它首先是一个传输库。 我认为它不适合长时间运行的持久TCP连接。 尽管如此,根据Daniel Stenberg(libcurl的作者)的说法,只要您重新使用相同的简单句柄,库就会自动尝试重用现有的连接

如果是这样,我们可以获得多少请求?

假设您在服务器上使用“ping”端点 - 它不接受任何数据并返回204(成功但没有内容)响应,那么应用程序层中的开销将是HTTP请求标头的大小+大小的HTTP响应标头。 也许你可以把它降到200-300字节,或者左右。

(普通)HTTP的替代方案

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

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

与普通HTTP相比,websockets提供:

  • 每条消息的开销明显低于HTTP;
  • 连接是自动持久的:没有必要发送额外的“保持活动”消息以保持打开状态;

与原始TCP连接相比,websockets的好处是:

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

(有关websockets更多了解的人欢迎在上述某些方面纠正我 - 特别是关于TLS / SSL和保持活跃消息。)

libcurl的替代品

可能对此有用的libcurl的替代方案是Mongoose网络库 它会为您提供一些不同的选择:

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

Mongoose允许您为所有这些选项启用SSL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM