`
xujinquan19
  • 浏览: 150661 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论
阅读更多

     本文先讲述即时通讯的实现原理等知识点,然后就是即时通讯与嵌入式的发展了,文章较长,请耐心认真浏览~

 

即时通讯(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服务器将为你们的聊天内容进行中转。其他的即时通信软件原理与此大同小异。(P2P与服务器中转

 

   一般的步骤:

 

   首先,用户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协议。

 

   

S------C1
|
|                               C1每次想和C2通信,先向S递一个申请,然后S同意,把信息转交C2
C2                           以后每次通信都这样

S------C1
|
|                              C1第一次想和C2通信,向S递一个申请,S同意,告诉C1,C2,然后
C2

S-----C1
|      /
|    /                                   C1和C2之间建立了一条连接,可以直接通信,无需经过S.
C2
 
 
QQ聊天信息是在两个用户间直接通信的,而MSN要经过服务器中转

 

QQ当用户登陆时,用户需要首先与qq服务器进行连接进行登录,服务器会向客户返回一些信息,比如你的好有的在线情况以及ip的信息,然后客户可以与你所请求的朋友进行点对点连接,两者互相通信。

MSN不知道是怎样的。

 

第一种,对服务器的性能要求比较高,要求服务器可以同时处理很高的连接数,因为所有信息都要通过服务器进行传递,同时,它可以对所传递的信息进行控制。

 

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


问:那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是两个公网地址,而不是两台机器。

 


 
                                                      附录信息     IM介绍与前景分析
一、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等。
  
  二、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客户端收到后将显示这些好友列表及其在线状态。
  
  三、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秒种
  
  四、兴起的嵌入式IM工具。
  
  传统的IM在统治了互联网即时通讯领域长达十年之久,以其日趋稳定的定能,与较强的用户黏着度,至今仍统治着这个巨大的市场。然而,软件行业的技术精英们,并不满足于此。他们厚积薄发,一直致力于开发出性能更为优越的即时通讯工具。当然,在功能上的不断完善,自然是一个必然的发展方向,在Web2.0时代,如何大力增强用户对网站的黏着度,而不仅仅是对于IM的拥附,已经成为他们的主攻方向了。于是,嵌入式IM工具,应运而生了。
  
  相对以往的传统的即使沟通工具,它们需要用户下载软件包,需要用户进行安装。对于拥有IM产品的网站而言,用户在登陆网站后,不能直接使用其IM工具,对于流量与用户的黏着度,都是有一定影响的。因此在IM与网站相互依存的今天,没有哪家网络公司,愿意将IM工具孤立开来。
  
  于是,目前,一种新型的嵌入式IM工具就应运而生了。这种IM工具,不需要下载安装,当用户登陆网页后,该IM直接嵌套在网页中,可以直接使用。
  
  而在功能上,则一点也不输于传统的IM,无论是传统的文字沟通的速度与效率,还是近年来越来越成为IM工具必备的音频/视频功能,这种嵌入式IM都能提供非常稳定的传输。更值得一提的是,因为嵌入式IM是嵌套在网页上的,软件供应商,可以根据网站需求,设计出适合网站风格的IM产品,而目前AnyChat SDK等国内音视频技术产品已在嵌入式上取得良好发展。如此一来,未来的通讯产品将不再像像传统的IM工具,千篇一律,毫无个性可言。
  
  目前,这类嵌入式应用在社区、交友、会议系统、应急指挥及相关的类型的网站系统或平台上,已经得到较为广泛应用。在INTERNET时代,将发挥越来越重要的作用。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/DreamTww/archive/2009/10/04/4632174.aspx

分享到:
评论

相关推荐

    基于QT安全即时通讯软件

    综上所述,【基于QT安全即时通讯软件】的开发涵盖了QT库的运用、用户认证、界面设计、网络通信、数据安全等多个方面的知识,要求开发者具备全面的技术能力与良好的用户体验设计意识。文件"new_demo"可能是项目的源...

    QT开发基于C++的即时通讯工具代码+文档+答辩ppt

    7. 多线程:为了保证用户体验,即时通讯工具通常会采用多线程技术,将用户界面与后台通信逻辑分离,避免因网络延迟导致界面卡顿。 8. 答辩PPT:这部分可能包含项目的概述、设计思路、实现细节、功能演示和性能评估...

    前后端分离Uniapp+SpringBoot即时通讯安卓APP源码

    标题中的“前后端分离Uniapp+SpringBoot即时通讯安卓APP源码”揭示了这个项目的核心技术栈:前端采用的是基于Vue.js的UniApp框架,后端则是Java的SpringBoot框架,用于实现即时通讯功能。这样的架构设计使得前端与...

    c++实现ICQ即时通讯

    在本文中,我们将深入探讨如何使用C++编程语言来实现一个具有加解密功能的ICQ即时通讯程序。ICQ,即"Internet传呼机",是早期的即时通讯软件,而在这里,我们关注的是使用C++重写其核心功能,并加入安全通信的元素。...

    即时通讯系统的实现

    8. **实时性与稳定性**:即时通讯强调实时性,因此需要优化延迟。同时,系统必须足够稳定,能够处理异常情况,如网络抖动、断线重连等。 9. **用户界面**:良好的用户体验是即时通讯系统的关键。设计简洁易用的用户...

    基于Webkit即时通讯客户端源码

    【即时通讯技术详解】 即时通讯(Instant Messaging,简称IM)是一种允许用户实时交流的技术,它在互联网应用中占据了重要地位,广泛应用于社交平台、企业协作工具等场景。本资源提供的"基于Webkit即时通讯客户端...

    一个基于Netty、SpingBoot开发的分布式、嵌入式、组件化、高度自定义、高可扩展的Java即时通讯框架.zip

    标题中的“一个基于Netty、SpringBoot开发的分布式、嵌入式、组件化、高度自定义、高可扩展的Java即时通讯框架”揭示了这个项目的核心技术和设计特点。以下是对这些知识点的详细解释: 1. **Netty**: Netty是一个高...

    基于XMPP协议的P2P即时通讯软件设计

    设计基于XMPP协议的P2P即时通讯软件,首先需要理解并选择合适的开发环境,例如嵌入式Linux平台,它提供了稳定且资源高效的运行环境。此外,还需要掌握网络模型的选取原则,如TCP/IP模型,以及如何利用XML解析器和...

    pw.zip_open_即时通讯

    1. **网络编程基础**:即时通讯应用依赖于TCP/IP协议栈进行数据传输,因此理解网络编程的基本概念,如套接字(Socket)、连接建立与断开(三次握手与四次挥手)以及数据的分包和重组等,是构建此类应用的基础。...

    [飞享]-全开源即时通讯(IM)系统的Android客户端.zip

    [飞享]-全开源即时通讯(IM)系统的Android客户端,底层协议栈使用Java NIO进行完全自主改造,全新的心跳设计,全新的二进制协议设计,支持与[飞享] Web客户端消息互通。支持文本,语音,视频等常用功能 软件开发设计...

    基于Linux的即时通信系统设计 (1).pdf

    "基于Linux的即时通信系统设计" 本文设计了一个基于Linux平台的即时通信系统,旨在解决当前 Linux 平台下的通信系统数量较少、功能有限的问题。该系统使用 C 语言进行程序编写,采用基于 TCP 协议的 C/S 架构进行...

    java实现即时通讯 IM 聊天系统

    Spring Boot 即时通讯 IM 聊天系统CIM是一套基于netty框架下的推送系统,或许有一些企业有着自己一套即时通讯系统的需求,那么CIM为您提供了一个解决方案,目前CIM支持websocket,android,ios,桌面应用,系统应用等...

    嵌入式图形界面开发 - QT 即时通信软件.zip

    "嵌入式图形界面开发 - QT 即时通信软件.zip" 文件是一个关于使用QT进行即时通讯应用开发的资源包。 在这个项目中,"QT-MyChat-master"可能包含了完整的源代码、资源文件和必要的构建脚本,用于构建一个名为"MyChat...

    计算机网络课程设计 即时通讯软件

    本项目“即时通讯软件Minet”是基于Qt框架实现的,它为用户提供了实时的信息交换平台,具备基本的聊天、文件传输等功能,是学习网络编程和GUI设计的一个优秀实践案例。 首先,我们要理解Qt是什么。Qt是一个跨平台的...

    若依集成CIM(即时推送系统)实现将服务端修改为SpringBoot+Vue前后端分离版代码.rar

    CIM是一套基于mina或netty框架下的推送系统,或许有一些企业有着自己一套即时通讯系统的需求,那么CIM为您提供了一个解决方案,目前CIM支持websocket,android,ios,桌面应用,系统应用等多端接入支持,可应用于移动...

    基于SpringBoot +mina或netty即时通讯聊天系统源码.zip

    基于Spring Boot +mina或netty即时通讯聊天系统源码.zip 完整源码,可运行 基于mina或netty框架下的推送系统,或许有一些企业有着自己一套即时通讯系统的需求,那么CIM为您提供了一个解决方案,目前CIM支持websocket...

    在Android平台下利用WiFi技术实现数据传输和即时通讯

    Android平台不仅在移动嵌入式开发领域展现出强大实力,更在无线网络技术的推动下,特别是在WiFi技术的加持下,实现了数据传输速率的飞跃,以及即时通讯领域的革新。本文将深入探讨Android平台如何借助WiFi技术,实现...

    3G手机等嵌入式技术终端实现监控,视频会议,即时通讯的平台开发

    “佰锐3G手机视频开发平台”具有开放的系统架构,为第三方视频应用系统提供了标准的SDK接口,当用户进行二次开发时,可以不用关心任何与3G网络、手机平台相关的技术细节,只需要按照标准SDK接口实现功能即可,用户...

    基于GPRS网络的嵌入式系统的研究

    基于GPRS网络的嵌入式系统研究,是一个融合了现代通信技术与嵌入式系统设计的前沿领域。本文深入探讨了这一主题,旨在利用嵌入式系统的高效性、实时性和结构紧凑的特点,结合GPRS(General Packet Radio Service,...

Global site tag (gtag.js) - Google Analytics