2012年3月31日土曜日

websocketについて再度やってみる。

websocket・・・html5の目玉の1つですね。

前々から興味もっててhttps://github.com/taktod/webSocketForRed5こんなのつくったりしていたわけですが、最近jqmobiを使うようになってまた、興味がわいてきました。

で、ここ数日websocketの動作について調査しつついろいろやっていたわけです。
上記のred5用のプラグインをきちんと整備して、とりあえずrtmpとwebsocketで情報を共有するチャットをとりあえずの目標にするわけですが、今日はhandshakeについてのメモ書き書いておきます。

websocketの動作は次のようなものになっています。
1:クライアントからhandshakeの要求が送られる
2:サーバーから応答のデータを送り返す。
ここでhandshake完了つながったままになる。
3:メッセージを送りたいときにおくる。データは0x00 (データ(UTF8)) 0xFFという形で送る。(この部分はRFC6455で大きくかわってしまったようです。)

だったとおもいます。
 websocketにはいくつかバージョンがあり、ブラウザの対応もまちまちです。
そしてサーバーの対応もまちまちです。
でも、主なものは2つです。
hybi-00とRFC6455の2つ

hybi-00は昔つくったプログラムでサポートした古いバージョン。セキュリティーがどうのこうのという理由でFirefoxが見切りをつけたバージョンです。
対応ブラウザで確認したものは手持ちのiphone4SのモバイルサファリとiMacにはいっているsafariはこちらの動作をしていました。

RFC6455は現行のFirefox 11、google chromeがサポートしているあたらしいバージョン。

とりあえずこの2つサポートしておけば、たいていのブラウザで動作可能になると思われます。
今のところ理解したのは、handshakeの仕方が違う。その他は多分同じということなので、そこを書きなぐっておきます。

hybi-00のhandshake(ネタ元はこちら)
クライアントからのデータ送信

GET /demo HTTP/1.1
        Host: example.com
        Connection: Upgrade
        Sec-WebSocket-Key2: 12998 5 Y3 1  .P00
        Sec-WebSocket-Protocol: sample
        Upgrade: WebSocket
        Sec-WebSocket-Key1: 4 @1  46546xW%0l 1 5
        Origin: http://example.com

        ^n:ds[4U

サーバーからの応答

HTTP/1.1 101 WebSocket Protocol Handshake
        Upgrade: WebSocket
        Connection: Upgrade
        Sec-WebSocket-Origin: http://example.com
        Sec-WebSocket-Location: ws://example.com/demo
        Sec-WebSocket-Protocol: sample

        8jKS'y:G*Co,Wxa-

赤文字にした部分を操作して青文字にしたデータを作成します。
やり方は次のとおり。
Key1とKey2を数値データに戻します。
例としてKey2をあげると
> 12998 5 Y3 1  .P00
数字の部分を取り出して空白の数を数えます。
> 1299853100 と 5
数字の部分/空白の数の値をだします。
> 259970620
hexに直す
> 0x0F7ED63C
同じことをkey1にもやります。
> 0x316E4113
16のHexを作成します。key1 key2 と最後の赤文字のやつとなります。
> 0x31 0x6E 0x41 0x13 0x0F 0x7E 0xD6 0x3C '^' 'n' ':' 'd' 's' '[' '4' 'U'
これをMD5にかけると・・・
> 8jKS'y:G*Co,Wxa-
になるというわけです。

つづいてRFC6455の方。(ネタもとはこちら)
クライアントからの要求はこんな感じ

GET /chat HTTP/1.1
        Host: server.example.com
        Upgrade: websocket
        Connection: Upgrade
        Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
        Origin: http://example.com
        Sec-WebSocket-Protocol: chat, superchat
        Sec-WebSocket-Version: 13

サーバーの応答はこんな感じ

HTTP/1.1 101 Switching Protocols
        Upgrade: websocket
        Connection: Upgrade
        Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
        Sec-WebSocket-Protocol: chat

なぜかクライアントによってはProtocolの部分が抜け落ちていたりしていました。まぁ気にしないけど。
では計算のやり方。
必要なのは赤字のKeyの部分と、定義されているGUID(258EAFA5-E914-47DA-95CA-C5AB0DC85B11)の2つです。
いきなりGUIDがでてきて、これなに?と思うとおもいますが、この値のGUIDでないとだめみたいです。
キー
> gDhllHNhbXBsZSBub25jZQ==
ここにGUIDを連結します。

> gDhllHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
これをSHA1で変換かけてやると
> s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
になります。
あとは、サーバー応答のフォーマットにあわせてデータを送り返してやればOKとなります。

Handshake以外の部分の動作についてはまたあとで調査しますので、また記事みてね。
ではでは

0 件のコメント:

コメントを投稿