MQTT(メッセージ交換方式・QoSレベル)【ネットワークスペシャリスト試験 平成30年度 秋期 午後2 問1-2】
情報処理技術者試験の午後問題を通じて、ネットワークの知識を体系的に蓄積していきましょう。
キーワードに加え、設計や障害対応能力をシミュレーションできる良い学びの場ですので、試験合格はもちろん、ネットワークスペシャリストとなった後も能力向上のために学習できるいい機会です。
今回は、「MQTT(メッセージ交換方式・QoSレベル)」を取り上げた「ネットワークスペシャリスト試験 平成30年度 秋期 午後2 問1-2」です。
問題文中、設問に該当する部分ですぐに解答を説明しています。
ストーリーとして何度も読みこなすと、自然に記憶に定着してくると思います。
ネットワークスペシャリスト試験 平成30年度 秋期 午後2 問1-2
問1 ネットワークシステムの設計に関する次の記述を読んで、設問1~4に答えよ。
(略)
【MQTTを使ったメッセージ交換方式】
Wさんは、MQTTを使ったメッセージ交換方式を調査した。
このメッセージ交換方式では、固定ヘッダ、可変ヘッダ及びペイロードから構成されたMQTTコントロールパケットを使う。MQTTコントロールパケットの種別を表1に示す。
MQTTを使ったメッセージ交換方式の通信シーケンス例を図2に示す。
図2中の通信シーケンスでは、配信元から複数の配信先へメッセージが配信されている。通信シーケンスの説明を次に示す。
・クライアントは、サーバのTCPポート8883番にアクセスし、TCPコネクションを確立する。このTCPコネクションは、メッセージ交換の間は常に維持される。
・クライアントはCONNECTを送信し、サーバはCONNACKを返信する。
・配信先となるクライアントは、サーバにSUBSCRIBEを送信し、購読対象のメッセージを、トピック名を使って通知する。サーバはクライアントにSUBACKを返信し、購読要求を受け付けたことを通知する。
・配信元クライアントは、PUBLISHを使ってサーバにメッセージを送信する。
・メッセージを受信したサーバは、PUBLISHにに含まれるトピック名について購読要求を受け付けている全てのクライアントに、そのメッセージを送信する。
PUBLISHを使ったメッセージ送信では、QoSレベルを使って送達確認手順を指定する。QoSレベルとメッセージ送信の通信シーケンスを図3に示す。
図3中の通信シーケンスの説明を次に示す。
・QoSレベルが0の場合、MQTT層におけるPUBLISHの送達確認は行わない。TCP層による送達確認だけが行われる。
・QoSレベルが2の場合、MQTT層においてもPUBLISHの送達確認が行われる。MQTT層の送達確認の説明を次に示す。
-TCPコネクションが切断された場合のために、PUBLISH及びPUBRELは送信者によって保存され、送信者から受信者への再送に利用される。
-③PUBLISHを受信した受信者は、メッセージの処理を始める前に送信者にPUBRECを送信し、その応答であるPUBRELを受信してからメッセージの処理を開始する。
-PUBRELを送信した送信者は、その応答であるPUBCOMPを受信してから、メッセージ送信を完了する。
【出典:ネットワークスペシャリスト試験 平成30年度 秋期 午後2 問1(一部、加工あり)】
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30_2/2018h30a_nw_pm2_qs.pdf
図3中のQoSレベルが0の場合のメッセージ送信について、TCPの再送機能だけではメッセージの消失が防げないのはどのような場合か。45字以内で具体的に答えよ。:TCPの送信処理中に、デバイスの電源断などでTCPコネクションが解放された場合
QoSレベルが0の場合のメッセージ送信について、「QoSレベルが0の場合、MQTT層におけるPUBLISHの送達確認は行わない。TCP層による送達確認だけが行われる」とあります。
また、MQTT通信におけるTCPについて、「クライアントは、サーバのTCPポート8883番にアクセスし、TCPコネクションを確立する。このTCPコネクションは、メッセージ交換の間は常に維持される」とあります。
したがって、TCPコネクションが維持される場合は、TCPの再送機能でメッセージが消失することはないと考えられます。
逆に、TCPコネクションが開放されてしまうと、再送機能も使えなくなり、メッセージが消失する場合があることになります。
それを裏付けるように、QoSレベルが2の場合には「TCPコネクションが切断された場合のために、PUBLISH及びPUBRELは送信者によって保存され、送信者から受信者への再送に利用される」とあります。
TCPコネクションが開放される場合とはどのような場合でしょうか。
これについては、問題文のもう少し先に、「交換サーバからデバイスDiへのPUBLISH送信中にデバイスDiが電源断などで非稼動になった場合、そのPUBLISHは、交換サーバの中に保存され、稼働再開後に再送される」とあります。
デバイスが電源断などで非稼動になるとTCPコネクションが開放されてしまい、再送機能が使えなくなり、メッセージが消失されてしまいます。
③について、PUBRELを受信するまで、メッセージの処理を保留する目的を、20字以内で述べよ。:メッセージの重複を防止する。
図3の通信シーケンスをよく見ると、送信者と受信者でそれぞれ送達確認ができてから処理を開始したり完了させたりしています。
また図3の注記2には、「QoSレベルが2の場合、受信者は、メッセージの処理を開始した以降に受信したPUBLISHは、パケットIDの重複にかかわらず新しいパケットとみなす」とあります。
この説明からすると、もしもPUBRELを受信する前にメッセージを処理するとした場合は、送信者から同じパケットIDのメッセージが再送されると新たに処理を開始してしまうことが分かります。
PUBLISH、PUBRELの保存や、PUBREC、PUBCOMPのやり取りは、このようなメッセージの重複(に伴う処理)を防止するためにあります。