73 lines
2.1 KiB
Plaintext
73 lines
2.1 KiB
Plaintext
= QoS 1 Nachlieferung
|
|
|
|
Subscribe mit expliziter Client ID und "clean session" auf "false".
|
|
|
|
$ docker run --rm -it --net host eclipse-mosquitto \
|
|
mosquitto_sub --debug --topic demo/qos1 --qos 1 --disable-clean-session --id demo
|
|
|
|
|
|
In separatem Terminal wird nun das Netzwerk so konfiguriert, dass es
|
|
hohe Latenzen (3 Sekunden) gibt, dies macht es leichter, zum richtigen Zeitpunkt
|
|
die Verbindung zu unterbrechen:
|
|
|
|
|
|
(falls Docker genutzt wird)
|
|
$ docker run --rm -it --net host --cap-add NET_ADMIN alpine:3
|
|
# apk -U add iptables iproute2 iproute2-ss
|
|
|
|
(ohne Docker, Debian/Ubuntu)
|
|
$ sudo apt install -y iptables iproute2
|
|
$ sudo bash
|
|
|
|
|
|
# iptables -t mangle -A POSTROUTING -o lo -p tcp --sport 1883 -j MARK --set-mark 1
|
|
# iptables -t mangle -A PREROUTING -i lo -p tcp --dport 1883 -j MARK --set-mark 1
|
|
|
|
# tc qdisc add dev lo root handle 1: prio
|
|
# tc filter add dev lo parent 1:0 protocol ip handle 1 fw flowid 1:1
|
|
# tc qdisc add dev lo parent 1:1 handle 10: netem delay 3s
|
|
|
|
|
|
|
|
Ermittlung des Ports des Subscribers:
|
|
|
|
# ss -t sport = :1883
|
|
|
|
|
|
|
|
Im ersten Terminal werden nun mehrere Nachrichten versandt:
|
|
|
|
$ docker run --rm -it --net host eclipse-mosquitto \
|
|
mosquitto_pub -t demo/qos1 -q 1 -m "This is delivered. #1"
|
|
|
|
$ docker run --rm -it --net host eclipse-mosquitto \
|
|
mosquitto_pub -t demo/qos1 -q 1 -m " #### This could be delivered later. #2"
|
|
|
|
Nach ca. 3 Sekunden werden die TCP Verbindungen des Subscribers im zweiten Terminal unterbrochen)
|
|
# ss -t -K sport = :60804
|
|
|
|
Optional: Im ersten Terminal wird mittels mehrfachem CTRL-C der Subscriber beendet.
|
|
Anschließend erfolgt neuer Start.
|
|
|
|
$ docker run --rm -it --net host eclipse-mosquitto \
|
|
mosquitto_sub --debug -t demo/qos1 --qos 1 --disable-clean-session --id demo
|
|
|
|
|
|
Testen Sie auch, was passiert, wenn beim Neustart ein völlig anderes Topic angegeben wird -
|
|
wird die nicht erhaltene Nachricht trotzdem ausgeliefert?
|
|
|
|
$ docker run --rm -it --net host eclipse-mosquitto \
|
|
mosquitto_sub --debug -t demo/othertopic --qos 1 --disable-clean-session --id demo
|
|
|
|
|
|
|
|
Anschließendes Aufräumen:
|
|
|
|
# iptables -t mangle -F
|
|
# tc qdisc del dev lo root
|
|
|
|
|
|
|
|
= Quellen
|
|
|
|
Wireshark: https://www.wireshark.org/ |