SIP vs XMPP

SIP vs XMPP (Jabber)

SIP and XMPP are application layer protocols mostly used to send voice or IM over Internet. SIP is defined by RFC 3621 and XMPP is defined in RFC 3920. Basically XMPP is evolved from IM and Presence, whereas SIP evolved from Voice and Video over IP. XMPP added an extension called Jingle for session negotiation and SIP added an extension called SIMPLE to support IM and Presence.

SIP和XMPP都是应用层的协议,主要用来在互联网上发送语音和即时通信IM。RFC 3521定义了SIP,RFC3920定义了XMPP。XMPP来自即时通信系统,而SIP类似语音和视频通信。XMPP增加了Jingle扩展协议来支持面向连接的业务,如语音和视频;而SIP增加了SIMPLE协议来支持即时通信业务。

SIP (Session Initiation Protocol)

Session Initiation Protocol (SIP) is an application layer protocol used to establish, modify and terminate multimedia sessions such as VoIP Calls. SIP also can invite new sessions to existing sessions such as multicast conferences. Basically it’s referred as signalling protocol in VoIP environment that can handle call establishment, call control and call termination and generating CDR (Call Detail Record) for billing purposes.

SIP是应用层的协议,用来建立、改变和终结多媒体连接,如语音呼叫。SIP也可以在已经存在的呼叫上增加新的呼叫,实现多方会议。本质上来讲,SIP被称之为VoIP的信令协议,他可以处理呼叫的建立,呼叫的控制和呼叫的终结,并且产生CDR用来计费.

XMPP (Extensible Messaging Presence Protocol)

XMPP is an open Extensible Markup Language (XML) protocol for real time messaging, presence and request response services. Originally it was developed by Jabber open source community in 1999. In 2002 the XMPP working group developed adaptation of Jabber Protocol that is suitable for IM (Instant Messaging).

XMPP是开放的XML协议,用来实现实时消息传递、呈现和请求/响应业务。起初,他由Jabber开源社区开发。2002年,XMPP工作组将Jabber开发成支持即时通信的协议。

Difference Between SIP and XMPP

We just can’t compare SIP and XMPP because both serve different purposes like session establishment and structured data exchange respectively. But introduction SIMPLE and Jingle introduces some similar functionalities.

  我们不能简单对SIP和XMPP进行对比,因为两者服务与完全不同的目标,一个服务于连接的建立,一个服务于结构化的数据交换。但是SIP增加SIMPLE和XMPP增加Jingle后,两者开始变得类似了。

(1) SIP provides session establishment, modify and termination but XMPP provides streaming pipe for structured data exchange between group of clients.

SIP提供连接的建立、改变和终结,而XMPP在客户组内部提供流管道,交换结构化的数据。这就是说:SIP的重点是终端之间连接的建立和维护,连接以后的数据和信息传送他不关注;而XMPP重点是考虑终端组内部的数据交换,连接建立是基本的功能,而不是重点。所以,XMPP对应用的支持和扩展性的考虑很充分,比SIP天生要好。

(2) SIP is text based request response protocol and XMPP is XML based client server architecture.

SIP的信令和消息传送是基于文本的,是平面化(Flat)的数据表达,解析起来缺少规律性,在新增数据消息体的时候缺少继承性,需要开发新的代码来封装和解析,原有代码的继承性比较差。而XMPP采用开放的标准的XML表达,是一种结构化的消息结构,能够方面表达层次化的消息内容,表达内容的内在逻辑。这种XML的结构对应用的扩展和内容的解析带来极大的方便,大量软件代码可以重复利用。

(3) SIP signalling messages go via SIP headers and body whereas in XMPP messages passes via streaming pipe. XMPP sends request, response, indication or error using XML via the streaming pipe.

SIP信令由SIP报文格式的头部和内容两部分组成,也就是说,SIP报文格式的头部已经包含了部分内容,类似于HTTP,与具体的上层应用直接关联,而不是通用的报文格式;而XMPP所有信息都是采用XML在流管道之间透明传送。

SIP的连接建立通道与数据传送通道是各自独立的,连接建立在SIP client与Server之间,而数据传送通道是在Client–Client之间直接进行的。这个对视频、语音和文件传送业务很合适,但是不适合其他形式的应用。

XMPP的控制和数据通道是一体的,Clent只与Server建立连接,而Client与client之间是没有之间连接的。Client之间传送的通道是:Client1—〉Server1—〉server2—〉client2。这种方式看起来扩展性差,server压力很大,但是能够实现很好的业务功能,比如留言、广播、群聊、状态更新、Blog、微博、数据共享等等。

这种Client-server模型,很多业务的控制在Server上完成,新功能的增加在server上实现,在server上定义新的XML对象和逻辑,客户端只要负责XML数据流的解析和呈现就可以了。所以,终端实现简单。

(4) SIP runs over UDP, TCP and TLS whereas XMPP uses TCP and TLS only.

(5) In SIP, user agent could be server or client hence user agent can send or receive messages whereas in XMPP client only initiates requests to server so it will work with NAT and Firewall.

SIP是双向对称,客户端和服务器都可以主动发起连接请求并响应,这种对称连接的方式在穿越NAT和firewall的时候,带来很大的复杂性,无法保证穿越NAT。而XMPP是单向的连接,只有Client可以向Server发起连接请求,server不会向Client发起连接。这样便于NAT和firewall的穿越。

(6) Both SIP and XMPP are easy to implement.

Technically comparing SIP and XMPP is like comparing apples and oranges because the core protocols serve different purposes: session rendezvous/establishment vs structured data exchange

技术上比较SIP和XMPP,就像苹果与橙子相比,因为核心协议服务的目的不一样:连接汇聚/建立功能和结构化的数据交换功能。各自在其固有的领域有各自的优势,但是两者体系架构的差异,在未来的竞争中,个人觉得XMPP/Jingle架构更加有竞争力。因为XMPP的开放性,开发了大量的开源代码和开源应用,大量是非连接的业务,如即时通信、blog、微博、社交网络、远程控制、设备管理、三屏切换等等应用,已经有了基于XMPP开源代码和应用提供。Google在XMPP增加了Kingle,也很好地实现了基本的语音和视频通讯业务。

  基于XMPP的即时通信系统主要是Google Talk,还有基于Jabber的很多组织,最近Skype宣布支持急于XMPP协议,实现与XMPP IM的互通,微软也宣布MSN开始正式正式支持XMPP,facebook也宣布正式支持XMPP.所以,XMPP成为IM的互通比较已经初步确定,并且有一统天下的趋势.

社交网络好友关系数据库设计

好友关系设计在社交网络扮演重要的角色,以此来连接所有人。本片文章将介绍好友关系的数据库设计。这将对你设计的关系网络提供一个新的启发

https://app.box.com/s/oot5n9suwo3nw6oeyr8z

上述连接提供好友基本关系,同时具有类似facebook好友功能

数据库关系图

下面是好友关系数据设计的关系图

Note: One thing you can do to speed up the retrieval and insert operations is to keep the foreign key only in design and not to implement it in the Database. You must check the constraints programmatically rather than using database constraints.

Database Schema
数据库关系图

用户表

这张标包含4个字段 user_id 作为自增主键

关系表

前两个字段是需要关联的两个用户id, status 标示这两个用户的关系状态

Status 字段状态

Code Meaning
0 Pending 待定
1 Accepted同意
2 Declined 拒绝
3 Blocked   阻止

 

用整形代替字符串表示状态, 可以提高数据库性能

Action User

action_user_id 代表最近更新了status字段的用户id

举例,

如果用户1 像用户2发送了一个请求, 那么action_user_id就是1, 所以 发送好友请求的就是用户1.

如果用户2阻止了用户3, 那么用户2就应该是action_user_id. 用户2组织了用户3

唯一索引

为了不重复添加好友关系记录,我们给user_one_id和anduser_two_id增加一个UNIQUE索引, 这样避免重复的插入数据

它是如何工作的?

重要的是要记住,当你使用这个模型时候一定要确定 不管什么样的操作user_one_id总是要比user_two_id少. 下图是录入的好友关系数据截图.

下面是好友关系数据表

Sample relationship table data
Sample relationship table data

好友请求

插入一条好友请求. 用户1向用户2发起一个好友请求. 一旦一条记录插入到了这个关系表, 一个请求或者一个关系就已经在两个用户之间建立了. 你可以通过 statusaction_user_id 显示当前好友状态或者阻止好友请求

INSERT INTO `relationship` (`user_one_id`, `user_two_id`, `status`, `action_user_id`)
VALUES (1, 2, 0, 1)

 

同意好友请求

更新好友请求状态. 同意用户1发给用户2的好友请求.

UPDATE `relationship` SET `status` = 1, `action_user_id` = `2`
WHERE `user_one_id` = 1 AND `user_two_id` = 2

 

检查好友关系

检查任意两个用户是否是好友使用这个查询. 记住, user_one_id一定总是比user_two_id少. 如果返回一行结果, 那么这两个用户就是好友关系.

SELECT * FROM `relationship`
WHERE `user_one_id` = 1 AND `user_two_id` = 2 AND `status` = 1

 

好友列表

查看用户的所有好友. 这里用户1是登陆的用户.

SELECT * FROM `relationship`
WHERE (`user_one_id` = 1 OR `user_two_id` = 1)
AND `status` = 1

 

请求未决

获取用户1 所有未处理的好友请求. 假设用户1当前登陆.

SELECT * FROM `relationship`
WHERE (`user_one_id` = 1 OR `user_two_id` = 1)
AND `status` = 0
AND `action_user_id` != 1

 

用户的好友请求

当登陆的用户访问另一个用户的用户主页, 我们应该需要检索出两个人的好友关系状态. 这里, 用户1是当前登陆的用户. 用户1访问用户7的用户主页, 下面的查询可以检索出两个人的关系状态.

SELECT * FROM `relationship`
WHERE `user_one_id` = 1 AND `user_two_id` = 7

 

Friend Request Query Result
好友请求

上图是用户1向用户7发了一个好友请求. 根据状态我们可以知道他们不是好友. 使用下面的代码显示两人的关系状态

<?php
// Database connection code, $con is the database connection var.
// Now $row contains the query result.
// Logged in user id is stored in, $current_user_id. Profile user id is shown in $profile_user_id

switch ($row['status']) {
    case 0:
        if ($row['action_user_id'] === $current_user_id) {
            // Show, "Friend request sent" button. Show options to cancel the friend request.
        } elseif ($row['action_user_id'] === $profile_user_id) {
            // Show, "Accept Friend request" button. Show options to block and reject friend request.
        }
    break;
    case 1:
        // Check and show options to unfriend the user.
    break;
    case 3:
        // Check and show options to unblock. If the other user's visit's this profile show "profile does'nt exists"
    break;
}

 

原文出自: http://www.codedodle.com/2014/12/social-network-friends-database.html

翻译: xxtime.com

延伸阅读:
http://www.9lessons.info/2013/05/message-conversation-database-design.html
http://www.9lessons.info/2014/03/facebook-style-friend-request-system.html