ブロックを積みながら(66) Node-RED、TCP requestノード

Joseph Halfmoon

前回はUDPパケットを対向機にECHOしてもらってUDP in/out の動作を見てみました。今回はTCP requestノードを使って 送信したTCPパケットを前回同様にECHOしてもらって動作確認したいと思います。TCPはハンドシェークが必要なので実際に流れるパケットの様子は複雑ですが、表向きは超簡単!ホントか?

※「ブロックを積みながら」投稿順 index はこちら

冒頭のアイキャッチ画像にかかげましたるとおり、Node-REDのパレットを見るとTCP関係として3種のノードが存在します。その中で今回は画像の一番下にある tcp requestノードを練習してみたいと思います。

今回の実験フローと tcp requestノード

今回の実験用フローは以下からなります。

    1. 文字列を送出するInjectノード
    2. 文字列を受け取って、所定のIPアドレスの所定のポートにTCPパケットを送信し、返信を受け取る tcp request ノード
    3. 上記ノードが受け取った返信をデバッグウインドウに出力するDebugノード

こんな感じ。

flow

Injectノードと、Debugノードの設定は省略です。tcp requestノードの設定は以下です。

TCPrequestSegging

サーバ欄のIPとポートに対向機が存在します。戻りパケットは1000ミリ秒(1秒)以下に受け取るつもりで待つ設定。

対向機の設定

対向機は別シリーズで使っているうさちゃん(Rabbit4000)です。TCPのポート23番(telnet)に対してECHOするソフトウエアを既に動作確認済です。今回はそのソフトのポート番号をプライベートポート49153番に書き換えて使用しています。変更理由は、1023番以下のウエルノウンポートを利用しようとするとNode-REDの実行に特権つけないとならないので、それを避けるためです。

うさちゃん、Rabbit 4000側ではTCPパケットにペイロードが搭載されているとそれを標準出力に表示するようになっています。以下のRabbit4000の標準出力ウインドウのキャプチャの下から2行目の行頭にABCとあるのは、今回Node-REDから送信した文字列です。

RabbitSide

実行結果

Injectノードのボタンを押すと上記のようにうさちゃん側に文字列ABCを搭載したパケットが伝わっていることが分かります。そしてうさちゃんはオウム返しに同じペイロードのTCPパケットを送り返してきます。その受信結果はDebugウインドウに表示されます。こんな感じ。

Debug

16進0x41は文字 A です。以下、B,Cと。うさちゃんの返信が届いているようです。

しかしNode-REDでは、裏で起こっている筈のハンドシェークの様子などは見えません。TCP requestの内部で呼び出されたプロトコルスタックが良きように処理してくれているようです。いつものように wiresharkでその様子を眺めてみます。

wireshark000

最初の3パケットが、送信を開始するための3Wayハンドシェークです。Node-RED機からうさちゃんにSYN、うさちゃんからNode-RED機にSYN+ACK、そしてNode-RED機からうさちゃんにACKという具合です。

次のパケットがNode-RED機からのペイロード ABC が載ったパケットです。詳細ダンプが以下に。

SEND

その次がうさちゃんからNode-RED機へのECHOパケットです。送受のIPアドレス、ポート番号を逆転して同じペイロード ABC を搭載しています。

ECHO

上記に対するACKをNode-RED機がうさちゃんに返した後、Node-RED機側からFIN(切断要求)のための3wayハンドシェークを始めています。目出度くクローズ、完了と。TCP requestノードは1発やりとりするとTCP接続を閉じるのね。

Node-RED上ではペイロード ABC が行って帰っただけですが、裏ではハンドシェークが行われ、合計9パケットも送受されていることが観察できました。

TCPで何かサーバにサービスお願いするときにはこの tcp request ノードでOKって感じですかね。でもまだ2種類 TCP 関係のノードがあったですな。それらはまた今度の予定。

ブロックを積みながら(65) Node-RED、UDPパケットの送受信ノード へ戻る

ブロックを積みながら(67) Node-RED、TCP in / out ノード へ進む