NAT穿越服务器概要设计文件.docx
- 文档编号:23694389
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:23
- 大小:40KB
NAT穿越服务器概要设计文件.docx
《NAT穿越服务器概要设计文件.docx》由会员分享,可在线阅读,更多相关《NAT穿越服务器概要设计文件.docx(23页珍藏版)》请在冰豆网上搜索。
NAT穿越服务器概要设计文件
目录
目录1
1.引言2
1.1编写目的2
1.2背景2
1.3范围2
1.4文档约定2
1.5参考资料2
2.总体设计3
2.1软件描述3
2.2设计约束3
2.2.1运行环境约束3
2.2.2性能约束3
2.2.3功能约束3
2.2.4界面约束4
2.2.5开发工具约束4
2.3设计原则4
2.4体系构架4
3.模块设计4
3.1Protocol模块4
3.2Server模块10
3.2.1STUN服务器10
3.2.2TURN服务器13
4.数据结构设计15
5.运行设计15
6.故障处理说明15
6.1故障信息15
6.2补救措施15
7.安全保密设计15
8.维护设计15
8.1NAT穿越服务器配置15
8.2启动/停止NAT穿越服务器15
9.需求追溯15
10.附录A:
术语表15
11.附录B:
设计模型16
1.引言
1.1编写目的
多媒体会话信令协议是在准备建立媒体流传输的代理之间交换信息的协议,例如SIP、RTSP、H.323等。
媒体流与信令流截然不同,它们所采用的网络通道也不一致。
由于协议自身设计上的原因,使得媒体流无法直接穿透网络地址转换/防火墙(NAT/FW)。
因为它们生存期的目标只是为了建立一个在信息中携带IP地址的分组流,这在遇到NAT/FW时会带来许多问题。
而且这些协议的目标是通过建立P2P(PeertoPeer)媒体流以减小时延,而协议本身很多方面却与NAT存在兼容性问题,这也是穿透NAT/FW的困难所在。
而NAT仍是解决当前公用IP地址紧缺和网络安全问题的最有力手段,它主要有四种类型:
完全锥型NAT(FullConeNAT),地址限制锥型NAT(AddressRestrictedConeNAT),端口限制锥型NAT(PortRestrictedConeNAT),对称型NAT(SymmetricNAT)。
前三种NAT,映射与目的地址无关,只要源地址相同,映射就相同,而对称型NAT的映射则同时关联源地址和目的地址,所以穿透问题最为复杂。
不少方案已经被应用于解决穿越NAT问题,例如:
ALGs(ApplicationLayerGateways)、MiddleboxControlProtocol、STUN(SimpleTraversalofUDPthroughNAT)、TURN(TraversalUsingRelayNAT)、ICE(InteractiveConnectivityEstablishment)、RSIP(RealmSpecificIP)、symmetricRTP等。
本文档描述基于STUN/TURN协议解决穿越NAT的NAT穿越服务器(NatTraversalServer)的概要设计说明书。
1.2背景
产品/项目名称
企业即时通讯系统
项目代号
IM
项目任务提出者
项目负责人、系统分析员、系统设计员
程序设计员、程序员
本项目开展工作直接有关的人员
1.3范围
本文档涉及NAT穿越服务器的总体设计、模块设计、数据结构设计、运行设计、故障处理说明、安全设计及维护设计等。
1.4文档约定
本文档依照以下文件标准进行编写:
1)CX-WI-04概要设计说明书编写WI.Doc
2)概要设计说明书模板(xxxxBRDS.Doc)
1.5参考资料
1)NAT穿越服务器需求规格说明书(EICSSPEC-NT.doc)
2)即时通讯系统软件构架文档I.doc
3)即时通讯系统软件构架文档II.doc
4)Rosenberg,J.,Weinberger,J.,Huitema,C.andR.Mahy,"STUN-SimpleTraversalofUserDatagramProtocol(UDP)ThroughNetworkAddressTranslators(NATs)",RFC3489,March2003.
5)Rosenberg,J.,"TraversalUsingRelayNAT(TURN)",draft-rosenberg-midcom-turn-08(workinprogress),September2005.
2.总体设计
2.1软件描述
NAT穿越服务器实现STUN协议和TURN协议的服务器端逻辑。
STUN是一个轻量级的协议,允许应用程序探测当前在它们与公网之间是否存在NAT、防火墙以及它们的类型,并且具备能够探测到NAT所分配的公网地址和端口的能力。
STUN协议中定义了两个实体:
STUNClient和STUNServer。
STUNClient嵌入在终端系统的应用程序中,比如SIPUA,它向STUNServer发送请求;STUNServer接收请求并产生STUN响应,它是无状态的。
SIPUA在建立呼叫之前,通过向处在公网上的STUN服务器发送STUN请求,得到信令和媒体流在NAT上的映射地址,并且将这些地址填写到SIP消息中的Via、Contact字段以及SDP中的媒体流传输地址,替代原有的私有地址。
但是,STUN只能工作在完全锥形NAT、地址限制锥形NAT以及端口限制锥形NAT的网络环境下,在对称性NAT的情况下,SIPUA通过STUN请求得到的映射地址是无效的。
TURN协议在语法和操作上均与STUN相似,其优点是提供了对对称性NAT的穿越。
处在公网的TURN服务器为客户端提供本身的一个外部IP地址和端口,并且负责中转通信双方的媒体流。
TURN协议虽然支持所有类型的NAT穿越,但是它需要中转通信双方的媒体流,使得媒体流在传输过程中增加了一跳,不可避免地增加了包的延迟和丢包的可能性,而且完全使用TURN方式需要大量的TURN服务器,在有大量用户时,TURN服务器会成为系统瓶颈,因此我们应该尽量避免使用这种方法。
2.2设计约束
2.2.1运行环境约束
NAT穿越服务器运行于Linux和Windows环境下:
CPU:
双CPU,IntelPIII以上
内存:
1GB以上
硬盘:
10G以上
网络接口卡:
100M以上
操作系统:
Linux(内核版本2.4.18以上)
Windows2000以上
2.2.2性能约束
支持7x24小时可靠运行;
单台NAT穿越服务器支持10000个并发连接。
2.2.3功能约束
支持STUN协议。
支持TURN协议。
2.2.4界面约束
NAT穿越服务器的启动只支持命令行方式的启动。
2.2.5开发工具约束
NAT穿越服务器使用标准的C++进行开发,使用g++进行编译。
2.3设计原则
可靠性:
NAT穿越服务器采用Heartbeat技术保证提供7x24小时可靠运行。
2.4体系构架
参见“即时通讯系统软件构架文档I.doc”和“即时通讯系统软件构架文档II.doc”。
3.模块设计
NAT穿越服务器由两个模块组成:
Server模块和Protocol模块。
Server模块实现STUN/TURN协议的服务器端逻辑。
Protocol模块实现STUN/TURN协议的消息编/解码。
图1NAT穿越服务器模块结构
3.1Protocol模块
3.1.1功能结构
Protocol模块由STUN消息类StunMessage和STUN属性类(StunAttribute及其派生类)组成。
图2Protocol模块
StunMessage实现对STUN消息类型(在枚举类型StunMessageType中定义)、事务ID和STUN属性操作以及STUN消息编/解码的方法。
StunAttribute类是所有STUN属性类的基类,实现对STUN属性类型操作的方法。
此外,StunAttribute类还定义了STUN属性编/解码的虚拟方法。
根据STUN属性的语法,Protocol模块通过StunAttribute的6个派生类分别实现不同STUN属性的编/解码。
Protocol模块实现的STUN属性语法包括:
●StunAddressAttribute类:
实现对MAPPED-ADDRESS、RESPONSE-ADDRESS、SOURCE-ADDRESS、CHANGED-ADDRESS、REFLECTED-FROM、ALTERNATE-SERVER、DESTINATION-ADDRESS及SOURCE-ADDRESS2等STUN属性的编/解码。
●StunUInt32Attribute类:
实现对CHANGE-REQUEST、LIFETIME、BANDWIDTH及OPTIONS等STUN属性的编/解码。
●StunByteStringAttribute类:
实现对USERNAME、PASSWORD、MESSAGE-INTEGRITY、MAGIC-COOKIE及DATA等STUN属性的编/解码。
●StunErrorCodeAttribute类:
实现对ERROR-CODE属性的编/解码。
●StunUInt16ListAttribute类:
实现对UNKNOWN-ATTRIBUTES属性的编/解码。
●StunTransportPrefsAttribute类:
实现对TRANSPORT-PREFERENCES属性的编/解码。
3.1.2性能
无。
3.1.3内部接口
3.1.3.1StunMessage
(1)StunMessage()
[功能简介]
构造函数。
[参数说明]
无。
[返回值]
无。
(2)~StunMessage()
[功能简介]
析构函数。
[参数说明]
无。
[返回值]
无。
(3)StunMessageTypetype()const
[功能简介]
获取STUN/TURN消息类型。
StunMessageType定义如下:
enumStunMessageType{
STUN_BINDING_REQUEST=0x0001,
STUN_BINDING_RESPONSE=0x0101,
STUN_BINDING_ERROR_RESPONSE=0x0111,
STUN_SHARED_SECRET_REQUEST=0x0002,
STUN_SHARED_SECRET_RESPONSE=0x0102,
STUN_SHARED_SECRET_ERROR_RESPONSE=0x0112,
STUN_ALLOCATE_REQUEST=0x0003,
STUN_ALLOCATE_RESPONSE=0x0103,
STUN_ALLOCATE_ERROR_RESPONSE=0x0113,
STUN_SEND_REQUEST=0x0004,
STUN_SEND_RESPONSE=0x0104,
STUN_SEND_ERROR_RESPONSE=0x0114,
STUN_DATA_INDICATION=0x0115
};
[参数说明]
无。
[返回值]
返回STUN/TURN消息类型。
(4)uint16length()const
[功能简介]
获取STUN/TURN消息长度。
[参数说明]
无。
[返回值]
返回STUN/TURN消息长度。
(5)conststd:
:
string&transaction_id()const
[功能简介]
获取STUN/TURN消息事务ID。
[参数说明]
无。
[返回值]
返回STUN/TURN消息事务ID。
(6)voidSetType(StunMessageTypetype)
[功能简介]
设置STUN/TURN消息类型。
[参数说明]
type:
STUN/TURN消息类型。
[返回值]
无。
(7)voidSetTransactionID(conststd:
:
string&str)
[功能简介]
设置STUN/TURN消息事务ID型。
[参数说明]
str:
STUN/TURN消息事务ID。
[返回值]
无。
(8)constStunAddressAttribute*GetAddress(StunAttributeTypetype)const
[功能简介]
根据STUN/TURN属性类型获取StunAddressAttribute类的属性。
[参数说明]
type:
STUN/TURN属性类型。
[返回值]
返回StunAddressAttribute类的属性对象。
(9)constStunUInt32Attribute*GetUInt32(StunAttributeTypetype)const
[功能简介]
根据STUN/TURN属性类型获取StunUInt32Attribute类的属性。
[参数说明]
type:
STUN/TURN属性类型。
[返回值]
返回StunUInt32Attribute类的属性对象。
(10)constStunByteStringAttribute*GetByteString(StunAttributeTypetype)const
[功能简介]
根据STUN/TURN属性类型获取StunByteStringAttribute类的属性。
[参数说明]
type:
STUN/TURN属性类型。
[返回值]
返回StunByteStringAttribute类的属性对象。
(11)constStunErrorCodeAttribute*GetErrorCode()const
[功能简介]
获取ERROR-CODE属性。
[参数说明]
无。
[返回值]
返回StunErrorCodeAttribute类的属性对象。
(12)constStunUInt16ListAttribute*GetUnknownAttributes()const
[功能简介]
获取UNKNOWN-ATTRIBUTES属性。
[参数说明]
无。
[返回值]
返回StunUInt16ListAttribute类的属性对象。
(13)constStunTransportPrefsAttribute*GetTransportPrefs()const
[功能简介]
获取TRANSPORT-PREFERENCES属性。
[参数说明]
无。
[返回值]
返回StunTransportPrefsAttribute类的属性对象。
(14)voidAddAttribute(StunAttribute*attr)
[功能简介]
添加STUN/TURN属性。
[参数说明]
attr:
STUN/TURN属性对象。
[返回值]
无。
(15)boolRead(ByteBuffer*buf)
[功能简介]
分析给定缓冲区中的STUN/TURN数据包,并将分析结果保存在对象中。
[参数说明]
buf:
STUN/TURN数据包。
[返回值]
成功返回true;失败返回false。
(16)voidWrite(ByteBuffer*buf)const
[功能简介]
将对象写入STUN/TURN数据包。
[参数说明]
buf:
STUN/TURN数据包。
[返回值]
成功返回true;失败返回false。
3.1.3.2StunAttribute
(1)~StunAttribute()
[功能简介]
析构函数。
[参数说明]
无。
[返回值]
无。
(2)StunAttributeTypetype()const
[功能简介]
获取STUN/TURN属性类型。
StunAttributeType定义如下:
enumStunAttributeType{
STUN_ATTR_MAPPED_ADDRESS=0x0001,//Address
STUN_ATTR_RESPONSE_ADDRESS=0x0002,//Address
STUN_ATTR_CHANGE_REQUEST=0x0003,//UInt32
STUN_ATTR_SOURCE_ADDRESS=0x0004,//Address
STUN_ATTR_CHANGED_ADDRESS=0x0005,//Address
STUN_ATTR_USERNAME=0x0006,//ByteString,multipleof4bytes
STUN_ATTR_PASSWORD=0x0007,//ByteString,multipleof4bytes
STUN_ATTR_MESSAGE_INTEGRITY=0x0008,//ByteString,20bytes
STUN_ATTR_ERROR_CODE=0x0009,//ErrorCode
STUN_ATTR_UNKNOWN_ATTRIBUTES=0x000a,//UInt16List
STUN_ATTR_REFLECTED_FROM=0x000b,//Address
STUN_ATTR_TRANSPORT_PREFERENCES=0x000c,//TransportPrefs
STUN_ATTR_LIFETIME=0x000d,//UInt32
STUN_ATTR_ALTERNATE_SERVER=0x000e,//Address
STUN_ATTR_MAGIC_COOKIE=0x000f,//ByteString,4bytes
STUN_ATTR_BANDWIDTH=0x0010,//UInt32
STUN_ATTR_DESTINATION_ADDRESS=0x0011,//Address
STUN_ATTR_SOURCE_ADDRESS2=0x0012,//Address
STUN_ATTR_DATA=0x0013,//ByteString
STUN_ATTR_OPTIONS=0x8001//UInt32
};
[参数说明]
无。
[返回值]
返回STUN/TURN属性类型。
(3)uint16length()const
[功能简介]
获取STUN/TURN属性长度。
[参数说明]
无。
[返回值]
返回STUN/TURN属性长度。
(4)virtualboolRead(ByteBuffer*buf)=0
[功能简介]
分析给定缓冲区中的STUN/TURN属性数据包,并将分析结果保存在属性对象中。
本方法是存虚方法,由派生类负责实现。
[参数说明]
buf:
STUN/TURN属性数据包。
[返回值]
成功返回true;失败返回false。
(5)virtualvoidWrite(ByteBuffer*buf)const=0
[功能简介]
将属性对象写入STUN/TURN属性数据包。
本方法是存虚方法,由派生类负责实现。
[参数说明]
buf:
STUN/TURN属性数据包。
[返回值]
成功返回true;失败返回false。
3.2Server模块
3.2.1STUN服务器
3.2.1.1功能结构
StunServer类实现STUN服务器的功能。
目前,StunServer只处理STUN协议的绑定请求(BindingRequest)。
图3STUN服务器
3.2.1.2性能
无。
3.2.1.3内部接口
3.2.1.3.1StunServer
(1)StunServer(AsyncUDPSocket*socket)
[功能简介]
创建一个StunServer,并在给定的套接口上侦听客户端的请求。
[参数说明]
socket:
侦听套接口。
[返回值]
无。
(2)~StunServer()
[功能简介]
析构函数。
[参数说明]
无。
[返回值]
无。
(3)voidOnPacket(
constchar*buf,size_tsize,constSocketAddress&remote_addr,
AsyncPacketSocket*socket)
[功能简介]
当socket接收到客户端发送的请求消息时,本方法被调用。
本方法先调用StunMessage的Read()方法对接收到的消息进行解码,然后根据消息类型进一步调用相应的消息处理函数。
[参数说明]
buf:
从socket接收的消息缓冲区;
size:
从socket接收的消息大小;
remote_addr:
发送请求消息的客户端地址;
socket:
接收请求消息的套接口。
[返回值]
无。
(4)voidOnBindingRequest(StunMessage*msg,constSocketAddress&addr)
[功能简介]
处理STUN协议的绑定请求(BindingRequest)。
[参数说明]
msg:
绑定请求消息;
addr:
发送请求消息的客户端地址;
[返回值]
无。
(5)voidSendErrorResponse(
constStunMessage&msg,constSocketAddress&addr,interror_code,
constchar*error_desc)
[功能简介]
发送STUN错误响应消息。
[参数说明]
msg:
STUN请求消息;
addr:
响应消息的目标地址;
error_code:
错误码;
error_desc:
错误描述信息。
[返回值]
无。
(6)voidSendResponse(constStunMessage&msg,constSocketAddress&addr)
[功能简介]
发送STUN响应消息。
[参数说明]
msg:
STUN响应消息;
addr:
响应消息的目标地址;
[返回值]
无。
3.2.2TURN服务器
3.2.2.1功能结构
RelayServer类实现TURN服务器的功能。
目前,RelayServer只处理TURN协议的分配请求(AllocateRequest)和发送请求(SendRequest)。
RelayServerConnection类维护TURN服务器连接的信息。
每一个RelayServerConnection对象属于且只属于一个绑定对象(RelayServerBinding类实现)。
RelayServerBinding类维护内部连接与外部连接之间的绑定关系。
图4TURN服务器
3.2.2.2性能
无。
3.2.2.3内部接口
3.2.2.3.1RelayServer
(1)RelayServer(Thread*thread)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NAT 穿越 服务器 概要 设计 文件