当前位置: 首页 > 知识库问答 >
问题:

HTTP代理上的TCP套接字在空闲超时后断开连接

宋经赋
2023-03-14

在代理上使用HTTP隧道时,TCP套接字有问题。

客户端(C++)打开到服务器(JAVA)的TCP套接字。我添加了对HTTP代理的支持。一切正常,客户端发送“HTTP Connect”请求如下所示,并在以下情况下继续普通TCP连接:

CONNECT servername:5555 HTTP/1.1
Host: servername:5555
Proxy-Connection: Keep-Alive

HTTP/1.1 200

然而,如果代理中配置了空闲超时,并且没有发送实际数据,则尽管客户端每60秒发送TCP保持活动数据包,但连接将终止。空闲超时配置为10分钟。

244 47.133017000    192.168.91.xxx  192.168.92.yyy  TCP 55  [TCP Keep-Alive] 64351 > 808 [ACK] Seq=4336 Ack=13084 Win=65700 Len=1
245 47.133336000    192.168.92.yyy  192.168.91.xxx  TCP 66  [TCP Keep-Alive ACK] 808 > 64351 [ACK] Seq=13084 Ack=4337 Win=65536 Len=0 SLE=4336 SRE=4337

共有1个答案

白昊乾
2023-03-14

这是应用层的超时,例如连接空闲,因为没有发送应用数据。您尝试的方法无效,原因是:

  • Connection:Keep-alive用于在单个连接上有多个HTTP请求。这在这里不适用,因为从代理的视图来看,只有一个请求(CONNECT)。
  • TCP保持-活动状态是注意对等体是否再也无法访问(在连接未关闭的情况下死亡或连接在中间某处中断)。它不适用于TCP连接仍然活动但空闲(没有应用程序数据)的情况。

为代理设置空闲超时是有意义的。HTTP的思想是,客户端发送请求,服务器发送响应。如果它在接收请求或响应时处于空闲状态,那么通常会有一些东西中断(或者您有一个相当慢的连接)。如果在请求和响应完成后它处于空闲状态,那么关闭连接是完全有效的,即使客户端请求connection:keep-alive,因为keep-alive不是服务器的要求,而只是在服务器有足够的资源时建议为更多请求保持连接打开。

 类似资料:
  • 在套接字最终接受另一端消失的情况下,什么指定了这个超时?是操作系统(Ubuntu 11.04),还是来自TCP/IP规范,还是套接字配置选项?

  • 我在OS X 10.9.5上使用MySQL Workbench 6.3来管理多个云数据库(托管在Rackspace上),我遇到了以下问题: 闲置5分钟后,会出现以下问题: 我无法运行任何查询(错误 2013:查询期间失去与 MySQL 服务器的连接) 尝试浏览数据库上的表时,我收到诸如“无法获取表”、“无法获取视图”等消息 刷新左侧面板时,出现“错误代码:2006 MySQL服务器已消失” 所以基

  • 问题内容: 我最近一直在使用来处理带注释的Websocket,并与之聊天。 但是我遇到了一个问题,5分钟后(我相信这是默认计时器),该会话关闭(这不是由于错误)。我找到的唯一解决方案是在关闭事件发生时通知我的套接字,然后在新的套接字中重新打开连接。 但是我已经阅读了stackOverflow,通过在WebsocketPolicy 中进行设置,我可以避免出现此问题: 我尝试设置为例如,但是行为完全没

  • 检测空闲连接和超时是为了及时释放资源。常见的方法发送消息用于测试一个不活跃的连接来,通常称为“心跳”,到远端来确定它是否还活着。(一个更激进的方法是简单地断开那些指定的时间间隔的不活跃的连接)。 处理空闲连接是一项常见的任务,Netty 提供了几个 ChannelHandler 实现此目的。表8.4概述。 Table 8.4 ChannelHandlers for idle connections

  • 在一个简单的客户端-服务器TCP套接字中,当我试图在Android Studio中创建客户端套接字时,遇到了一个问题。导致错误的指令是<code>Sockets=new Socket(主机名,端口) 我使用的端口是 1993,我尝试了变量的一些值: 在每种情况下,应用程序都会因为这个错误而停止,下面的错误属于第一点,其他的得到类似的错误。 Eclipse中的相同指令工作,我在命令行上使用服务器“n

  • 我想检查一下我的客户是否断开了连接。根据我的研究,一种可能的方式是我可以继续给客户写信。如果客户端未能接收到消息,则表示已断开连接。我向相应的客户端发送消息“Checking Connection:Client”clientNo。 我将clientNo 1连接到服务器,它接收 客户1 但是当我将另一个客户端连接到服务器时,我的clientNo1停止接收来自服务器的消息,我的clientNo2现在将