服务器发送FIN需要太长时间,确认

时间:2016-05-23 04:00:59

标签: php linux networking centos tcp-ip

我有一个移动应用程序(在捕获中是186.18.33.118)从php api(200.80.41.246)请求来自一些简单的http服务器的数据。

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

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

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

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

有什么不对?

修改/添加

Capture with tcpdump

(我如何进行捕获的步骤)

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

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

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

  4. 所以我尝试了很多次,一分钟后,大约连接工作正常(靠近包110)

  5. 编辑2

    我在浏览器和应用程序中对api的查询进行了比较,因为当我从浏览器发出请求时没有带来问题,我发现的差异是浏览器发送的RST数据包是应用程序不发送。 下面我留下一张图片,顶部是来自浏览器的查询,底部是来自应用程序的查询。

    analyzed capture by wireshark

    有什么建议吗?

3 个答案:

答案 0 :(得分:1)

在分析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 :(得分:0)

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

在Linux上,我的默认值是60秒。 看这里:TCP parameters, Linux kernel

编辑:

我看了捕捉,有几件事情:

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

  2. 下次服务器应答的时间是~48秒(从第一个没有应答的SYN开始)。我的猜测是服务器不关闭会话,并且在此期间不接受其他会话。

答案 2 :(得分:0)

您需要在此处了解两件事:1。用于连接的TCP状态机关闭。 2.与连接闭包相关的TCP定时器。

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

现在关于TCP状态:客户端可以启动连接关闭,或者服务器也可以执行此操作。

"服务器向客户端发送一个包含" FIN"位设置。此时,服务器处于FIN_WAIT_1状态。客户端获取FIN数据包并进入CLOSE_WAIT状态,并将确认数据包发送回服务器。当服务器获取该数据包时,它将进入FIN_WAIT_2状态。从服务器的角度来看,连接现在已关闭,服务器无法再发送任何数据。但是,在TCP协议下,客户端还需要通过发送FIN数据包来关闭,服务器TCP实现应该确认该数据包。服务器应在最长段寿命(MSL)定义的一段时间后关闭。"

在任何时候,如果发送者没有得到确认,它将触发重传。

你应该在你的具体案例中寻找:

1是MSL在您提到的延迟中扮演角色。 2有没有重传?有没有虚假的重传?