ページ

2012年1月13日

rfcになったwebsocketのデータ転送の部分

前回の続きです。前回はハンドシェークまでだったので、今回はデータ転送の部分です。大昔のプロトコルはテキストの転送は0x00で始まって0xffで終わるって言う単純なモノだったので楽でした。その後、データの転送にABNFでframeをつかってヘッダー領域とデータ領域に分けられ、面倒になりました。と言うことで、今回はこのデータの転送のお話。

データ転送はframeでヘッダー部分とデータ部分に大別されます。
ヘッダー部分は最初の一バイト目にいろんなフラグとデータのタイプを設定します。
2バイト目がデータをマスクするのか?と言う情報とデータの長さの情報を設定します。データは最大64bitのintの長さまで設定できます。データの長さに応じて、2バイト目から最大4バイト消費されます。
その次のバイトからがデータになります。2バイト目でマスクを使用するように設定されていれば、マスクで使用する情報が4バイト分設定されて、その次のバイトからマスクされたデータがセットされます。マスクしない場合は、データ部に入るとすぐに実データがセットされます。

マスクって言うのは、データの各バイトをxorしているだけです。ハンドシェークのkeyとacceptは、途中におかしなプロキシがいた場合の単純な解決法だと好意的に解釈できんですが、このマスクはさらに意味不明です。ハンドシェークのときにマスクで使用するバイトを交換するなら分かるんですが、各データ転送フレームごとにマスクのキーを送るって意味不明です。例えるなら、共通鍵で暗号化したデータを共通鍵と一緒におくるようなもんです。解読すれば一瞬でデータが復元できます。何を守りたいのか分かりません。base64を暗号化って言っているようなモノです。

それぞれのバイトの各bitの説明をしようかと思ったけど、めんどいので今日はここまで。と言うか、最初のバイトの2バイト目から4バイト目までの意味もまだよく知らないんですが・・・

0 件のコメント: