[英]Easy way to “nudge” a server to keep a connection open?
好吧,所以有一点上下文:我在嵌入式系统上运行一个应用程序,它通过HTTP发送一些不同的请求(在C ++中使用libcurl),时间间隔为:5分钟15分钟1小时24小时
我的目标:减少数据消耗(通过蜂窝网络运行)
我们有客户端和服务器端TLS身份验证,因此握手成本很高。 我们的想法是使用持久连接(至少对于较短的间隔文件)来避免每次都进行握手。
不幸的是,在经过多次修补之后,我发现服务器在间隔通过之前正在关闭连接。 也许这是我们可以延伸的东西? 我将不得不与服务器端人员交谈。
我的印象是“TCP保持活跃”数据包存在的原因,但据推测那些“检查连接”并不像名称所暗示的那样“保持打开”。
我的想法是这样的:
让我的应用程序每2分钟发送一个数据包(尽可能小)(无论多长时间),以“轻推”连接保持打开状态。
我的问题是:
谢谢!
如果您在应用程序体系结构上提供更多详细信息,那么给出更精确的答案会更容易。 例如,它是RESTful API吗? HTTP的使用绝对是强制性的吗? 如果是这样,你使用的是什么HTTP服务器(nginx,apache,...)? 您能否将websockets视为普通HTTP的替代方案?
如果您可以自由地使用除常规HTTP或HTTP之外的其他东西 - 并且在客户端使用除libcurl
其他东西 - 那么您将有更多选择。
另一方面,如果你受到两者的限制
那么我觉得你的任务有点困难 - 但也许还有可能。
您的第一个挑战之一是HTTP连接的典型超时非常低(Apache 2的低至几秒)。 如果您可以配置服务器,则可以增加此值。
我的印象是“TCP保持活跃”数据包存在的原因,但据推测那些“检查连接”并不像名称所暗示的那样“保持打开”。
你的术语在这里含糊不清。 您是指TCP保持活动数据包还是持久HTTP连接? 这些并不一定与彼此有任何关系。 前者是TCP中的可选机制(默认情况下禁用)。 后者是一种特定于HTTP的应用层概念 - 无论是否在传输层使用保活分组,都可以使用它。
我唯一的问题是所有连接内容都存在于libcurl中。
使用libcurl的问题在于它首先是一个传输库。 我认为它不适合长时间运行的持久TCP连接。 尽管如此,根据Daniel Stenberg(libcurl的作者)的说法,只要您重新使用相同的简单句柄,库就会自动尝试重用现有的连接 。
如果是这样,我们可以获得多少请求?
假设您在服务器上使用“ping”端点 - 它不接受任何数据并返回204(成功但没有内容)响应,那么应用程序层中的开销将是HTTP请求标头的大小+大小的HTTP响应标头。 也许你可以把它降到200-300字节,或者左右。
如果您正在使用RESTful API,这种范式违背了持久TCP连接的想法 - 尽管我无法想到它为什么不起作用的任何原因。
您可能会考虑使用websockets作为替代方案,但是 - 再次 - libcurl对此并不理想。 虽然我对websockets知之甚少,但我相信它们会提供一些优势。
与普通HTTP相比,websockets提供:
与原始TCP连接相比,websockets的好处是:
(有关websockets更多了解的人欢迎在上述某些方面纠正我 - 特别是关于TLS / SSL和保持活跃消息。)
可能对此有用的libcurl的替代方案是Mongoose网络库 。 它会为您提供一些不同的选择:
Mongoose允许您为所有这些选项启用SSL。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.