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

Joseph Halfmoon

前回は query送ってanswer受け取るスタイルのTCP requestノードを実験しました。今回は一方通行のTCP out ノードと、TCP in ノードを実験してみます。TCP out ノードで送信したパケットをそのままTCP in ノードで受け取れば実験できると。local host内で完結。お手軽。

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

前回のTCP requestノードは、パケット送信してその返信を待ち受けるノードであるので、対向機のうさちゃん(Rabbit4000)に書き込んであるTCPパケット「オウム返し」ソフトはちょうど良い塩梅でした。しかし今回のTCP inとTCP outノードはデータについては一方通行(といってちゃんとTCPの3wayハンドシェークは起こるので、TCPパケットは行き来します)です。うさちゃん側のソフトを変更せねばならんな、メンドイです。しかし思いつきました。TCP outノードからlocalhost 上のTCP inノードにデータを送ればNode-REDの中だけで完結するじゃん、と。表に出てこないので、ネットワークの実習としてはイマイチですが、まあノードは動かせるかと。外部対向機をプログラムする手間をケチったな。自分。

フローとノードの設定

そこでフローは、Injectノードで文字列を生成し、それをTCP out ノードで送信する側の上側のフローと、TCP in ノードで受信し、それをDebugノードで表示する下側のフローの2つになりました。こんな感じ。

flow2

 

まず、TCP out ノードの設定が以下に。localhost(IPアドレス127.0.0.1) のポート49155(プライベートポート)に「接続」するという指定です。この「接続」というのが結構クセ者でした。最初、上流からパケット送信指令が流れてきたら、そのときに接続先と3wayハンドシェークを行って接続確立するのかと思っていたら違いました。Node-RED上でフローが動き始めた時点で3wayハンドシェークを行い接続確立してしまいます。

TCPout10

対する TCP in ノードの設定は以下のようです。一応出力はストリームとしてあるので、後続ノードで操作することも可能じゃないかと思いますが、今回は単に垂れ流しているだけです。

TCPin10

動作確認

Injectノードのボタンを押すとペイロードに文字列 Hello が載せられてTCP outから送信されます。そのときのポート番号は適当な番号が選択され今回は 46396番でした。そしてパケットはそのままTCP inで受信され、Debugノードでダンプされます。その様子が以下に。

TCPinDebug

上のフローから下のフローにHelloが伝わっております。ま、Node-REDの走っているRaspberry Pi 3機から一歩も外に出ておりゃせんのですが。

対向機うさちゃんとのやり取り

実は上記の自己完結の「手抜き」実験の前に、うさちゃんのTCP ECHOとの間でTCP outノードを動かしてみてました。そこでwireshark使ってパケットの送受の様子を観察していたのです。以下は備忘のためのwiresharkの画面のキャプチャであります。

既に接続済状態でTCP out からうさちゃんへの送信の様子TCPout01_W

メッセージ送信毎に切断(FIN)を指定したときの動作の様子TCPout02_W

コマケーところのやり取り確認用です。

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

ブロックを積みながら(68) Node-RED、HTTP in / out ノードその1 へ進む