一个配置导致的HTTP(TCP)连接超时

本文介绍了作者在开发HTTP服务时遇到的一个问题,即安卓设备访问服务时经常出现连接超时,而iOS设备则正常。通过Wireshark分析网络包发现大量TCP重传,原因是服务器端同时开启TCP时间戳和TCP时间等待回收,导致操作系统主动丢包。解决方案是关闭TCP时间等待回收选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个配置导致的HTTP(TCP)连接超时

这个是之前写http服务的时候测试遇到的一个问题。当时这个bug的现象是,办公室内某台安卓手机访问http服务经常出现连接超时,而过一会儿之后又可以使用了。而同时,办公室内的iOS设备,Mac设备又能正常使用服务。甚至登陆到http服务实时监控日志,会发现安卓的设备的请求确实没有到达http服务,没有access日志。

简单抓包

这个时候实在没法,在服务端tcpdump一下对应的http端口的请求,还好是开发环境。dump过程中,仅一分钟,安卓手机就又遇到了相同的情况。这时结束dump,下载dump出来的内容到本机用wireshark进行分析。

分析包内容

大量重传

打开包,按照时间顺序排列,看到大片的黑色记录,也就是有大量TCP重传。照说办公室到测试服务器的网络是稳定的,而且是在服务器上面抓的包。所以不应该存在大量的重传才对。所以先从这里着手。trace一下出现重传的tcp stream。其中编号为10的tcp流很有意思:

其中一个流

可以看到,office在37s的时候发送

在 Qt 中判断 TCP 连接是否超时,主要依赖于 `QTcpSocket` 的异步通信机制和 `QTimer` 来实现连接状态的监控。由于 Qt 的网络模块本身并未提供直接设置连接超时的接口,因此通常通过定时器来检测连接是否在指定时间内完成。 当调用 `connectToHost()` 方法发起连接时,`QTcpSocket` 会进入 `ConnectingState` 状态。通过启动一个 `QTimer`,设定超时时间,在超时时检查 socket 的状态是否仍为 `ConnectingState`,如果是,则认为连接超时,并调用 `abort()` 方法终止连接尝试。 以下是一个典型的实现方式: ```cpp #include <QTcpSocket> #include <QTimer> #include <QDebug> QTcpSocket socket; QTimer timer; // 连接成功时的处理 QObject::connect(&socket, &QTcpSocket::connected, [&]() { qDebug() << "Connected successfully."; timer.stop(); // 停止定时器 }); // 错误处理 QObject::connect(&socket, &QTcpSocket::errorOccurred, [&](QAbstractSocket::SocketError error) { qDebug() << "Socket error:" << socket.errorString(); }); // 超时处理 QObject::connect(&timer, &QTimer::timeout, [&]() { if (socket.state() == QAbstractSocket::ConnectingState) { qDebug() << "Connection timed out."; socket.abort(); // 终止连接 } }); // 启动连接 socket.connectToHost("192.168.1.100", 8080); timer.start(5000); // 设置超时时间为 5 秒 ``` 此外,还可以通过检查 socket 的状态变化,例如使用 `stateChanged()` 信号来跟踪连接状态的变化,并在连接失败或超时后进行相应的处理。 需要注意的是,连接超时的具体时间应根据实际网络环境和应用场景进行合理设置,以避免因短暂网络波动而导致误判。在某些复杂网络架构中,如涉及负载均衡器时,连接超时时间可能受到后端配置的限制,例如某些云服务中 TCP 连接超时时间被固定为 300 秒,用户无法自行修改 [^2]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值