怎么禁用http协议,http协议被篡改无法上网

首页 > 经验 > 作者:YD1662022-11-09 14:19:05

问题现象

某应用在压测过程中,发现OTSClient与OTS服务端之间的TCP连接有大量处于TIME_WAIT状态。
查看与OTS服务端进行交互的不同TCP连接状态的数量:

netstat -ant | grep 10.4.170.39 | awk '/^tcp/{ state[$NF]};END{for(key in state) print key,state[key]}'

怎么禁用http协议,http协议被篡改无法上网(1)

图1 不同状态连接的数量

分析过程TIME_WAIT

怎么禁用http协议,http协议被篡改无法上网(2)

图2 TCP四次挥手


OTSClient连接处于TIME_WAIT状态,由上图可知TCP连接是由OTSClient主动关闭的,所以OTSClient为什么要频繁的关闭TCP连接?在什么情况下关闭的?

tcpdump

通过tcpdump抓包可以清楚OTSClient与OTS服务端通讯协议及建立连接、传输数据、断开连接的过程。
OTSClient与OTS服务端通讯协议是HTTP1.1,HTTP1.1默认开启长连接,所以代码在某个地方主动断开了连接,接下来是找到代码中什么地方主动关闭的连接。

OTSClient

OTSClient构造方法中用于构造与OTS服务端通讯的代码如下:

怎么禁用http协议,http协议被篡改无法上网(3)

图3 构造方法

AsyncServiceClient构造方法如下:

怎么禁用http协议,http协议被篡改无法上网(4)

图4 定时间隔逻辑

IdleConnectionEvictor

怎么禁用http协议,http协议被篡改无法上网(5)

图5 空闲连接管理

场景回顾

应用中配置的socketTimeout=50ms,根据上面逻辑closePeriod=20ms,即当TCP连接空闲20ms的时候就主动关闭,主动关闭造成的现象是大量连接处于TIME_WAIT状态。

对系统的影响QA

Q:是否可以调大socketTimeout来避免TIME_WAIT的问题?
A:不合适,该应用在线上访问OTS服务端平均响应时间是5ms,如果设置的过大,当与OTS服务端交互发生超时的时候,线程需要等待更长的时间会造成整个接口超时(业务要求该查询接口响应时间在60ms以下,线上平均响应时间是30ms)。

解决办法

查看了OTSClient 5.13.7的实现,与当前版本实现逻辑一致,所以更新OTSClient版本并不能解决这个问题。

怎么禁用http协议,http协议被篡改无法上网(6)

图6 pom依赖

已经向阿里反馈该问题,估计阿里的改动如下:

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.