我有一个移动应用程序(捕获时间为186.18.33.118)从phpapi(200.80.41.246)的某个简单http服务器请求数据。
当我从应用程序发送请求时,我一分钟内无法从同一个发送请求的局域网访问web服务器。
服务器是一个Centos 7 apache和所有更新。
我用tcpdump分析了服务器和应用程序之间的数据包(下面显示了当我请求从应用程序到服务器,然后从浏览器到服务器使用wireshark打开时的捕获)。
我所能看到的奇怪的是,服务器发送FIN数据包ACK 的时间太长
可能出了什么问题?
编辑/添加
tcpdump 捕获
(如何捕获的步骤)
-
我在手机中打开了应用程序(该应用程序参考安装在服务器200.80.41.246上的wordpress)
-
几秒钟后,我试图从浏览器(从连接到手机的同一局域网)进入wordpress
-
服务器给我一条消息说:错误超时(靠近包45)
-
所以我尝试了很多次,一分钟后连接大致正常(在包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内核
编辑:
我看了一下捕获,发现了一些东西:
-
当服务器只是没有用[SYN,ACK]数据包响应SYN请求时,就会发生TCP重传。它试图向服务器打开许多会话,但服务器没有应答(约20个会话)。TCP重传是TCP协议的一部分,在3、6、12、24等之后(取决于TCP堆栈实现),当它没有收到答案时,它会发送重传,因此这是正常行为。
-
服务器下一次应答是在约48秒后(从第一次没有应答的SYN开始)。我的猜测是,服务器在这段时间内不会关闭会话,也不会接受其他会话。