AD自动保持长连接导致无法正常关闭http连接
  

ipluto Lv2发表于 2019-5-13 17:56

本帖最后由 ipluto 于 2019-5-16 10:03 编辑

问题描述:
    客户连接我司服务经常出现超时。

排查过程:
    在客户端抓包发现大量端口复用的包,由于客户业务复杂,既是服务端也是客户端。导致端口占用严重。2分钟左右会复用端口。
    在ad抓包有收到客户端的复用端口连接的syn请求。但ad不回应请求。由深信服工程师分析发现复用端口的的原连接在ad并未释放,依然处于ESTABLISHED状态,导致同样五元组的报文到达后,ad认定为异常包,不处理。

    分析报文发现客户通知ad关闭连接,但ad不回应。工程师给出原因是由于客户端同时发送ssl close notfiy与tcp fin。导致ad不能正常处理关闭流程,而客户端在发送请求后进入fin wait,在fin wait超时(客户端为20秒)后释放链接。
    工程师给出两个解决方案:
    1、修改七层虚拟服务TCP策略,将超时时间修改成1分钟。到达超时时间后ad发送keepalive包,如客户端不回应,ad关闭连接。
    2、打补丁包。使ad回应关闭消息。
    与开发一起分析发现服务端发送的connection: close报文被ad改写为S-Cnection: close。导致数据传输完成后服务端无法通知到客户端关闭连接。
    AD改写后的报头:
Content-Type: application/octet-stream;charset=utf-8
Content-Language: zh-CN
Content-Length: 188
Date: Mon, 06 May 2019 06:21:05 GMT
S-Cnection: close
Server: nginx


    在后台关闭服务自动保持长连接后客户端可收到服务端的关闭通知。正常关闭会话。
修改参数后:
2.png
修改参数前:
QQ图片20190513172156.png

原因:
    1、ad不回应客户端关闭连接消息
    2、ad主动改写http关闭请求

解决方案:
    1、打补丁,使ad回应关闭消息。
    2、关闭服务自动保持长连接。

建议:
    ad默认对http进行优化。对浏览器类需要长连接的应用保持友好。对高并发短连接确是灾难。希望下个版本可显示的在界面对默认优化参数增加开关(全局开关、单服务开关)。

喜欢这篇分享吗?喜欢就给楼主打点赏吧!点个赞也是极大的鼓励!

发帖可获得5S豆;若您的分享被加精或推荐优秀等,将获得更多S豆奖励,了解更多S豆奖励信息

完善手机号和公司名称,让服务更省心更便捷!立即完善

sangfor_闪电回_小六 发表于 2019-5-14 11:46
  
非常实用的案例,感谢楼主分享
新手915440 Lv9发表于 2019-5-16 10:00
  
实用的案例,感谢楼主分享
阿飞007 Lv9发表于 2019-5-16 10:46
  
最新版本7.0.7R1碰到该情况也需要打补丁么?
海鲜 Lv4发表于 2019-5-17 08:31
  
需要打什么补丁包
小文来了 Lv6发表于 2019-5-17 08:50
  
实用的案例,感谢楼主分享。
drogba Lv11发表于 2019-5-19 17:06
  

实用的案例
白露为霜 Lv3发表于 2019-5-21 11:56
  
实用的案例,感谢楼主分享。
这西瓜我吃定了233 Lv2发表于 2019-5-23 09:10
  
实用的案例,学习了
黄波 Lv4发表于 2019-5-24 11:48
  
bangband~哒~!