一种在互联网上传输实时多媒体数据的方法.pdf

上传人:111****112 文档编号:688325 上传时间:2018-03-05 格式:PDF 页数:13 大小:694.66KB
返回 下载 相关 举报
摘要
申请专利号:

CN200410070494.7

申请日:

2004.08.05

公开号:

CN1588914A

公开日:

2005.03.02

当前法律状态:

终止

有效性:

无权

法律详情:

未缴年费专利权终止IPC(主分类):H04L 12/56申请日:20040805授权公告日:20070509终止日期:20160805|||授权|||实质审查的生效|||公开

IPC分类号:

H04L12/56

主分类号:

H04L12/56

申请人:

北京航空航天大学;

发明人:

喻湘宁; 金天; 盛向治; 李未

地址:

100083北京市海淀区学院路37号北京航空航天大学

优先权:

专利代理机构:

北京中创阳光知识产权代理有限责任公司

代理人:

尹振启

PDF下载: PDF下载
内容摘要

本发明提出了一种在互联网上传输实时多媒体数据的方法,并具体包括以下步骤:(A)NSPD将新的数据报文接收到缓冲区中;(B)如果缓冲区满则丢弃某些旧报文并重新分配;如果缓冲区未满则进入下列步骤;(C)根据报文头部的信息来判断该报文是不是正确的NSPD报文,若不是正确的NSPD报文,则丢弃报文并回收缓冲区;若是正确的NSPD报文,则进入下列步骤;(D)遍历NSPD套接字控制块列表,检索出该报文所属的套接字;(E)在检索出正确的套接字控制之后,新的报文接入控制块的报文队列里,等待应用程序的进一步处理。

权利要求书

1、  一种在互联网上传输实时多媒体数据的方法,包括:
(A)NSPD将新的数据报文接收到缓冲区中;
(B)如果缓冲区满则丢弃某些旧报文并重新分配;如果缓冲区未满则进入下列步骤;
(C)根据报文头部的信息来判断该报文是不是正确的NSPD报文,若不是正确的NSPD报文,则丢弃报文并回收缓冲区;若是正确的NSPD报文,则进入下列步骤;
(D)遍历NSPD套接字控制块列表,检索出该报文所属的套接字;
(E)在检索出正确的套接字控制之后,新的报文接入控制块的报文队列里,等待应用程序的进一步处理。

2、
  根据权利要求1的方法,其中步骤(C)进一步包括首先检查报文类型的值,如果是0x8048001,则表明这是NSPD穿越报文,否则表明这可能是NSPD虚拟端口值。

3、
  根据权利要求1的方法,进一步包括步骤(F)检查套接字IO模式。

4、
  根据权利要求3的方法,其中若是调用WSAAsynSelect,则根据该API的参数填充了套接字控制块的相应字段,将报文到达消息投递到SOCKET窗口,应用程序即可接收到SOCKET消息,并且应用程序返回并取走报文。

5、
  根据权利要求3的方法,其中若是调用WSAEventSelect,则NSPD根据其参数填充套接字控制块中的相应字段,接收网络事件的事件句柄,这样应用程序即可接收到网络事件通知,并且应用程序返回并取走报文。

6、
  根据权利要求3的方法,其中若是调用阻塞IO,则激活阻塞IO的事件句柄,并且应用程序返回并取走报文。

说明书

一种在互联网上传输实时多媒体数据的方法
技术领域
本发明属于多媒体软件开发领域,具体地说,涉及一种在互联网上传输实时多媒体数据的方法。
背景技术
一般而言,多媒体视频会议系统的服务器端都位于internet上,拥有各自独立的IP地址,但大多数会议系统的客户端却都是位于NAT设备之后,通过NAT设备连接到Internet,这样的结构给多媒体视频会议系统的开发带来了很多问题,例如,通常情况下NAT设备被配置为不允许外部的主动连接,因此会议系统的服务器很难直接向NAT内的用户主动发送音视频数据。
为了突破NAT的限制,H323等系统的做法是,配置NAT设备,对外部网络开放某些端口,利用NAT设备向内部网络的某台主机转发数据。这种做法缺乏灵活性,并且要求具有NAT设备的管理员权限,对于普通用户而言,难以实现。
因此,NSPD的做法是在系统的网络协议栈中安装新的协议层,位于NAT内部和外部的客户端与服务器上分别安装同样的协议,在这一协议层中完成了NAT防火墙的穿越功能。它通过标准的套接字接口给应用程序提供服务,并给来自上层应用程序的多媒体数据添加新的报文头,然后将封包后的数据转交给更低层的系统UDP传输层,这一方法符合网络的分层设计原则,并且能够很快应用到原有的系统中。
综上所述,本发明的任务在于解决NAT给多媒体应用带来的通讯问题,同时NSPD还结合系统协议的性质,可以实现多媒体数据的安全加密与QoS控制等。
本发明的目的是解决NAT给多媒体应用带来的通讯问题,在UDP协议的基础上实现了一个新的网络协议,能够广泛的用于各种多媒体应用程序,提供跨跃NAT防火墙的多媒体实时通讯技术。
发明内容
针对上面的上面的描述,本发明提出了一种在互联网上传输实时多媒体数据的方法,并具体包括以下步骤:(A)NSPD将新的数据报文接收到缓冲区中;(B)如果缓冲区满则丢弃某些旧报文并重新分配;如果缓冲区未满则进入下列步骤;(C)根据报文头部的信息来判断该报文是不是正确的NSPD报文,若不是正确的NSPD报文,则丢弃报文并回收缓冲区;若是正确的NSPD报文,则进入下列步骤;(D)遍历NSPD套接字控制块列表,检索出该报文所属的套接字;(E)在检索出正确的套接字控制之后,新的报文接入控制块的报文队列里,等待应用程序的进一步处理。
根据本发明的一个方面,其中步骤(C)进一步包括首先检查报文类型的值,如果是0x8048001,则表明这是NSPD穿越报文,否则表明这可能是NSPD虚拟端口值。
根据本发明的另一个方面,进一步包括步骤(F)检查套接字IO模式。
根据本发明的另一个方面,其中若是调用WSAAsynSelect,则根据该API的参数填充了套接字控制块的相应字段,将报文到达消息投递到SOCKET窗口,应用程序即可接收到SOCKET消息,并且应用程序返回并取走报文。
根据本发明的另一个方面,其中若是调用WSAEventSelect,则NSPD根据其参数填充套接字控制块中的相应字段,接收网络事件的事件句柄,这样应用程序即可接收到网络事件通知,并且应用程序返回并取走报文。
根据本发明的另一个方面,其中若是调用阻塞IO,则激活阻塞IO的事件句柄,并且应用程序返回并取走报文。
附图说明
图1示出了NSPD在网络协议栈中的相对位置;
图2给出了识别来自不同内部网络的客户端的流程;
图3给出了应用程序与NSPD SOCKET的关系;
图4给出了NSPD报文接收流程图;
具体实施方式
对下面我们参考附图,对本发明的实施例进行详细的说明。
NSPD是一个独立的网络层服务,位于系统的网络协议栈中,可以被应用程序选择使用。图1示出了NSPD在网络协议栈中的相对位置,按照网络协议的分层原则,它位于UDP传输层与应用层之间。NSPD的处于网络协议栈的中间位置,它向上提供一组调用接口,为应用程序提供服务,并且能同时接纳多个应用程序并发执行,向下,NSPD依赖于系统的UDP传输层模块,在网络上完成实际地数据交换,并在内部集成穿越NAT防火墙的功能,对于上层的应用程序透明。
应用程序通过NSPD提供的API接口间接的访问系统网络层,这些接口的功能应当尽可能完善和易于使用。根据它们各自的功能可以归纳为以下几类。
1、创建和撤销NSPD套接字
在应用程序要求使用NSPD时,NSPD应当为其提供一个全局唯一的标识,不妨称之为”NSPD套接字”。与Berkeley套接字类似,应用程序根据NSPD套接字完成所有的网络通信,一个应用程序可以创建多个NSPD套接字,分别完成各自的网络操作,且相互之间不会有影响。以套接字为基础,NSPD为应用程序提供其他的API。
每一个套接字在NSPD内部对应一个相应的数据结构,我们称之为套接字控制块,在控制块中了保存了所有与套接字相关的信息。套接字的生存期从应用程序创建开始,直到被应用程序撤销。NSPD维护这些套接字的信息,在应用程序发生异常时,自行撤销相应的套接字控制块。
应用程序通过相应的接口通过NSPD发送或接收数据包。发送时,NSPD为报文附加新的字段,与报文内容作为一个整体在网络上传输,接收时,NSPD根据附加字段的内容,将报文内容投递给正确的套接字。
网络应用程序通过IO模式来获取数据,大多数这类程序在接收报文的过程中,都具有以下两种不同的状态:
1.等待,直到可以接收数据
2.将报文从网络层复制到应用程序
按照这种方式,对施加于NSPD套接字的接收过程而言,第一步通常是等待报文从网络上达到NSPD,报文到达后,被接收到NSPD的网络缓冲区中,第二步,将其从NSPD的缓冲区中复制到应用程序的缓冲区。为了提高效率,NSPD应当尽量减少报文复制的次数。
以这些状态为基础,NSPD提供了一些基本的IO模式,能满足大多数应用程序的需求。
(1)阻塞模式
套接字调用报文接收的API时,向NSPD传达希望接收报文的讯号,然后一直处于阻塞状态。当网络数据从NSPD达到该套接字的虚拟端口后,API调用返回,应用程序从NSPD的缓冲区中获得数据。
(2)信号驱动模式
在准备接收报文之前,套接字需要设置好报文接收例程,并可以立即返回,继续其他的操作。此后,每当有数据抵达该套接字,NSPD都会发送相应的信号给应用程序,自动调用前面设置好的报文接收例程。在例程中,应用程序将数据从NSPD的缓冲区中复制到自己的缓冲区里。
应用程序对这些接口的调用具有随意性和不可预测性,因此NSPD在内部维护一组与应用程序相关的机制,以保证NSPD的稳定性和健壮性,这些机制包括虚拟端口映射、防火墙穿越机制和缓冲区管理等。
为了减少系统资源的占用,NSPD被设计为只占用一个UDP端口,不同主机上的NSPD模块都约定好使用同样的端口。这样一来,当有多个应用程序使用NSPD发送和接受数据时,就需要对报文的目的地址做进一步区分,为此我们在NSPD中引入了虚拟端口的概念。虚拟端口是一个16位正整数,每一个NSPD套接字都被绑定到一个全局唯一的虚拟端口上。发送报文时,NSPD将它的值附加到每一个报文中,作为UDP数据包的一部分在网络上传输,在接收报文时,NSPD根据虚拟端口的值,确定接收者的套接字,并且根据该套接字的IO模式,投递正确的信号给创建套接字的应用程序。
NSPD严格区分位于NAT防火墙内外两种不同的网络环境,对内称之为NSPD客户端,对外称之为NSPD服务器。客户端位于内部网络,使用内网IP地址,而服务器位于外部网络,它们被NAT设备阻隔。
利用NAT的原理,客户端需要主动往服务器发送一些数据,目的是在NAT设备上建立NAT地址到客户端内网地址的映射关系,一旦这种映射关系被建立,服务器就能通过NAT设备上对应的端口向客户端转发数据。
图3给出了自动识别来自不同内部网络的客户端的流程图,按照报文所处位置的不同,将流程分为三个步骤。
1.客户端到NAT
客户端套接字记录下本机的IP地址和虚拟端口,并将其发往服务器。未经过NAT设备之前,报文的UDP头部中的源地址与源端口均为客户端的本地地址,即内网地址。
2.经过NAT设备
NAT设备根据自身的规则,将报文的UDP头部中的源地址与源端口替换为NAT设备拥有的Internet注册的地址和端口,并记录修改前的源地址和源端口。
3.NAT到服务器
报文到达服务器之后,服务器记录两个地址:UDP头部中的地址,即NAT地址;报文内容中记录的客户端地址(包括端口),即内网地址。这两个地址保存在服务器端的地址映射表中。
NSPD服务器的地址映射表的每一项对应一个位于内部网络的客户端,当外部网络上的应用程序通过NSPD往内网发送报文时,只需要根据内网地址和端口反查出NAT地址和端口,然后将报文发送到NAT地址即可。
下面对网络报文抵达NSPD之后的缓冲区管理进行说明,它具有以下特点:
高效率:NSPD最初是为多媒体网络应用程序设计,这类程序具有网络流量大,对实时性要求高等特点,因此NSPD应当尽量减少报文的复制次数和缓冲带来的延迟,提高效率。
稳定:NSPD为每个应用程序都保存了一定的信息,甚至为其缓冲了大量的网络报文,在应用程序发生异常时,很可能来不及回收这些资源。NSPD需要防止这种情况引起的资源泄漏,保证自身的处理能力。
图3给出了根据Windows SPI的设计,应用程序调用WSASocket函数,而Winsock会根据函数调用时提供的地址家族,套接字类型和协议参数等来决定需要加载哪个服务提供者。对于NSPD而言,只要提供对应的协议参数,就可以加载NSPD服务提供者。通常应用程序采用如下的方式来创建NSPD套接字:
WSAPROTOCOL_INFO info;
GetNSPDProviders(&info); //获取NSPD协议参数
sock=WSASocket(AF_INET,SOCK_DGRAM,0,
              &info,
              0,0);
在创建完NSPD套接字之后,应用程序实际上选择了使用NSPD服务提供者。NSPD服务提供者以DLL的形式存在,该DLL导入了一个名为WSPStartup的单一函数条目。在应用程序(NSPD客户机)调用WSPStartup时,便通过一个被当作参数投送的函数派遣表来打开其他的NSPD函数,NSPD服务提供者就是由这些函数组成,它们与Winsock API的对应关系如下表所示:

    Winsock API    NSPD服务提供者API    WSASocket    WSPSocket    WSARecvFrom/recvfrom    WSPRecvFrom    WSASendto/sendto    WSPSendto    WSABind/bind    WSPBind    WSACloseSocket/closesocket    WSPCloseSocket    WSAAsynSelect    WSPAsyncSelect    setsockopt    WSPSetSockOpt    getsockopt    WSPGetSockOpt    WSAIoctl    WSPIoctl    WSAConnect/connect    WSPConnect    WSASend/send    WSPSend    Getsockname    WSPGetSockName    WSAEventSelect    WSPEventSelect

应用程序创建NSPD套接字之后,与该套接字相应的Winsock API调用都会映射到表格左边的NSPD服务提供者中对应的API中来,举例而言,对NSPD套接字的bind操作最终会由NSPD服务提供者中的WSPBind函数来完成。
NSPD服务提供者实际上接管了应用程序对Winsock API的调用,在其内部维护一组NSPD套接字控制块。每一个NSPD套接字控制块对应于应用程序中的某一个NSPD套接字,在控制块中保留了大量的与NSPD套接字相关的信息,下表列出了其中的部分关键信息:    类型    字段名    含义    HANDLE    m_socket    SOCKET句柄号    DWORD    m_error    套接字Errno值    DWORD    m_pid    创建套接字的进程ID    HWND    m_wnd    与WSAAsynSelect对应的数据类型    UINT    m_msg    long    m_event    HANDLE    m_event_sel    与WSAEventSelect对应的句柄号    UINT    m_packets_    head    报文队列头    UINT    m_packets_t    ail    报文队列尾

根据表中与套接字IO模式相关的字段,NSPD实现了三种不同的Winsock IO模式,即WSAAsynSelect、WSAEventSelect与Blocked IO等。这三种模式已经基本上能满足大部分应用程序的要求。
如附图3所示,NSPD维护的套接字控制块列表的大小为三,应用程序中创建的某个套接字的报文队列中有四个报文尚待接收,而NSPD报文缓冲区中当前有六个报文,其他两个报文的归属没有在图中标出。
图2给出了NSPD模块在UDP的8848端口接收报文,当有报文到达该端口时,立即开始NSPD的报文接收和处理流程。
首先,NSPD试图从缓冲区中分配空间来存放新的数据报文,报文被直接接收到共享内存当中,这样一来,应用程序就可以直接从共享内存中获取报文,减小了报文的复制次数,提高了系统的效率。在缓冲区分配失败的情况下,NSPD会检查报文缓冲区,按照规则回收一部分缓冲区。在NSPD的报文缓冲区中,报文按照如下的格式进行缓存:    类型    字段    含义    UINT    m_next_packet    报文队列中的下一个报文    UINT    m_len    报文长度    SOCKET    m_sock    报文所归属的套接字    DWORD    m_timestamp    报文到达的时间戳
    sockaddr_    in    m_addr    报文的源地址    NSP_PA    CKET    m_pkt    NSPD报文

相应的,NSPD报文的头部定义如下:    类型    字段    含义    UINT    m_type    NSPD虚拟端口    UINT    m_len    报文长度

NSPD中的报文分为两种类型,一种是普通的NSPD数据报文,另一种为NSPD穿越报文,用于从NAT防火墙内部穿越NAT,建立数据链路,穿越报文的格式定义如下:    类型    字段    含义    UINT    m_type    报文类型,值为0x8048001    UINT    m_len    报文长度    UINT    m_ip    本地IP    UINT    m_port    该套接字的NSPD虚拟端口

综上所述,两种报文合而为一,采用C语言定义为:
   struct nsppkt{   UINT m_typ;   int m_len;   union{   char M_Dat[NSPDATALEN];   struct tag_m_addrPair{   UINT m_ip;   UINT m_port;   }m_addr;   };   };

将报文接收到缓冲区之后,就可以根据报文头部的信息来判断该报文是不是正确的NSPD报文了。首先检查报文类型的值,如果是0x8048001,则表明这是NSPD穿越报文,否则的话就表示这可能是NSPD的虚拟端口值,进一步的,通过遍历NSPD套接字控制块列表,就能够检索出该报文所属的套接字或者断定该报文为非法报文。
在检索出正确的套接字控制块后,新的报文会接入控制块的报文队列里,等待应用程序的进一步处理。
前面提到,NSPD支持三种不同的Winsock IO模型,分别是WSAAsynSelect、WSAEventSelect和Blocked IO模式。NSPD将报文放到套接字控制块中的报文列表中以后,会根据该套接字的IO模式分别进行处理,通知应用程序将报文从队列中取走。下面分别介绍:
●WSAAsynSelect
在应用程序调用WSAAsynSelect时,NSPD已经根据该API的参数填充了套接字控制块的相应字段,它们是接收SOCKET消息的窗口句柄、SOCKET消息值等。因此只需要投递注册的Windows消息到正确的窗口句柄,应用程序即可通过recvfrom函数将接收报文。
●WSAEventSelect
同样的,在应用程序调用WSAEventSelect时,NSPD也会根据其参数填充套接字控制块中的相应字段,如接收网络事件的事件句柄等。NSPD会将该事件置于有信号状态,这样一来,应用程序就能从WSAWaitforSingleObject等函数中返回,通过API接收报文。
●BlockedIO
NSPD使得处于阻塞状态的recvfrom函数返回应用程序,直接将数据报
文返回给应用程序。
对于本领域的普通技术人员来说可显而易见的得出其他优点和修改。因此,具有更广方面的本发明并不局限于这里所示出的并且所描述的具体说明及示例性实施例。因此,在不脱离由随后权利要求及其等价体所定义的一般发明构思的精神和范围的情况下,可对其作出各种修改。

一种在互联网上传输实时多媒体数据的方法.pdf_第1页
第1页 / 共13页
一种在互联网上传输实时多媒体数据的方法.pdf_第2页
第2页 / 共13页
一种在互联网上传输实时多媒体数据的方法.pdf_第3页
第3页 / 共13页
点击查看更多>>
资源描述

《一种在互联网上传输实时多媒体数据的方法.pdf》由会员分享,可在线阅读,更多相关《一种在互联网上传输实时多媒体数据的方法.pdf(13页珍藏版)》请在专利查询网上搜索。

本发明提出了一种在互联网上传输实时多媒体数据的方法,并具体包括以下步骤:(A)NSPD将新的数据报文接收到缓冲区中;(B)如果缓冲区满则丢弃某些旧报文并重新分配;如果缓冲区未满则进入下列步骤;(C)根据报文头部的信息来判断该报文是不是正确的NSPD报文,若不是正确的NSPD报文,则丢弃报文并回收缓冲区;若是正确的NSPD报文,则进入下列步骤;(D)遍历NSPD套接字控制块列表,检索出该报文所属的套。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 电学 > 电通信技术


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1