MQTT Artemis 代理,设备在 IPV6 上时频繁重新连接
MQTT Artemis broker, frequent reconnections when the device is on IPV6
我正在使用 ActiveMQ Artemis Broker 并通过客户端应用程序发布到它。
观察到的行为:
- 当我的客户端是 IPV4 时,将建立 TLS 握手并按预期发布数据,没有问题。
- 当我的客户端是 IPV6 时,我经常看到 re-connections 在客户端和服务器(代理)之间建立并且没有数据被发布。
详情:
- 使用 IPV6 时,客户端进行 3 次握手并尝试发送数据。它还接收服务器问候并发送应用程序数据。
- 但是连接终止并再次重新连接。这个循环一直在发生。
- 使用 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) 告诉:
在每次 re-connection(完成 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 次握手(客户端问候、更改密码规范、服务器问候)和上述再次重复。
根据数据包 5、6 和 7,我得出结论,连接正在被代理(服务器)终止。客户端确认终止,然后再次尝试重新连接,因为这是一个无限循环尝试重新连接和发布。
我是第一次看网络层面的分析,甚至是wireshark。不知道我的分析对不对。
也碰壁了,不知道为什么re-connection只在设备是IPV6的时候出现。我也没有看到任何 RST
指示连接终止。
经纪人也在发送 CONNACK
(来自经纪人日志),但仍然没有发送任何数据,只是尝试重新连接,不确定原因。
还有,我看几个我看几个:
- Out-of-Order TCP(当 src 是代理时)
- 虚假Re-transmission
- DUP ACK(src 是客户端)
不确定这是否重要。
任何headers发生了什么事?
此问题是由于 LB 设置造成的,该设置的默认连接时间为 30 秒,小于客户端设置的连接超时时间。
我正在使用 ActiveMQ Artemis Broker 并通过客户端应用程序发布到它。
观察到的行为:
- 当我的客户端是 IPV4 时,将建立 TLS 握手并按预期发布数据,没有问题。
- 当我的客户端是 IPV6 时,我经常看到 re-connections 在客户端和服务器(代理)之间建立并且没有数据被发布。
详情:
- 使用 IPV6 时,客户端进行 3 次握手并尝试发送数据。它还接收服务器问候并发送应用程序数据。
- 但是连接终止并再次重新连接。这个循环一直在发生。
- 使用 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) 告诉:
在每次 re-connection(完成 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 次握手(客户端问候、更改密码规范、服务器问候)和上述再次重复。
根据数据包 5、6 和 7,我得出结论,连接正在被代理(服务器)终止。客户端确认终止,然后再次尝试重新连接,因为这是一个无限循环尝试重新连接和发布。
我是第一次看网络层面的分析,甚至是wireshark。不知道我的分析对不对。
也碰壁了,不知道为什么re-connection只在设备是IPV6的时候出现。我也没有看到任何 RST
指示连接终止。
经纪人也在发送 CONNACK
(来自经纪人日志),但仍然没有发送任何数据,只是尝试重新连接,不确定原因。
还有,我看几个我看几个:
- Out-of-Order TCP(当 src 是代理时)
- 虚假Re-transmission
- DUP ACK(src 是客户端)
不确定这是否重要。
任何headers发生了什么事?
此问题是由于 LB 设置造成的,该设置的默认连接时间为 30 秒,小于客户端设置的连接超时时间。