服务器发送FIN、ACK的时间过长



我有一个移动应用程序(捕获时间为186.18.33.118)从phpapi(200.80.41.246)的某个简单http服务器请求数据。

当我从应用程序发送请求时,我一分钟内无法从同一个发送请求的局域网访问web服务器。

服务器是一个Centos 7 apache和所有更新。

我用tcpdump分析了服务器和应用程序之间的数据包(下面显示了当我请求从应用程序到服务器,然后从浏览器到服务器使用wireshark打开时的捕获)。

我所能看到的奇怪的是,服务器发送FIN数据包ACK 的时间太长

可能出了什么问题?

编辑/添加

tcpdump 捕获

(如何捕获的步骤)

  1. 我在手机中打开了应用程序(该应用程序参考安装在服务器200.80.41.246上的wordpress)

  2. 几秒钟后,我试图从浏览器(从连接到手机的同一局域网)进入wordpress

  3. 服务器给我一条消息说:错误超时(靠近包45)

  4. 所以我尝试了很多次,一分钟后连接大致正常(在包110附近)

编辑2

我比较了浏览器和应用程序对api的查询,因为当我从浏览器发出请求时不会带来问题,我发现的区别是浏览器发送了应用程序没有发送的RST数据包。下面我留了一张图片,上面是浏览器的查询,下面是应用程序的查询。

wireshark 分析捕获

有什么建议吗?

在分析Linux中的连接配置时,我发现了两个允许重用以前关闭的连接的参数,它们都已启用。当我想从另一个具有相同公共IP的设备访问时,打开的连接发生冲突,并且会有一个新的连接,禁用和现在可以正常工作

参数为:
net.ipv4.tcp_tw_recycle
net.ipv4.tcp_tw_reuse
它们为1(已启用)

禁用执行命令
Sysctl net.ipv4.tcp_tw_recycle=0
Sysctl net.ipv4.tcp.tw_reuse=0

这里需要知道两件事:1。连接的TCP状态机关闭。2.与连接关闭相关联的TCP定时器。

总共有7个TCP定时器,其中">最大段寿命">和"重传"定时器将在连接关闭的情况下发挥作用。

现在关于TCP状态:客户端可以启动连接关闭,服务器也可以这样做。

"服务器向客户端发送一个带有"FIN"位设置。此时,服务器处于FIN_WAIT_1状态。客户端收到FIN数据包,进入CLOSE_WAIT状态,并向服务器发送一个确认数据包。当服务器收到该数据包时,它进入FIN_WAIT_2状态。从服务器的角度来看,连接现在已关闭,服务器无法再发送任何数据。但是,根据TCP协议,客户端需要也可以通过发送FIN数据包来关闭,服务器TCP实现应该对此进行确认。服务器应在最大段生存时间(MSL)定义的一段时间后关闭。">

在任何时候,如果发送方没有得到ack,就会触发重传。

你应该在你的具体情况下寻找:

1是MSL在你提到的延迟中扮演的角色。2是否有重新传输?是否存在虚假的重新传输?

如果您将共享tcpdump,将会很有帮助。通常,FIN数据包是在某个超时值之后发送的,该超时值取决于操作系统。

在Linux I上,默认值为60秒。看这里:TCP参数,Linux内核

编辑:

我看了一下捕获,发现了一些东西:

  1. 当服务器只是没有用[SYN,ACK]数据包响应SYN请求时,就会发生TCP重传。它试图向服务器打开许多会话,但服务器没有应答(约20个会话)。TCP重传是TCP协议的一部分,在3、6、12、24等之后(取决于TCP堆栈实现),当它没有收到答案时,它会发送重传,因此这是正常行为。

  2. 服务器下一次应答是在约48秒后(从第一次没有应答的SYN开始)。我的猜测是,服务器在这段时间内不会关闭会话,也不会接受其他会话。

最新更新