0

我有一个 IMAP 服务器 (Dovecot),我正在尝试在其上创建 1,200 个邮箱(用于性能测试)。服务器成功创建邮箱。

在此操作之后,我想列出所有创建的文件夹。服务器发送一些数据,但是,在一段时间(近 1 秒)后,客户端发送RST,ACK到服务器,以响应服务器响应 IMAP 协议关于创建的文件夹列表的命令。

这是我的 Wireshark 转储片段:

IMAP: Src Port: imap (143), Dst Port: 56794 (56794), Seq: 29186, Ack: 20533, Len: 24
IMAP: Src Port: 56794 (56794), Dst Port: imap (143), Seq: 20533, Ack: 29210, Len: 15
IMAP: Src Port: imap (143), Dst Port: 56794 (56794), Seq: 29210, Ack: 20548, Len: 16384
TCP: 56794 > imap [ACK] Seq=20548 Ack=45594 Win=49408 Len=0 TSV=3940902 TSER=3940902
IMAP: Src Port: imap (143), Dst Port: 56794 (56794), Seq: 45594, Ack: 20548, Len: 16384
TCP: 56794 > imap [RST, ACK] Seq=20548 Ack=61978 Win=49408 Len=0 TSV=3940902 TSER=3940902

编辑:嗯,我想我知道为什么RST标志是由客户端发送的。原因是服务器超出了我的环回接口的MTU值。我已经检查了示例 Mina 服务器的类似行为 - 那里一切正常,即 TCP/IP 协议抑制了巨大的数据包。所以Dovecot不能明智地管理数据包。但是我有自己的 IMAP 服务器(基于 MINA),问题仍然存在!

那么,为什么 TCP/IP 协议只对某些应用程序而不是对所有应用程序明智地管理发送的数据包(根据 MTU 值拆分它们)呢?

4

1 回答 1

2

您对发送 TCP 重置的原因的假设是不正确的。如果你已经超过了 MTU,那不是由 TCP 管理的。它在 IP 层进行管理,并且将向客户端发送 ICMP“需要分段”消息。然后,这样的消息应该导致客户端在 IP 层对数据包进行分段。根据您共享的信息,您的情况不会发生这种情况。

关于环回接口,这个流量在环回接口附近没有任何地方,不是两个独立的设备吗?

可悲的是,您的跟踪文件仍然没有提供任何有关此数据包原因的见解 -

IMAP: Src Port: imap (143), Dst Port: 56794 (56794), Seq: 45594, Ack: 20548, Len: 16384

导致 TCP 重置。我无法从这些信息中推断出更多信息。

TCP 有一个名为Maximum Segment size的选项,它相似但也不同 :) TCP/IP 堆栈独立于应用程序,不会对每个应用程序应用不同的设置,它是系统范围的。

编辑:查看您的数据包捕获,没有任何迹象表明 MTU 问题。任何地方都没有 ICMP 流量,所以我怀疑这不是问题。如果存在 MTU 问题,它应该发生在上一个响应中,因为来自 IMAP 服务器的两个 LIST 响应大小相同,并且窗口大小没有问题。

我唯一能看到的是与最终响应的第一个元素(在 RST 之前)有关,其中部分回复看起来格式不正确(见附件)。IMAP 应用程序出现问题,它所回复的数据格式不正确。imap 响应- 查看与 pcap 中所有其他 LIST 响应一致的底部两个响应的差异。

于 2012-08-23T13:10:04.220 回答