TCP Dup ACK、段丢失、SMTP 对话期间重新传输

TCP Dup ACK、段丢失、SMTP 对话期间重新传输

一位客户尝试向我们的 Exchange 服务器之一发送带有(较小和较大)附件的电子邮件,但在超时后重置了连接。在我看来,发送服务器似乎没有收到 ACK,因此重新发送,导致我们这边出现 DUP ACK。我们正在使用 Cisco ASA,但我们没有对任何相关接口使用任何 smtp/esmtp 策略(又名修复 smtp)(它用于完全不同的 vlan,其中没有 Exchange)。

1.1.1.1 接收 smtp 服务器
2.2.2.2 发送 smtp 服务器

直到“S: 354 开始邮件输入;以 . 结尾”,它都运行正常。问题真正出现在发送数据时。

Wireshark 转储

无时间源目标协议长度信息
20 504.923698 1.1.1.1 2.2.2.2 SMTP 78 S: 250 2.1.5 收件人 OK

无时间源目标协议长度信息
21 505.304394 2.2.2.2 1.1.1.1 SMTP 60 C:数据

无时间源目标协议长度信息
22 505.304713 1.1.1.1 2.2.2.2 SMTP 100 S: 354 开始邮件输入;以 结束。

无时间源目标协议长度信息
23 505.599857 2.2.2.2 1.1.1.1 SMTP 1434 C:数据片段,1380 字节

无时间源目标协议长度信息
24 505.620808 2.2.2.2 1.1.1.1 SMTP 1434 C:数据片段,1380 字节

无时间源目标协议长度信息
25 505.620823 1.1.1.1 2.2.2.2 TCP 54 smtp > 55346 [ACK] 序列号=450 确认=2904 赢=64860 长度=0

无时间源目标协议长度信息
26 505.919899 2.2.2.2 1.1.1.1 SMTP 1434 [TCP 前一个段丢失] C:数据段,1380 字节

无时间源目标协议长度信息
27 505.919912 1.1.1.1 2.2.2.2 TCP 54 [TCP 重复 ACK 25#1] smtp > 55346 [ACK] Seq=450 Ack=2904 Win=64860 Len=0

无时间源目标协议长度信息
28 505.940785 2.2.2.2 1.1.1.1 SMTP 1434 [TCP 前一个段丢失] C:数据片段,1380 字节

编号 时间 源 目标 协议 长度 信息
29 505.940797 1.1.1.1 2.2.2.2 TCP 54 [TCP 重复 ACK 25#2] smtp > 55346 [ACK] Seq=450 Ack=2904 Win=64860 Len=0

编号 时间 源 目标 协议 长度 信息
30 505.961793 2.2.2.2 1.1.1.1 SMTP 1434 [TCP 重传] C:数据片段,1380 字节

编号 时间 源 目标 协议 长度 信息
31 505.982494 2.2.2.2 1.1.1.1 SMTP 1434 [TCP 重传] C:数据片段,1380 字节

编号 时间 源 目标 协议 长度 信息
32 505.982508 1.1.1.1 2.2.2.2 TCP 54 smtp > 55346 [ACK] 序列号=450 确认=4284 赢=64860 长度=0

编号 时间 源 目标 协议 长度 信息
33 506.302829 2.2.2.2 1.1.1.1 SMTP 1434 [TCP 前一个段丢失] C:数据片段,1380 字节

编号 时间 源 目标 协议 长度 信息
34 506.302846 1.1.1.1 2.2.2.2 TCP 54 [TCP 重复 ACK 32#1] smtp > 55346 [ACK] Seq=450 Ack=4284 Win=64860 Len=0

编号 时间 源 目标 协议 长度 信息
35 506.323446 2.2.2.2 1.1.1.1 SMTP 1434 [TCP 重传] C:数据片段,1380 字节

等等,直到超时。

我们运行其他 Exchange 服务器,发件人可以向其发送相同的电子邮件。我们所有的 Exchange 服务器都位于相同的防火墙、路由器和交换机后面。可能只有接线不同。
哦,从 gmail 向服务器发送 15MB 的附件是可行的

正常连续 ping:

2.2.2.2 的 Ping 统计信息:
    数据包:已发送 = 249,已接收 = 249,丢失 = 0(0% 丢失),
近似往返时间(以毫秒为单位):
    最小值 = 82 毫秒,最大值 = 546 毫秒,平均值 = 138 毫秒
^C

# 992 字节的未碎片数据包可以正常工作
 C:\Users\someadmin>ping -f -l 992 2.2.2.2

对 2.2.2.2 执行 ping 操作,数据为 992 字节:
来自 2.2.2.2 的回复:字节=992 时间=100ms TTL=48
来自 2.2.2.2 的回复:字节=992 时间=101ms TTL=48
来自 2.2.2.2 的回复:字节=992 时间=101ms TTL=48
来自 2.2.2.2 的回复:字节=992 时间=100ms TTL=48

2.2.2.2 的 Ping 统计信息:
    数据包:已发送 = 4,已接收 = 4,丢失 = 0(0% 丢失),
近似往返时间(以毫秒为单位):
    最小值 = 100 毫秒,最大值 = 101 毫秒,平均值 = 100 毫秒


# 未碎片化的 993 字节数据包失败
C:\Users\someadmin>ping -f -l 993 2.2.2.2

对 2.2.2.2 执行 ping 操作,数据为 993 字节:
请求超时。
请求超时。
请求超时。
请求超时。

2.2.2.2 的 Ping 统计信息:
    数据包:已发送 = 4,已接收 = 0,丢失 = 4(100%丢失),

但是我可以使用大数据包 ping googles dns:

ping -f -l 1472 8.8.8.8

正在 ping 8.8.8.8,数据为 1472 字节:
来自 8.8.8.8 的回复:字节=64(已发送 1472)时间=31ms TTL=51

ping -f -l 1472 8.8.4.4

正在 ping 8.8.4.4,数据为 1472 字节:
来自 8.8.4.4 的回复:字节=64(已发送 1472)时间=30ms TTL=51

思科 ASA 策略

类映射检查默认
 匹配默认检查流量
策略映射类型检查 DNS preset_dns_map
 参数
  消息长度最大客户端自动
  消息长度最大为 3096
  没有 DNS 保护
  不执行协议
  无 nat-rewrite
策略图 global_policy
 检查类_默认
  检查 DNS preset_dns_map
  检查 ftp
  检查 h323 h225
  检查 h323 ras
  检查 rsh
  检查 rtsp
  检查 sqlnet
  检查瘦  
  检查 sunrpc
  检查 xdmcp
  检查 SIP  
  检查 netbios
  检查 tftp
  检查 ip 选项
  检查 icmp
策略图 shape_policy
 类类默认
  警方输入 10000000 5000
  警察输出 10000000 5000

我应该从哪里开始查找?我应该先要求发送方执行相同的 wireshark/tcpdump 跟踪吗?

答案1

很难确定,但我认为,这里存在 MTU 路径问题。执行路径 MTU 发现并相应地减少网关(或服务器 NIC)的 MTU。如果它解决了您的问题,那么您就有证据表明路径中的某个节点没有正确处理 MTU(要么丢弃 ICMP 代码 4 数据包,要么根本不发回)。

相关内容