投稿日

SORACOM Funnel: TCPでのデータ送信時に複数のパケットを1つのメッセージに結合できるようになりました!

こんにちは。ソリューションアーキテクトの今井です。

SORACOM Funnel の送信データ形式のひとつとして「SORACOM Binary Format v1」がリリースされましたので、今日はこれをご紹介いたします!

これは何?

SORACOM Binary Format v1 とは、SORACOM Funnel の「送信データ形式」のひとつとして選択可能なデータフォーマットのひとつで、これに準ずる形で送信された複数の TCP パケット(厳密には TCP セグメント)を、SORACOM Funnel がひとつの大きなメッセージに結合をした上でクラウドに送信してくれます。

登場の背景

これまで SORACOM Funnel はデバイスから送信されてくる 1 つの TCP セグメントを 1 つのメッセージとして解釈してクラウドに送信していました。

TCP ヘッダの仕様上、理論的には 64KB までのデータ長を表現することは可能ですが、ネットワークの MTU などに制約をうけ、現実的な 1TCP セグメントの最大長は 1500 バイト弱となります。

これらのことから、SORACOM Funnel + TCP データ送信という組み合わせにおいては、1 メッセージあたり 1500 バイト弱という制約を受けていました。これ以上の大きなメッセージを送信したい場合は、クラウド側でメッセージの結合を行って頂く必要がありました。

どうのように動くの?

SORACOM Binary Format v1のメッセージフォーマットは以下のとおりです。

  • メッセージ長フィールド(2Byte)
  • メッセージボディ(メッセージ長フィールドに定義されたByte数)
  • チェックサム(2Byte, CRC-16 CCITT)
    • チェックサムの対象はメッセージ長フィールド、メッセージボディの双方を結合したものとする

SORACOM Funnel は TCP セグメントのペイロードの最初の 2 バイトをメッセージ長フィールドとして解釈し、それに続くメッセージボディを待ち受けます。そして最後に2バイトのチェックサムを受け取り、メッセージの完全性の検証を行い、成功すればクラウドへ転送(の上、成功を表すメッセージをクライアントへ送信)、失敗した場合にはクライアントにエラーを表すメッセージを返します。

正常系の動作シークエンスは以下のようになります。

正常系の動作シークエンス

メッセージ長フィールドが 2 バイトなので最大で 64K バイトまでのメッセージボディを取り扱うことができます。SORACOM Funnel は、最初の TCP セグメントを受け取った時点でタイマーを起動し、次の TCP セグメントを待ち受けます。タイマーは約 10 秒に設定されており、この時間内に期待される次のパケットが届かない場合、クライアントにタイムアウトを表すメッセージを返し、それまでバッファしていたメッセージの断片を破棄します。なお、このタイマーは各 TCP セグメントの到着ごとにリセットされます。

どうやって使うの?

下記のように SORACOM Funnel の送信データ形式を「SORACOM Binary Format v1」に設定していただくだけでご利用可能です。なお、TCP でのデータ送信時にのみ機能しますのでご注意ください。

コンソール

こんなところで活躍します

昨今、リッチなデバイスが増えてきて HTTP 上でテキストデータである JSON をやり取りすることが簡単になってきています。HTTP は大きなデータを取り扱うことが簡単にできますし、JSON を利用すれば構造化されたデータも取り扱えます。

しかし、キャパシティの小さなデバイスにとってこういった処理は大きな負荷となります。このようなデバイスにおいては TCP 上でバイナリデータを直接取り扱うことが好まれてきました。また、取り扱われるデータも、独自に構造化されたバイナリデータが扱われることも非常に多くありました。

今回の新機能を使うことにより、これまで利用してきた TCP + 独自のバイナリ(1パケットに収まらない可能性がある大きさのメッセージ)を SORACOM Funnel を使って簡単にクラウドに送信することができるようになります。

今日からご利用いただけます!

SORACOM Binary Format v1 は今日からご利用いただけます。TCP を使って SORACOM Funnel 経由でクラウドサービスに大きなメッセージを送信したいと思っていらっしゃった方はぜひお試しを!