前回は 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つになりました。こんな感じ。
まず、TCP out ノードの設定が以下に。localhost(IPアドレス127.0.0.1) のポート49155(プライベートポート)に「接続」するという指定です。この「接続」というのが結構クセ者でした。最初、上流からパケット送信指令が流れてきたら、そのときに接続先と3wayハンドシェークを行って接続確立するのかと思っていたら違いました。Node-RED上でフローが動き始めた時点で3wayハンドシェークを行い接続確立してしまいます。
対する TCP in ノードの設定は以下のようです。一応出力はストリームとしてあるので、後続ノードで操作することも可能じゃないかと思いますが、今回は単に垂れ流しているだけです。
動作確認
Injectノードのボタンを押すとペイロードに文字列 Hello が載せられてTCP outから送信されます。そのときのポート番号は適当な番号が選択され今回は 46396番でした。そしてパケットはそのままTCP inで受信され、Debugノードでダンプされます。その様子が以下に。
上のフローから下のフローにHelloが伝わっております。ま、Node-REDの走っているRaspberry Pi 3機から一歩も外に出ておりゃせんのですが。
対向機うさちゃんとのやり取り
実は上記の自己完結の「手抜き」実験の前に、うさちゃんのTCP ECHOとの間でTCP outノードを動かしてみてました。そこでwireshark使ってパケットの送受の様子を観察していたのです。以下は備忘のためのwiresharkの画面のキャプチャであります。
既に接続済状態でTCP out からうさちゃんへの送信の様子
コマケーところのやり取り確認用です。