IM即时通信实现原理

 

即时通信(Instant Messenger,简称IM)软件可能是基于TCP/IP和UDP进行通信的,TCP/IP和UDP都是创建在更低层的IP协议上的两种通信传输协议。前 者是以数据流的形式,将传输数据经分割、打包后,经过两台机器之间创建起的虚电路,进行连续的、双向的、严格保证数据正确性的文件传输协议。然后者是以数 据报的形式,对拆分后的数据的前后到达顺序不作要求的文件传输协议。算法


QQ就是使用UDP协议进行发送和接收消息的。当你的机器安装了OICQ之后,实际上,你既是服务端(Server),又是客户端(Client)。当你登陆OICQ时,你的OICQ做为Client链接到腾讯公司的主服务器上,当你看谁在线时,你的OICQ又一次做为Client从QQ Server上读取在线网友名单。当你和你的OICQ伙伴进行聊天时,若是你和对方的链接比较稳定,你和他的聊天内容都是以UDP的形式,在计算机之间传 送。若是你和对方的链接不是很稳定,QQ服务器将为大家的聊天内容进行中转。其余的即时通讯软件原理与此大同小异。数据库

 

通常的步骤:后端

 

首先,用户A输入本身的用户名和密码登陆即时通信服务器,服务器经过读取用户数据库来验证用户身份,若是用户名、密码都正确,就登记用户A的IP地址、IM客户端软件的版本号及使用的TCP/UDP端口号, 而后返回用户A登陆成功的标志,此时用户A在 IM系统中的状态为在线(Online Presence)。服务器

 

其次,根据用户A存储在IM服务器上的好友列表 (Buddy List),服务器将用户A在线的相关信息发送到也同时在线的即时通信好友的PC机,这些信息包括在线状态、IP地址、 IM客户端使用的TCP端口(Port)号等,即时通信好友PC机上的即时通信软件收到此信息后将在PC桌面上弹出一个小窗口予以提示。网络

 

第三步,即时通信服务器把用户A存储在服务器上的好友列 表及相关信息回送到他的PC机,这些信息包括也在线状态、IP地址、IM客户端使用的TCP端口(Port)号等信息,用户A的PC机上的IM客户端收到 后将显示这些好友列表及其在线状态。数据结构

 

接下来,若是用户A想与他的在线好友用户B聊天,他将直接经过服务器发送过来的用户B的IP地址、TCP端口号等信息,直接向用户B的PC机发出聊天信息,用户B的IM客户端软件收到后显示在屏幕上,而后用户B再直接回复到用户A的PC机,这样双方的即时文字消息就不经过 IM服务器中转,而是经过网络进行点对点的直接通信,这称为对等通信方式(Peer To Peer) 。在商用即时通信系统中,若是用户A与用户B的点对点通信因为防火墙、网络速度等缘由难以创建或者速度很慢, IM服务器还提供消息中转服务,即用户A和用户B的即时消息所有先发送到IM服务器,再由服务器转发给对方。早期的IM系统,在IM客户端和IM服务器之间通信采用采用UDP协议,UDP协议是不可靠的传输协议,而在 IM客户端之间的直接通信中,采用具有可靠传输能力的TCP协议。随着用户需求和技术环境的发展,目前主流的即时通信系统倾向于在即时通信客户端之间、即时通信客户端和即时通信服务器之间都采用TCP协议 。app

 

S——C1
|
| C1每次想和C2通讯,先向S递一个申请,而后S赞成,把信息转交C2,  之后每次通讯都这样 
C2socket

 

S——C1
|
| C1第一次想和C2通讯,向S递一个申请,S赞成,告诉C1,C2,而后 C1和 C2之间创建了一条链接,能够直接通讯,无需通过S. 
C2工具

 

第 一种,对服务器的性能要求比较高,要求服务器能够同时处理很高的链接数,由于全部信息都要经过服务器进行传递,同时,它能够对所传递的信息进行控制。性能

 

第二种,仅仅是用户登录或下线时与服务器进行链接,平时进行通讯时,是用户之间直接进行点对点的链接,这种实现更合理一 些。

 

 

QQ聊天信息是在两个用户间直接通讯的,而MSN要通过服务器中转.

QQ当用户登录时,用户须要首先与qq服务器进行链接进行登陆,服务器会向客户返回一些信息,好比你的好有的在线状况以及ip的信息,而后客户能够与你所请求的朋友进行点对点链接,二者互相通讯。


那 若是 c1和c2都在私网内,要经过路由器作NAT才能出去的话,他们之间的socket是如何创建的呢?
看一下下面的协议.

Simple Traversal of User Datagram Protocol (UDP) Through Network
Address Translators (NATs) (STUN)。

STUN,是为了实现透明的穿透NAT,而定义的一套协 议。他使本地的内网的机器,具备取得,可以得知他的NAT网关的IP,NAT类型的能力。

为何须要STUN:

由于NAT虽然解决了IP地址稀少的问题,可是也带来了不少的问题。好比全部P2P应用,像文件SHARE,多媒体,和在线游戏等等.
为了解决这个问题,有人将 Application Layer Gateways (ALGs) 放到了NAT中,
ALGs 也有严重的问题,好比跟不上速度太块的CLIENT,每个应用都须要单独的实现。
跟不上应用的发展。
为了克服ALGS的问题,又提出了the Middlebox Communications (MIDCOM) protocol
中间合协议。但是MIDBOX协议使 ,一些CLIENT能够控制NAT/防火墙的行为,经过这个
把应用协议和NAT部分分开,把ALGS从基本NAT里面处理开。不过由于要处理MIDBOX,那么
全部的NAT或者防火墙都要升级,

由于上面种种缘由:
The protocol described here, Simple Traversal of UDP Through NAT
(STUN), allows entities behind a NAT to first discover the presence
of a NAT and the type of NAT, and then to learn the addresses
bindings allocated by the NAT. STUN requires no changes to NATs, and
works with an arbitrary(任意) number of NATs in tandem between the
application entity and the public Internet.

要想穿透NAT,首先知道NAT的一些特性:
NAT分为4种(加上防火墙的话,多几种状况):
1.彻底透明NAT(Full Cone NAT):
从相同内部主机(IN IPX) +端口(IN PORTX)发送的数据MAPING为相同的IP(OUT IP X)和端口(OUT PORT X)发送带外网.
而且 从另外一个服务器(Y),若是直连到MAPING的IP(OUT IP X)和端口(OUT PORT X )上,数据将会被转发到内部主机上. (IN IPX), (IN PORTX).
//也就是说进内部网的数据包的SPORT,SPORT不受限制
2.受限NAT(Restricted Cone),
从相同内部主机IN IPX) +端口((IN PORTX))发送的数据MAPING为相同的IP(X)和端口发送带外网.
和彻底NAT不一样的是,只有当为X时,外部机器的的请求就被转发到主机IN IPX) +端口((IN PORTX)。
也就是说进内部网的数据包的,SPORT不受限制,SIP受限制,只能为NAT MAP数据的IP
3,端口受限NAT(Port Restricted Cone:)
和受限NAT不一样的是,只有当外部主动请求的的源IP和端口,等于内部网发送的请求的目的IP和端口。
4.对称NAT(Symmetric)
若是发送的包的目的IP AND PORT,那么MAPPING IP AND PORT,将相同。
内部网同一台机器,同一个端口 若是目的地址不一样,那么MAPPING的端口也不一样,
因此只有他主动连的服务器才可能知道他的MAPPING后端口,别的服务器若是想
连他只能靠猜想端口。
总结:
前面3重NAT,MAPING PORT 和 IP,是根据发送包的的内部网的IP和端口决定的。
若是数据的内网IP和端口相同,那么MAPPING后的端口和地址是固定。
这个功能为咱们的穿越提供了很好条件。
第4种NAT,打洞后的MAPPING 地址和端口将变地不可靠。很难穿越。
注意SERVERA,和SERVERB是两个公网地址,而不是两台机器,

STUN 的简单操做过程:
发送请求。请求分为两种
1. Binding Requests, sent over UDP,
用来发现是否NAT,用来发现NAT的公网地址,和MAPPING后的端口
2.Binding Response,
服务器产生Binding Response,并把获得的MAPPINGIP 和端口,返回到客户端, 客户端比较MAPPING地址是否 和本机地址相同,若是是说明是本机也是公网,不然判断NAT的类型(判断方法:client uses additional STUN Binding Requests)
3.Binding Error,
4.Shared Secret Requests, sent over TLS [2] over TCP.
这个请求要求服务器返回一临时用户名和密码,用来下一步的Binding Requests/ Response,用来验证信息的完整性
5.Shared Secret Response,
6 Shared Secret Error Response。
STUN 信息结构
STUN 由之后数据结构构成:STUN头+STUN有效载荷
STUN头结构以下: 存储的值都是以网络顺序存放
字段类型
STUN message type Short int 消息类型
Length Short int 有效载荷长度,不包含头长度
transaction ID octet[16] 链接的ID值,检查Request,
和Response

STUN的有效载荷
SHUN的有效载荷 是一些STUN的属性构成,属性的类型由信息的类型来决定。
STUN的属性是定义好了的,属性列表(attribute)以下:
MAPPED-ADDRESS 必选 用在Binding Response,(添入MAPING IP 和PORT)
RESPONSEADDRESS 可选 用在Binding Request,指定Response,发送到哪里
若是没有指定,Response发送到MAPING IP 和 PORT
CHANGE-REQUEST 可选 用在Binding Request。用来决定,CLIENT的NAT类型是限制NAT,仍是端口限制NAT,(命令服务器从不一样的源端口/IP,Response请求)
CHANGED-ADDRESS 可选 用在Binding Responses告诉Client改变的端口和IP
SOURCE-ADDRESS 必选 只用在Binding Responses,标记信息的源PORT HE IP
USERNAME 可选 Shared Secret Response/ Binding Requests
PASSWORD, 必选 SharedSecret Response
ESSAGEINTEGRITY 可选 用在Binding Responses, Binding Request记录信息的完整性
ERROR-CODE Binding Error Response and Shared Secret Error Response.
UNKNOWN-ATTRIBUTES
REFLECTED-FROM Binding Responses.用于追溯和防止DDOS

穿透的方法和过程
注意SERVER1,和SERVER2是两个公网地址,而不是两台机器.

 

附录: 

1、IM技术概念

IM技术全称Instant Messaging,中文翻译“即时通信”,它是一种令人们能在网上识别在线用户并与他们实时交换消息的技术,是电子邮件发明以来迅速崛起的在线通信方 式。

IM的出现和互联网有着密不可分的关系,IM彻底基于 TCP/IP网络协议族实现,而TCP/IP协议族则是整个互联网得以实现的技术基础。 最先出现即时通信协议是IRC(Internet Relay Chat),可是惋惜的是它仅能单纯的使用文字、符号的方式经过互联网进行交谈和沟通。随着互连网变得高度发达,即时通信也变得远不止聊天这么简单,自 1996年第一个IM产品ICQ发明后,IM的技术和功能也开始基本成型,语音、视频、文件共享、短信发送等高级信息交换功能均可以在IM工具上实现,于 是功能强大的IM软件便足以搭建一个完整的通讯交流平台。目前最具表明性的几款的IM通信软件有MSN、Google Talk、Yahoo、Messenger 、腾讯QQ等。

 

2、IM技术原理和工做方式

典型的IM工做方式以下:登录IM通信中心(IM通信服务器),获取一个自创建的历史的交流对象列表(好友列表),而后自身标志为在线状态,当好友列表中的某人在任什么时候候登陆上线并试图经过你的计算机联系你 时,IM系统会发一个消息提醒你,而后你能与他创建一个聊天会话通道进行各类消息如键入文字、经过语音等的交流.


从技术上来讲,IM的基本技术原理以下:

经过IM服务器登录或注销
用户A经过列表找到B,用户B得到消息并与之交谈
经过IM服务器指引创建与B单独的通信通道

 

第一步,用户A输入本身的用户名和密码登陆IM服务器, 服务器经过读取用户数据库来验证用户身份,若是验证经过,登记用户A的IP地址、IM客户端软件的版本号及使用的TCP/UDP端口号,而后返回用户A登陆成功的标志,此时用户A在IM系统中的状态为在线(Online Presence)。

 

第二步,根据用户A存储在IM服务器上的好友列表 (Buddy List),服务器将用户A在线的相关信息发送给也同时在线的IM好友的PC机,这些信息包括在线状态、IP地址、IM客户端使用的TCP端口 (Port)号等,IM好友的客户端收到此信息后将在予以提示。

 

第三步是IM服务器把用户A存储在服务器上的好友列表及 相关信息回送到他的客户端机,这些信息包括也在线状态、IP地址、IM客户端使用的TCP端口(Port)号等信息,用户A的IM客户端收到后将显示这些好友列表及其在线状态。

 

3、IM通信方式

1.在线直接通信 
若是用户A想与他的在线好友用户B聊天,他将直接经过服务器发送过来的用户B的IP地址、TCP端口号等信息,直接向用户B的PC机发出聊天信息,用户B 的IM客户端软件收到后显示在屏幕上,而后用户B再直接回复到用户A的PC机,这样双方的即时文字消息就再也不IM服务器中转,而是直接经过网络进行点对点 的通信,即对等通信方式(Peer To Peer)。

2.在线代理通信 
用户A与用户B的点对点通信因为防火墙、网络速度等缘由难以创建或者速度很慢,IM服务器将会主动提供消息中转服务,即用户A和用户B的即时消息所有先发 送到IM服务器,再由服务器转发给对方。

3.离线代理通信 
用户A与用户B因为各类缘由不能同时在线的时候,如此时A向B发送消息,IM服务器能够主动寄存A用户的消息,到B用户下一次登录的时候,自动将消息转发 给B。

4.扩展方式通信 
用户A能够经过IM服务器将信息以扩展的方式传递给B,如短信发送方式发送到B的手机,传真发送方式传递给B的电话机,以email的方式传递给B的电子邮箱等。


早期的IM系统,在IM客户端和IM服务器之间通信采用UDP协议,UDP协议是不可靠的传输协议,而在IM客户端之间的直接通信中,采用具有可靠传输能 力的TCP协议。随着用户需求和技术环境的发展,目前主流的IM系统倾向于在IM客户端之间、IM客户端和IM服务器之间都采用TCP协议。


即时通信相对于其余通信方式如电话、传真、email等的最大优点就是消息传达的即时性和精确性,只要消息传递双方均在网络上能够互通,使用即时通信软件传递消息,传递延时仅为1秒种.

 

4、兴起的嵌入式IM工具。

传统的IM在统治了互联网即时通信领域长达十年之久,以其日趋稳定的定能,与较强的用户黏着度,至今仍统治着这个巨大的市场。然而,软件行业的技术精英们,并不知足于此。他们厚积薄发,一直致力于开发出性能更 为优越的即时通信工具。固然,在功能上的不断完善,天然是一个必然的发展方向,在Web2.0时代,如何大力加强用户对网站的黏着度,而不只仅是对于IM 的拥附,已经成为他们的主攻方向了。因而,嵌入式IM工具,应运而生了。

相对以往的传统的即便沟通工具,它们须要用户下载软件包,须要用户进行安装。对于拥有IM产品的网站而言,用户在登录网站后,不能直接使用其IM工具,对于流量与用户的黏着度,都是有必定影响的。所以在IM 与网站相互依存的今天,没有哪家网络公司,愿意将IM工具孤立开来。

因而,目前,一种新型的嵌入式IM工具就应运而生了。这种IM工具,不须要下载安装,当用户登录网页后,该IM直接嵌套在网页中,能够直接使用。

而在功能上,则一点也不输于传统的IM,不管是传统的文字沟通的速度与效率,仍是近年来愈来愈成为IM工具必备的音频/视频功能,这种嵌入式IM都能提供很是稳定的传输。更值得一提的是,由于嵌入式IM是嵌套 在网页上的,软件供应商,能够根据网站需求,设计出适合网站风格的IM产品。而不是像传统的IM工具,千篇一概,毫无个性可言。

目前,这类嵌入式IM在社区、交友、社团及协做等类型的 网站上,应用已经较为普遍。在Web2.0时代,将发挥愈来愈重要的做用。

相关文章
相关标签/搜索