Delphi从10.2升级到10.4后Indy 10客户端请求出现10秒延迟问题
排查思路
- 优先验证Indy版本差异:Delphi 10.2自带Indy 10版本为10.6.2.5366,10.4自带版本为10.6.2.5479以上,两个版本间存在多处HTTP读取、TLS关闭、连接复用逻辑的改动。你可以临时将项目引用的Indy单元路径替换为10.2环境下的旧版Indy源码编译测试,若延迟消失即可确认是Indy版本改动导致的问题。
- 抓包验证TCP/TLS层行为:用Wireshark分别抓取两个版本环境下的请求通信包,重点核对三个点:
- 响应头
Content-Length字段值和实际返回的响应体字节数是否匹配 - 10.4环境下收到完整响应数据后,是否存在TCP FIN等待超时,你遇到的10秒刚好是常见的TCP静默关闭默认超时阈值
- 是否存在TLS会话关闭阶段的告警、重传,嵌入式设备常存在未按规范返回TLS关闭通知的情况
- 响应头
- 核对TIdHTTP属性配置差异:
- 检查是否开启了
hoKeepOrigProtocol选项,10.4版Indy默认修改了HTTP协议版本降级逻辑,若Adyen设备返回HTTP/1.0响应且未携带Connection: keep-alive头,新版Indy会多等待10秒判断连接是否可复用 - 检查SSLIOHandler的
SSLShutdownTimeout配置,10.4版Indy修改了SSL关闭的调用逻辑,默认会等待对端返回TLS关闭通知,若设备直接断连会触发10秒超时
- 检查是否开启了
解决方案(按验证优先级排序)
- 强制HTTP/1.0协议:设置
TIdHTTP.ProtocolVersion = pv1_0,默认不启用连接复用,跳过连接等待逻辑,可快速验证是否为连接复用导致的问题 - 缩短SSL关闭超时:给绑定的
TIdSSLIOHandlerSocketOpenSSL组件设置SSLShutdownTimeout = 100,将等待TLS关闭通知的超时从默认10秒改为100毫秒,你已经拿到完整响应数据,该修改不会影响业务逻辑 - 禁用多余读取等待:给
TIdHTTP.Options添加hoNoReadWait选项,跳过响应读取完成后的额外连接状态检查逻辑 - 替换Indy版本:若上述配置修改无效,可直接将项目依赖的Indy组件替换为10.2环境下的稳定版本,或升级到Indy官方最新源码,该类嵌入式HTTP设备通信的超时问题已在后续Indy更新中修复
内容的提问来源于stack exchange,提问作者Patrick Manion
相关产品推荐
相关产品推荐

