EC2でマルチキャスト(IPフラグメント対応)

なんかこの話題が続き過ぎな気もしていますが、EC2でマルチキャストの続きです。

というのも、MTUを超えるサイズのパケットを↑の方法で擬似マルチキャストすると、1台のインスタンスにしか届かないよー、というフィードバックを頂いたのでした。

  • MTUを超えるとダメになる –> すなわちIPフラグメント周りで何か起きている
  • 擬似マルチキャストでは同じIPパケットを何度も投げている

ということから当たりをつけるとするとやはりIPパケットのID周りかなと思って、パケットIDを変えながら送り出すというようなことをやってみました。

(IPパケットにはそれぞれIDがついていて、分割されたときには各フラグメントのIDを見ながら再結合するようになっています。)

このコードで試すと、MTU越えなパケットで、フラグメントされたとしても期待通り複数ホストで受信できる事が分かりました。

 

変更分は単純で、パケットIDを複製する度に1つずつずらしているのと、それに伴ってチェックサムを再計算しているくらいです。

ずらし方は一定なので、パケットが分割されてもフラグメント同士は同一のIDを持ち続けるので関係性は保たれつつ、複製ごとに異なるIDを持つというわけです。

(こんなずらし方で直近のパケットとあたる可能性が十分低いのかは要チェック)

 

IPレイヤではパケットのIDを見比べてフラグメントされたパケットを再結合するので、複数同じIDのフラグメントが通過すると、どうやら下のネットワークレイヤでこの再結合がうまくいかなくなるようです。

これがフラグメントなしだと通るけど、フラグメントされると通らない原因と言えそうです。

試しながら気づいたこととしては、送信側と受信側でフラグメントの切れ目が違うので、恐らく下のネットワークで再結合と再分割を行なっているようです。

IPヘッダをいじるとチェックサムを再計算しないといけないのがいやですね。

出来ればL2だけで済ませたかった。。。

 

そして実はユーザランドのプログラムに頼らずにカーネルだけで処理を完結する方法を編み出していたのですが、この問題に対応する為にもうちょっといくつか試さないといけなそうです。

その方法についてはまた近いうちに。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中