背景,很长一段时间以来,我们的防火墙都存在问题,有时会导致 HTTP 请求挂起部分加载,直到 TCP 超时。
在跟踪防火墙上的流量后,我注意到它仅在某些时间条件下发生,例如,在客户端在有效负载上发送第二个 ACK 之前,网络服务器已经发送了整个响应。[SYN, SYN/ACK, ACK] 已交换,REQUEST 已发送并确认,第一个 RESPONSE 数据包已收到并确认,然后网络服务器一次性发送其余的响应正文(8 个数据包)包括最后一个 FIN,PSH)并且在客户端确认其中任何一个之前,防火墙拒绝向 Web 服务器发送 RST,并使客户端无限挂起。
这是来自防火墙两侧的数据包的整个wireshark跟踪。192.168.126.161 是客户端的私有 NAT'et IP 地址。172.16.1.2是网络服务器IP(不显示真实公网IP),10.1.1.1是防火墙外部IP(不显示真实公网IP)
2105 0.086275 192.168.126.161 172.16.1.2 TCP 37854 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 SACK_PERM=1 TSV=89375083 TSER=0
2106 0.000066 10.1.1.1 172.16.1.2 TCP 37854 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 SACK_PERM=1 TSV=89375083 TSER=0
2107 0.002643 172.16.1.2 10.1.1.1 TCP http > 37854 [SYN, ACK] Seq=0 Ack=1 Win=32768 Len=0 MSS=1460
2108 0.007705 172.16.1.2 192.168.126.161 TCP http > 37854 [SYN, …
Run Code Online (Sandbox Code Playgroud)