我遇到了最奇怪的问题:Web 服务器有时仅在非常特定的请求下才会在发送 FIN 数据报后向客户端发送 RST。首先,介绍一下设置:
- 服务器:Win7 x64 主机上的 VM 客户机 Ubuntu 12.04.1 LTS,桥接模式,主机上禁用 ufw
- 客户端:Win7 x64 主机上的 Mountain Lion(hackintosh)VM 客户机中的 iOS 模拟器,桥接模式。
- 两者都在同一个局域网上。一个通过以太网连接到路由器,另一个通过 WiFi 连接到路由器。
服务器上的 HTTP 日志表明客户端有时会发出多个相同的后续请求。客户端只是在收到服务器的 RST 数据包后重新尝试。
我附加了几个 tcpdump:
- Good1 是良好会话的服务器端 tcpdump(“良好”表示没有生成 RST)。
- Good3 是另一个良好会话的服务器端 tcpdump。
Good1 和 Good3 之间的区别在于服务器发送 ACK 的顺序,确认客户端的请求。请求分为 2 个部分。一个是 HTTP 标头,另一个是包含空 JSON 对象的正文:"{}"
。
在 Good1 中,服务器在第二个请求到达后确认两个请求。在 Good3 中,服务器在请求到达后立即确认每个请求。这应该没有什么区别。
- Bad1 是客户端和服务器端错误会话的转储。
- Bad2 是另一个错误的会话,这次仅限于服务器端。
请注意,在所有“坏”会话中,服务器在收到每个请求后都会立即确认。其他几个坏会话的情况也一样,但未包括在内。奇怪的是,“Good3”中也表现出同样的行为,这使得这一观察结果毫无意义。我不明白这有什么关系。
底线是我无法准确指出好的会议与坏的会议之间的显著差异。
我的问题是:为什么会生成这些 RST?
或者至少:我如何进一步调试这个问题,或者在这里提供更多有用的信息?
编辑我了解到两个新事实:
- RFC(1122)的第 4.2.2.13 节(以及维基百科的“TCP”一文中的“连接终止”下)指出,一个主机上的 TCP 应用程序可能会在读取其套接字缓冲区中的所有数据之前关闭连接,在这种情况下,主机上的 TCP 将向另一端发送 RST,以让另一端知道并未读取其发送的所有数据。
我不确定我是否完全理解了这一点,因为关闭我这边的连接仍然允许我阅读,不是吗?这也意味着我不能再写东西了。
不过,我不确定这是否相关,因为我看到了 RST后鳍。
- 有多个投诉称 wsgiref(Python 的开发模式 HTTP 服务器)发生了这种情况,而我正在使用的正是该服务器。
当我发现更多消息时,我会持续更新。
谢谢!
Good1——服务器端
13:28:2.308319 IP 192.168.1.51.51479 > 192.168.1.132.5000:标志 [S],seq 94268074,win 65535,选项 [mss 1460,nop,wscale 4,nop,nop,TS val 943308864 ecr 0,sackOK,eol],长度 0 13:28:2.308336 IP 192.168.1.132.5000 > 192.168.1.51.51479:标志 [S.],seq 1726304574,ack 94268075,win 14480,选项 [mss 1460,sackOK,TS val 326480982 ecr 943308864,nop,wscale 3],长度 0 13:28:2.309750 IP 192.168.1.51.51479 > 192.168.1.132.5000:标志[.],ack 1,win 8235,选项[nop,nop,TS val 943308865 ecr 326480982],长度0 13:28:2.310744 IP 192.168.1.51.51479 > 192.168.1.132.5000: 标志 [P.], seq 1:351, ack 1, win 8235, 选项 [nop,nop,TS val 943308865 ecr 326480982], 长度 350 13:28:2.310766 IP 192.168.1.51.51479 > 192.168.1.132.5000: 标志 [P.], seq 351:353, ack 1, win 8235, 选项 [nop,nop,TS val 943308865 ecr 326480982], 长度 2 13:28:2.310841 IP 192.168.1.132.5000 > 192.168.1.51.51479:标志[.],ack 351,win 1944,选项[nop,nop,TS val 326480983 ecr 943308865],长度0 13:28:2.310918 IP 192.168.1.132.5000 > 192.168.1.51.51479:标志[.],ack 353,win 1944,选项[nop,nop,TS val 326480983 ecr 943308865],长度0 13:28:2.315931 IP 192.168.1.132.5000 > 192.168.1.51.51479:标志 [P.],seq 1:18,ack 353,win 1944,选项 [nop,nop,TS val 326480984 ecr 943308865],长度 17 13:28:2.316107 IP 192.168.1.132.5000 > 192.168.1.51.51479:标志 [FP.],seq 18:684,ack 353,win 1944,选项 [nop,nop,TS val 326480984 ecr 943308865],长度 666 13:28:2.317651 IP 192.168.1.51.51479 > 192.168.1.132.5000:标志[.],ack 18,win 8234,选项[nop,nop,TS val 943308872 ecr 326480984],长度0 13:28:2.318288 IP 192.168.1.51.51479 > 192.168.1.132.5000:标志[.],ack 685,win 8192,选项[nop,nop,TS val 943308872 ecr 326480984],长度0 13:28:2.318640 IP 192.168.1.51.51479 > 192.168.1.132.5000:标志 [F.],seq 353,ack 685,win 8192,选项 [nop,nop,TS val 943308872 ecr 326480984],长度 0 13:28:2.318651 IP 192.168.1.132.5000 > 192.168.1.51.51479:标志[.],ack 354,win 1944,选项[nop,nop,TS val 326480985 ecr 943308872],长度0
Good3——服务器端
13:28:3.311143 IP 192.168.1.51.51486 > 192.168.1.132.5000:标志 [S],seq 1982901126,win 65535,选项 [mss 1460,nop,wscale 4,nop,nop,TS val 943309853 ecr 0,sackOK,eol],长度 0 13:28:3.311155 IP 192.168.1.132.5000 > 192.168.1.51.51486:标志 [S.],seq 2245063571,ack 1982901127,win 14480,选项 [mss 1460,sackOK,TS val 326481233 ecr 943309853,nop,wscale 3],长度 0 13:28:3.312671 IP 192.168.1.51.51486 > 192.168.1.132.5000:标志[.],ack 1,win 8235,选项[nop,nop,TS val 943309854 ecr 326481233],长度0 13:28:3.313330 IP 192.168.1.51.51486 > 192.168.1.132.5000:标志 [P.],seq 1:351,ack 1,win 8235,选项 [nop,nop,TS val 943309855 ecr 326481233],长度 350 13:28:3.313337 IP 192.168.1.132.5000 > 192.168.1.51.51486:标志[.],ack 351,win 1944,选项[nop,nop,TS val 326481234 ecr 943309855],长度0 13:28:3.313342 IP 192.168.1.51.51486 > 192.168.1.132.5000:标志 [P.],seq 351:353,ack 1,win 8235,选项 [nop,nop,TS val 943309855 ecr 326481233],长度 2 13:28:3.313346 IP 192.168.1.132.5000 > 192.168.1.51.51486:标志 [.],ack 353,win 1944,选项 [nop,nop,TS val 326481234 ecr 943309855],长度 0 13:28:3.327942 IP 192.168.1.132.5000 > 192.168.1.51.51486:标志 [P.],seq 1:18,ack 353,win 1944,选项 [nop,nop,TS val 326481237 ecr 943309855],长度 17 13:28:3.328253 IP 192.168.1.132.5000 > 192.168.1.51.51486:标志 [FP.],seq 18:684,ack 353,win 1944,选项 [nop,nop,TS val 326481237 ecr 943309855],长度 666 13:28:3.329076 IP 192.168.1.51.51486 > 192.168.1.132.5000:标志[.],ack 18,win 8234,选项[nop,nop,TS val 943309868 ecr 326481237],长度0 13:28:3.329688 IP 192.168.1.51.51486 > 192.168.1.132.5000:标志[.],ack 685,win 8192,选项[nop,nop,TS val 943309868 ecr 326481237],长度0 13:28:3.330361 IP 192.168.1.51.51486 > 192.168.1.132.5000:标志 [F.],seq 353,ack 685,win 8192,选项 [nop,nop,TS val 943309869 ecr 326481237],长度 0 13:28:3.330370 IP 192.168.1.132.5000 > 192.168.1.51.51486:标志 [.],ack 354,win 1944,选项 [nop,nop,TS val 326481238 ecr 943309869],长度 0
Bad1——服务器端
13:28:1.311876 IP 192.168.1.51.51472 > 192.168.1.132.5000:标志 [S],seq 920400580,win 65535,选项 [mss 1460,nop,wscale 4,nop,nop,TS val 943307883 ecr 0,sackOK,eol],长度 0 13:28:1.311896 IP 192.168.1.132.5000 > 192.168.1.51.51472:标志 [S.],seq 3103085782,ack 920400581,win 14480,选项 [mss 1460,sackOK,TS val 326480733 ecr 943307883,nop,wscale 3],长度 0 13:28:1.313509 IP 192.168.1.51.51472 > 192.168.1.132.5000:标志[.],ack 1,win 8235,选项[nop,nop,TS val 943307884 ecr 326480733],长度0 13:28:1.315614 IP 192.168.1.51.51472 > 192.168.1.132.5000: 标志 [P.], seq 1:351, ack 1, win 8235, 选项 [nop,nop,TS val 943307886 ecr 326480733], 长度 350 13:28:1.315727 IP 192.168.1.132.5000 > 192.168.1.51.51472:标志 [.],ack 351,win 1944,选项 [nop,nop,TS val 326480734 ecr 943307886],长度 0 13:28:1.316229 IP 192.168.1.51.51472 > 192.168.1.132.5000: 标志 [P.], seq 351:353, ack 1, win 8235, 选项 [nop,nop,TS val 943307886 ecr 326480733], 长度 2 13:28:1.316242 IP 192.168.1.132.5000 > 192.168.1.51.51472:标志[.],ack 353,win 1944,选项[nop,nop,TS val 326480734 ecr 943307886],长度0 13:28:1.321019 IP 192.168.1.132.5000 > 192.168.1.51.51472:标志 [P.],seq 1:18,ack 353,win 1944,选项 [nop,nop,TS val 326480735 ecr 943307886],长度 17 13:28:1.321294 IP 192.168.1.132.5000 > 192.168.1.51.51472:标志 [FP.],seq 18:684,ack 353,win 1944,选项 [nop,nop,TS val 326480736 ecr 943307886],长度 666 13:28:1.321386 IP 192.168.1.132.5000 > 192.168.1.51.51472:标志 [R.],seq 685,ack 353,win 1944,选项 [nop,nop,TS val 326480736 ecr 943307886],长度 0 13:28:1.322727 IP 192.168.1.51.51472 > 192.168.1.132.5000:标志[.],ack 18,win 8234,选项[nop,nop,TS val 943307891 ecr 326480735],长度0 13:28:1.322733 IP 192.168.1.132.5000 > 192.168.1.51.51472:标志 [R],序列号 3103085800,win 0,长度 0 13:28:1.323221 IP 192.168.1.51.51472 > 192.168.1.132.5000:标志[.],ack 685,win 8192,选项[nop,nop,TS val 943307892 ecr 326480736],长度0 13:28:1.323231 IP 192.168.1.132.5000 > 192.168.1.51.51472:标志 [R],序号 3103086467,win 0,长度 0
Bad1——客户端
t:11.374654 IP 192.168.1.51.51472 > 192.168.1.132.5000:标志 [S],seq 920400580,win 65535,选项 [mss 1460,nop,wscale 4,nop,nop,TS val 943307883 ecr 0,sackOK,eol],长度 0 t:11.375764 IP 192.168.1.132.5000 > 192.168.1.51.51472:标志 [S.],seq 3103085782,ack 920400581,win 14480,选项 [mss 1460,sackOK,TS val 326480733 ecr 943307883,nop,wscale 3],长度 0 t:11.376352 IP 192.168.1.51.51472 > 192.168.1.132.5000:标志[.],ack 1,win 8235,选项[nop,nop,TS val 943307884 ecr 326480733],长度0 t:11.378252 IP 192.168.1.51.51472 > 192.168.1.132.5000:标志 [P.],seq 1:351,ack 1,win 8235,选项 [nop,nop,TS val 943307886 ecr 326480733],长度 350 t:11.379027 IP 192.168.1.51.51472 > 192.168.1.132.5000:标志 [P.],seq 351:353,ack 1,win 8235,选项 [nop,nop,TS val 943307886 ecr 326480733],长度 2 t:11.379732 IP 192.168.1.132.5000 > 192.168.1.51.51472:标志 [.],ack 351,win 1944,选项 [nop,nop,TS val 326480734 ecr 943307886],长度 0 t:11.380592 IP 192.168.1.132.5000 > 192.168.1.51.51472:标志 [.],ack 353,win 1944,选项 [nop,nop,TS val 326480734 ecr 943307886],长度 0 t:11.384968 IP 192.168.1.132.5000 > 192.168.1.51.51472:标志 [P.],seq 1:18,ack 353,win 1944,选项 [nop,nop,TS val 326480735 ecr 943307886],长度 17 t:11.385044 IP 192.168.1.51.51472 > 192.168.1.132.5000:标志[.],ack 18,win 8234,选项[nop,nop,TS val 943307891 ecr 326480735],长度0 t:11.385586 IP 192.168.1.132.5000 > 192.168.1.51.51472:标志 [FP.],seq 18:684,ack 353,win 1944,选项 [nop,nop,TS val 326480736 ecr 943307886],长度 666 t:11.385743 IP 192.168.1.51.51472 > 192.168.1.132.5000:标志[.],ack 685,win 8192,选项[nop,nop,TS val 943307892 ecr 326480736],长度0 t:11.385966 IP 192.168.1.132.5000 > 192.168.1.51.51472:标志 [R.],seq 685,ack 353,win 1944,选项 [nop,nop,TS val 326480736 ecr 943307886],长度 0 t:11.387343 IP 192.168.1.132.5000 > 192.168.1.51.51472:标志 [R],序列号 3103085800,win 0,长度 0 t:11.387344 IP 192.168.1.132.5000 > 192.168.1.51.51472:标志 [R],序列号 3103086467,win 0,长度 0
Bad2——服务器端
13:28:1.319185 IP 192.168.1.51.51473 > 192.168.1.132.5000:标志 [S],seq 1631526992,win 65535,选项 [mss 1460,nop,wscale 4,nop,nop,TS val 943307889 ecr 0,sackOK,eol],长度 0 13:28:1.319197 IP 192.168.1.132.5000 > 192.168.1.51.51473:标志 [S.],seq 2524685719,ack 1631526993,win 14480,选项 [mss 1460,sackOK,TS val 326480735 ecr 943307889,nop,wscale 3],长度 0 13:28:1.320692 IP 192.168.1.51.51473 > 192.168.1.132.5000:标志[.],ack 1,win 8235,选项[nop,nop,TS val 943307890 ecr 326480735],长度0 13:28:1.322219 IP 192.168.1.51.51473 > 192.168.1.132.5000:标志 [P.],seq 1:351,ack 1,win 8235,选项 [nop,nop,TS val 943307890 ecr 326480735],长度 350 13:28:1.322336 IP 192.168.1.132.5000 > 192.168.1.51.51473:标志[.],ack 351,win 1944,选项[nop,nop,TS val 326480736 ecr 943307890],长度0 13:28:1.322689 IP 192.168.1.51.51473 > 192.168.1.132.5000:标志 [P.],seq 351:353,ack 1,win 8235,选项 [nop,nop,TS val 943307890 ecr 326480735],长度 2 13:28:1.322700 IP 192.168.1.132.5000 > 192.168.1.51.51473:标志[.],ack 353,win 1944,选项[nop,nop,TS val 326480736 ecr 943307890],长度0 13:28:1.326307 IP 192.168.1.132.5000 > 192.168.1.51.51473: 标志 [P.], seq 1:18, ack 353, win 1944, 选项 [nop,nop,TS val 326480737 ecr 943307890], 长度 17 13:28:1.326614 IP 192.168.1.132.5000 > 192.168.1.51.51473:标志 [FP.],seq 18:684,ack 353,win 1944,选项 [nop,nop,TS val 326480737 ecr 943307890],长度 666 13:28:1.326710 IP 192.168.1.132.5000 > 192.168.1.51.51473:标志 [R.],seq 685,ack 353,win 1944,选项 [nop,nop,TS val 326480737 ecr 943307890],长度 0 13:28:1.328499 IP 192.168.1.51.51473 > 192.168.1.132.5000:标志[.],ack 18,win 8234,选项[nop,nop,TS val 943307896 ecr 326480737],长度0 13:28:1.328509 IP 192.168.1.132.5000 > 192.168.1.51.51473:标志 [R],序号 2524685737,win 0,长度 0 13:28:1.328514 IP 192.168.1.51.51473 > 192.168.1.132.5000:标志[.],ack 685,win 8192,选项[nop,nop,TS val 943307896 ecr 326480737],长度0 13:28:1.328517 IP 192.168.1.132.5000 > 192.168.1.51.51473:标志 [R],序号 2524686404,win 0,长度 0