我在 Apache 服务器后面的 Jonas 上部署了一个 Java 应用程序。java应用程序用于下载文件。要下载文件,用户需要发送一个 get。所以有两个 TCP 连接:一个从用户到 Apache,一个从 Apache 到 Jonas。
我的问题是:Jonas 发送文件的速度比 Apache 发送给用户的速度快。当 Jonas 发送完所有文件后,它会通过 FIN,ACK 关闭连接的一半。Apache 以 RST 响应,并通过 FIN,ACK 关闭与用户的连接,即使用户尚未收到所有数据。
下面是问题的网络截图
连接是用户:54234 ---- 8089 Apache 55903 ---- 9019 Jonas
Time Source Src. Port Destination Dest. Port Protocol Length Info
14:16:43.898743 10.99.111.149 9019 10.99.111.149 55903 TCP 16452 9019 > 55903 [ACK] Seq=101869713 Ack=332 Win=34304 Len=16396[Packet size limited during capture] 0.000015 0.000015000
14:16:43.898978 10.99.111.149 55903 10.99.111.149 9019 TCP 56 55903 > 9019 [ACK] Seq=332 Ack=101886109 Win=24064 Len=0
14:16:43.898992 10.99.111.149 9019 10.99.111.149 55903 TCP 12891 9019 > 55903 [FIN, PSH, ACK] Seq=101886109 Ack=332 Win=34304 Len=12835
14:16:43.899004 10.99.111.149 55903 10.99.111.149 9019 TCP 56 55903 > 9019 [ACK] Seq=332 Ack=101898945 Win=11264 Len=0
14:16:43.899188 10.99.111.149 55903 10.99.111.149 9019 TCP 56 55903 > 9019 [RST, ACK] Seq=332 Ack=101898945 Win=639488 Len=0
14:16:43.899399 10.99.111.149 8089 10.99.111.157 54234 TCP 56 8089 > 54234 [FIN, ACK] Seq=4159541 Ack=258 Win=15872 Len=0
14:16:43.900091 10.99.111.157 54234 10.99.111.149 8089 TCP 62 54234 > 8089 [ACK] Seq=258 Ack=4159542 Win=65535 Len=0
14:16:44.013833 10.99.111.157 54234 10.99.111.149 8089 TCP 62 54234 > 8089 [FIN, ACK] Seq=258 Ack=4159542 Win=65535 Len=0
14:16:44.013880 10.99.111.149 8089 10.99.111.157 54234 TCP 56 8089 > 54234 [ACK] Seq=4159542 Ack=259 Win=15872 Len=0
我的问题是:
- 这是 Apache 的正常行为吗?Apache 可以在将所有数据发送给用户之前缓冲所有数据吗?
- 它是通过 mod_jk 还是在 Apache 配置中配置的?
- 当 TCP 连接出现问题时发送 RST,是否有专门针对这些问题的日志文件?