【发布时间】:2021-05-02 18:20:47
【问题描述】:
我正在使用 ActiveMQ Artemis Broker 并通过客户端应用程序发布到它。
观察到的行为:
- 当我的客户端是 IPV4 时,会建立 TLS 握手并按预期发布数据,没有问题。
- 当我的客户端是 IPV6 时,我看到客户端和服务器(代理)之间经常重新建立连接,并且没有发布任何数据。
详情:
- 使用 IPV6 时,客户端会进行 3 次握手并尝试发送数据。它还接收 Server Hello 并发送应用程序数据。
- 但连接终止并再次重新连接。这个循环不断发生。
- 使用 IPv4 和 IPv6 时,客户端库、网络基础设施和代理都完全相同。
客户端日志说:
Idle network reply timeout.
代理日志显示传入的连接请求以及来自代理的 CONNACK,例如:
MQTT(): IN << CONNECT protocol=(MQTT, 4), hasPassword=false, isCleanSession=false, keepAliveTimeSeconds=60, clientIdentifier=b_001, hasUserName=false, isWillFlag=false
MQTT(): OUT >> CONNACK connectReturnCode=0, sessionPresent=true
wire-shark (tcpdump) 告诉我们什么:
-
在每次重新连接之前(完成 3 次握手)我看到了这个:
Id Src Dest 1 Broker(App Data) Client 2 Broker(App Data) Client 3 Client(ACK) Broker 4 Client(ACK) Broker 5 Broker(FIN,ACK) Client 6 Client(FIN,ACK) Broker 7 Broker (ACK) Client 8 Client (SYN) Broker 9 Broker (SYN/ACK) Client 10 Client (ACK) Broker
然后 3 次握手(Client hello, Change Cipher Spec, Server Hello)和上面的再次重复。
根据数据包 5、6 和 7,我得出结论,连接正在被代理(服务器)终止。客户端确认终止,然后再次尝试重新连接,因为这是一个尝试重新连接和发布的无限循环。
我第一次看网络级分析,甚至是wireshark。我不确定我的分析是否正确。
也碰壁了,不知道为什么只有当设备是 IPV6 时才会发生重新连接。我也没有看到任何RST 表示连接终止。
代理也在发送CONNACK(来自代理日志),但仍然没有发送数据,只是尝试重新连接不知道为什么。
另外,我看到了一些我看到了一些:
- 无序 TCP(当 src 是代理时)
- 虚假重传
- DUP ACK(src 是客户端)
不确定这是否重要。
关于发生了什么的任何标题?
【问题讨论】:
-
@JustinBertram
MQTT(): IN << CONNECT protocol=(MQTT, 4), hasPassword=false, isCleanSession=false, keepAliveTimeSeconds=60, clientIdentifier=b_001, hasUserName=false, isWillFlag=false MQTT(): OUT >> CONNACK connectReturnCode=0, sessionPresent=true这是所有代理日志显示,频繁的连接 IN 和 CONNACK,仅此而已。 -
是的,是一样的
-
抱歉,是的,在 CONNACK 发布后发生 IPV4 时会发生这种情况。当 CONNACK 后 IPV6 再次发生重新连接时。即我们看到 IN
-
@JustinBertram 进行了更广泛的研究。问题出在网络中的 LB 设置上。 LB 的默认连接超时时间小于客户端设置的保持活动时间。
标签: ssl tcp mqtt tls1.2 activemq-artemis