我的 Web 服务服务器有时无法接收正确的 HTTP 请求并返回“500 - 内部服务器错误”。tcpdump
在服务器上使用 Wireshark 后,我发现 HTTP 请求被拆分为 2 个 TCP 数据包,并且有时服务器会在第二个数据包到达之前尝试处理该请求。
此 wireshark 捕获已在服务器端采取。
所以我看到的是:
- HTTP 请求的第一个片段在
54.659
- 再次收到
71.168
- 请求的第二个(也是最后一个)片段在
99.869
(即第一个片段之后 45 秒)收到 - 四毫秒前,在 时
99.865
,服务器出现超时并尝试处理不完整的请求(出现 500 错误)
我不知道现在该去哪里找。我想说这是网络问题,但我有几个 TCP 流,服务器在完全接收请求之前几毫秒尝试处理请求。另一方面,需要 45 秒以上才能到达的 TCP 数据包意味着网络确实很糟糕。
您对如何进行进一步调查有什么指点吗?
答案1
我不知道现在该看哪里
没有地方,真的。
发生。
第一个发生后 45 秒
那真是太严重了。说真的。欧洲到美国的互联网延迟约为 150 毫秒。您的延迟是这个数字的 30 倍 - 如果不重新发送,就会掉线。遗憾的是,除非您控制双方(!),否则您无法控制客户端的行为。这样的事情时有发生。
如果那是您的 LAN - 那真是太糟糕了。如果那是互联网,那就是这样。主要问题是它有多糟糕 - 如果是“数千个连接”,则可能是另一端存在严重的网络问题。如果几乎每个人都遇到这种情况,则它更接近您这边(连接、数据中心等)。例如,昨天我们这里就遇到了这样的情况 - 一些愚蠢的 *** DDOS 攻击了我的一个链接。严重的拥塞可能导致数据包几乎无法通过。但如果那不是您 - 您无能为力。
这就像有人开会迟到了,然后告诉你他遇到了严重的交通堵塞。除非堵车发生在你所在的街道上,否则你不可能知道。有时,有些地方的互联网质量会很差。
答案2
重传可能是线索。客户端没有收到服务器为该数据包发送的 ACK。服务器还在转储开始时从同一源端口收到两个 SYN。
这两个 IP 地址都是本地的,所以我猜这不会通过互联网进行。您可以访问客户端吗?
尝试同时在客户端和服务器上执行相同的数据包跟踪。我预计您会看到发送的内容和接收的内容之间存在很大差异。
然后跟踪电缆。延迟和数据包丢失非常大,我会寻找当电压上升到足够高时电子会跳过的气隙,或者寻找一根剥落的 Cat-5 电缆,其连接处生锈并且上面有水滴。
更换网络部件(设备、端口和电缆),直到问题消失。
答案3
您是否尝试过指定响应的可缓存性以禁止中间设备缓存?
缓存控制:无缓存
或者
缓存控制:私有
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9