People Near Me 解析 Part1

TechCollab2007-09-10


最近、People Near Meの内部構造について調査する機会があったのでここに軽くまとめておく。こんなマイナーなことに興味のある人間も少ないと思うので自分への備忘録として。People Near Meのアーキテクチャについて公開されている情報は少なく、WS-Discoveryに上に実装されているという情報程度。今回はより詳細な情報を得るためにPeople Near Me(PNM)の流すパケットについて観察し解析してみた。

とりあえず、PNMのSignIn/SignOutによるパケットフローがどうなっているのかを観察。公開情報の通り、サービスへの参加/脱退などの管理はWS-Discoveryが使用されているみたい。参加、脱退に応じてHelo/Byte/Prove/ProbeMatchメッセージが流れていたことを確認。ちなみにWS-DiscoveryのメッセージングはSOAP over UDPDestination=ff02::c、Port=3702が基本。詳しくはSpecification参照。

WS-Discoveryパケット解析

Hello Message
  • Packet Summary

Source Destination Protocol Info
fe80::100d:43ef:d5fc:452f ff02::c UDP Source port: 49375 Destination port: 3702

  • Message Data

の意味するところは不明。

<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope 
      xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
      xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" 
      xmlns:wsd="http://schemas.xmlsoap.org/ws/2005/04/discovery" 
      xmlns:NearMe="http://schemas.microsoft.com/p2p/2005/08/NearMe">
    <soap:Header>
        <wsa:To>urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To> 
        <wsa:Action>http://schemas.xmlsoap.org/ws/2005/04/discovery/Hello</wsa:Action>
        <wsa:MessageID>urn:uuid:a148bddf-d5ac-4c15-a959-8f08f424579f</wsa:MessageID>
        <wsd:AppSequence InstanceId="5" MessageNumber="8"></wsd:AppSequence>
    </soap:Header>
    <soap:Body>
        <wsd:Hello>
            <wsa:EndpointReference>
                <wsa:Address>uuid:a0707166-1d8e-430a-899e-019b291bcad0</wsa:Address> 
            </wsa:EndpointReference>
            <wsd:Types>NearMe:a4c1fbe4-6d30-46c9-8bba-b8663d615706</wsd:Types>
            <wsd:MetadataVersion>1</wsd:MetadataVersion>
            <NearMe:NearMeData>wAkAAAcAAAAUAAAACgAAABsAAABWaXN0YQAAVklTVEEtUEMAAA==</NearMe:NearMeData>
        </wsd:Hello>
    </soap:Body>
</soap:Envelope>
Bye Message
  • Packet Summary

Source Destination Protocol Info
fe80::100d:43ef:d5fc:452f ff02::c UDP Source port: 49375 Destination port: 3702

  • Message Data
<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope 
      xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
      xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" 
      xmlns:wsd="http://schemas.xmlsoap.org/ws/2005/04/discovery">
    <soap:Header>
        <wsa:To>urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To>
        <wsa:Action>http://schemas.xmlsoap.org/ws/2005/04/discovery/Bye</wsa:Action>
        <wsa:MessageID>urn:uuid:047bc593-719a-4d19-ac2f-b1c47a4807c1</wsa:MessageID>
        <wsd:AppSequence InstanceId="405" SequenceId="urn:uuid:388e6fd3-9bab-4ad9-b3b2-4b13f814ab88" MessageNumber="8"></wsd:AppSequence>
    </soap:Header>
    <soap:Body>
        <wsd:Bye>
            <wsa:EndpointReference>
                <wsa:Address>urn:uuid:9e31c20e-8d9c-4b30-a030-0b94823a087a</wsa:Address>
            </wsa:EndpointReference>
        </wsd:Bye>
    </soap:Body>
</soap:Envelope>
Probe Message
  • Packet Summary

Source Destination Protocol Info
fe80::100d:43ef:d5fc:452f ff02::c UDP Source port: 49375 Destination port: 3702

  • Message Data
<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope 
      xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
      xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" 
      xmlns:wsd="http://schemas.xmlsoap.org/ws/2005/04/discovery" 
      xmlns:NearMe="http://schemas.microsoft.com/p2p/2005/08/NearMe">
    <soap:Header>
        <wsa:To>urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To>
        <wsa:Action>http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action>
        <wsa:MessageID>urn:uuid:606b61ea-d552-4876-97ee-08058c90e3e0</wsa:MessageID>
    </soap:Header>
    <soap:Body>
        <wsd:Probe>
            <wsd:Types>NearMe:a4c1fbe4-6d30-46c9-8bba-b8663d615706</wsd:Types>
        </wsd:Probe>
    </soap:Body>
</soap:Envelope>
ProbeMatch Message
  • Packet Summary

Source Destination Protocol Info
fe80::9d0d:76ac:ebc:60c fe80::100d:43ef:d5fc:452f UDP Source port: 3702 Destination port: 49374

  • Message Data

HELOと同じくNearMe:NearMeDataは不明。

<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope 
      xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
      xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" 
      xmlns:wsd="http://schemas.xmlsoap.org/ws/2005/04/discovery" 
      xmlns:NearMe="http://schemas.microsoft.com/p2p/2005/08/NearMe">
    <soap:Header>
        <wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
        <wsa:Action>http://schemas.xmlsoap.org/ws/2005/04/discovery/ProbeMatches</wsa:Action>
        <wsa:MessageID>urn:uuid:5cc237c2-0b5f-44b0-9f6e-3f863018217a</wsa:MessageID>
        <wsa:RelatesTo>urn:uuid:eb50636a-2548-4fca-83cc-f8b03183df24</wsa:RelatesTo>
        <wsd:AppSequence InstanceId="1" MessageNumber="21"></wsd:AppSequence>
    </soap:Header>
    <soap:Body>
        <wsd:ProbeMatches>
            <wsd:ProbeMatch>
                <wsa:EndpointReference>
                    <wsa:Address>uuid:0192e97a-fdc1-4883-b33d-5fa2650784fa</wsa:Address>
                </wsa:EndpointReference>
                <wsd:Types>NearMe:a4c1fbe4-6d30-46c9-8bba-b8663d615706</wsd:Types>
                <wsd:MetadataVersion>1</wsd:MetadataVersion>
                <NearMe:NearMeData>wA4AAAsAAAAUAAAADAAAAB8AAABTb3VzdWtlYmUAAFNPVVNVS0UtUEMAAA==</NearMe:NearMeData>
            </wsd:ProbeMatch>
        </wsd:ProbeMatches>
    </soap:Body>
</soap:Envelope>

PNMパケット解析

で、WS-DiscoveryによりPNMネットワークへの参加、脱退などの仕組みは実現できることが納得できたけど、PNM APIのオブジェクト公開とか、アプリケーション招待などの仕組みがまだわからないということでもう少し調査。予想としてはWS-Discoveryパケット内に組み込んでいるのだとも思ったがそうではないらしい。オブジェクトデータ、アプリケーションデータのやりとりはTCP接続でPeer対Peerでの送受信が行われる模様(下図赤線部分)。で、ここで重要なのは受け取る側は誰で、送る側は誰なのか?ということ。どうも、分散ハッシュ的な考えが使われている模様。つまり、あるオブジェクトデータを保持・管理しているのはオブジェクトデータを公開したPeerとは限らない誰かということ。オブジェクト要求するPeerは分散ハッシュのようなイメージで、オブジェクトを保持しているPeerへのインデックス情報を取得。そしてその後オブジェクトデータを管理している誰かとコネクションをはってデータを取得するようだ。ちなみにこれらの情報はp2phost.exeの上でオンメモリで管理されている模様(?)ここら辺は明日にでも図の説明を追加するつもり。

いやー。People Near Meは意外と奥が深いですね。もっと技術情報を公開してくれれば良いのですが。。。こんな逆アセンブリ&パケット解析などは邪道すぎる;