用户注册过程
对用户而言,注册到P2P-SIP网络的过程和注册到SIP网络的过程是相同的。只是在P2P-SIP网络中,PN收到注册请求时,并不立即记录该条注册信息,而是先调用函数find_responsible_pn(user)。如果返回的地址是PN自己,这才记录下用户注册信息;如果返回的地址是其他PN,则PN会把注册请求转发给相应的PN。最终,注册请求会被转发到负责处理它的PN处,处理后产生的应答按原路返回。
考虑到减轻PN转发请求和记录事务状态的负担,PN收到不该自己负责的注册请求时,可以返回301 Moved Permanently应答。而把调用find_responsible_pn(user)得到的地址放在应答的Contact头域中,具体的注册过程如图3所示。

第1步:终端发注册请求
IP地址为192.168.13.63的SIP终端准备好REGISTER请求,发给P2P-SIP网络中任一PN(比如Key为69的PN。在P2P-SIP中,Key值是通过哈希节点的IP地址和端口得到的)。如图3中M1所示。
SIP终端可以通过多种方式获得PN的IP地址和端口。比如用户手动指定,或者使用终端默认的PN,或者使用终端上次进入P2P-SIP网络时更新的PN列表。
第2步:PN转发请求
Key值为69的PN收到REGISTER请求后,取得请求中To头域里的SIP URI——表示注册的信息属于哪个用户,调用find_responsible_pn(user)。返回值应该是“IP地址∶端口”字符串的形式。将返回值同本机“IP地址∶端口”作比较,如果相同,说明本机负责处理该请求,之后的处理流程遵循SIP标准;如果不同,就转发REGISTER请求到该“IP地址∶端口”。
在本例中,SIP URI是,假定其哈希值是17,PN的Chord层会查找到负责处理该请求的PN Key值是32,find_responsible_pn(user)返回该PN的“IP地址∶端口”——192.168.13.110:5060。PN的SIP层比较该值发现不是自己,就将注册请求转发到该“IP地址∶端口”,如图3中M2所示。
第3步:PN接受注册,返回应答
Key值为32的PN收到REGISTER请求后,取得请求中To头域里的SIP URI,调用find_responsible_pn(user)。返回值是192.168.13.110:5060,比较后发现是自己,说明自己负责管理该用户,负责处理该用户的注册请求。之后的处理流程遵循SIP标准。假定注册成功,PN返回200 OK应答。如图3中M3所示。应答的返回遵循SIP标准,根据Via头域按原路返回,不需要查找路径,不会使用Chord层的操作。
第4步:SIP终端收到应答,完成注册
Key值为69的PN收到来自192.168.13.110的应答,按照SIP标准处理,把应答发给192.168.13.63:5060。如图3中M4所示。SIP终端收到200 OK应答,完成注册。
