作者 wenlujon | 2010-03-20 04:53 | 类型 专题分析, 互联网 |
Comments Off
Windows NetMeeting采用的是H.323协议簇,此协议簇是由ITU-T(国际电信联盟电信标准化部门)颁布。本文首先提一下H.323协议,然后点一下NetMeeting,最后分析如何做NAT ALG。
H.323协议架构
以下是H.323的整个协议架构图:
from: http://en.wikipedia.org/wiki/File:Typical_H.323_Stack.png
H.323的协议流程如下:
- 通过H.225.0 Call Signaling建立连接(如果有网守则还包括RAS,但本文不考虑),并且协商H.245需要使用的端口;
- H.245协议交互过程,协商RTCP以及RTP端口;
- RTP/RTCP协议,传输音视频数据。
Data Applications中的协议用于传输非音视频数据,比如NetMeeting使用T.120来传输聊天数据,文件共享等,由于不会产生穿越的问题,所以本文不涉及。
所以H.323的架构还是非常清晰的,两类:连接控制以及数据传输。
NetMeeting和H.323
根据NetMeeting的官方文档【2】,NetMeeting使用了以下端口:
端口 |
意义 |
TCP/389 |
Internet Locator Server |
TCP/522 |
User Location Server |
TCP/1503 |
T.120 |
TCP/1720 |
H.225.0 Call Signaling |
TCP/1731 |
Audio Call Control |
Dynamic/TCP |
H.323 Call Control |
Dynamic/UDP |
RTP |
有几点需要注意的是:
- NetMeeting使用了非H.323的协议ILS以及ULS。本文不考虑;
- NetMeeting使用T.120作为非音视频数据传输;
- 在实际的抓包中,TCP/1731并没有出现,本文不考虑;
- 没有提及H.245以及RTCP,但是这两个协议确实会出现在NetMeeting的数据流中,考虑到有提及H.323 Call Control,并且符合H.245以及RTCP的TCP动态端口特征,不妨假定此项就是H.245和RTCP的总称。
在哪个地方会携带私网信息
以下叙述中,具体包格式请参见【1】。
H.225.0 Call Signaling的私网信息
此协议的交互采用的是以下的流程:
- 客户端向服务端(TCP/1720)端口发起setup请求,此时会携带客户端的IP/PORT信息,如果客户端在外网,需要将IP修改成内网IP(不要生成NAT会话);
- 服务端回应alerting;
- 服务端回应connect,在这个报文中,服务端会告诉自己的IP以及Port,以便后续客户端能够向服务端的此端口发起H.245连接请求,如下图所示:
不过面对这个数据包,得分两种情况考虑:
- 如果说服务端是在公网,此端口就不需要进行修改,但是这个端口需要记录下来,而且要打上H.245的标记,不然后面碰到以此端口的H.245协议,NAT将不会认识;
- 但是如果服务端处于内网(静态映射),IP和端口都需要修改,并且生成会话(注意标注此会话具有H.245特征),以便客户端发起H.245请求时能够匹配到。
H.245的私网信息
H.245会使用H.225.0中协商出来的端口,然后客户端会向服务端的此端口发起连接请求。在此次数据流中,会在以下几个数据包中协商RTP/RTCP将使用的端口:
- OpenLogicalChannel
- OpenLogicalChnanelAck
- OpenLogicalChnanelReject
以下是一个示例:
在这个例子中,开放的RTP/RTCP端口是49603,不过这只是其中的一个,RTP/RTCP会使用多个端口进行数据传输,所以:
- 在一个报文中可能会告知对端多个端口;
- 会有多个报文来告知对端自己的端口。
另外,还有以下特征:
- 客户端和服务端均会告诉对端自己开放的端口;
- 只要在OpenLogicalChannel, OpenLogicalChnanelAck, OpenLogicalChnanelReject中任何报文中告知了对方自己的端口,后续的RTP/RTCP都有可能使用到这些端口。
那么,NAT此时的策略有:
- 如果服务端(这个是针对最初的H.225.0连接而言,其实在后来的RTP/RTCP中,没有严格意义上的CS概念)在外网,客户端发送的私网信息需要做ALG(读者请考虑如何判别此为H.245连接),即要把IP和端口修改成公网的(可能会存在TCP reassemble现象,需要特别慎重),并且建立会话,以便让服务端能够主动式的访问此端口;服务端发送的IP/PORT信息不需要关心。
- 如果服务端在内网,那么服务端发送的私网信息需要做ALG,同时需要把IP和端口修改成公网的,并且建立会话,以便让客户端能够主动式的访问此端口;客户端发送的IP/PORT信息不需要关心。
- 只要是OpenLogicalChannel, OpenLogicalChnanelAck, OpenLogicalChnanelReject数据中的任何一种数据包,就需要进行1或者2步骤的操作。
经过H.245的ALG之后,已经建立了RTP/RTCP的会话,之后的音视频数据便可以顺利的在这些会话中传输了。
后记
通过以上的分析,可以看到,最基本的NetMeeting通信,有两个地方可能需要做ALG:
- H.225.0 Call Signaling的setup和connect;
- H.245中的OpenLogicalChannel, OpenLogicalChnanelAck, OpenLogicalChnanelReject。
参考
- http://www.packetizer.com/ipmc/h323/standards.html “H.323 Standards”
- http://support.microsoft.com/kb/158623 “How to Establish NetMeeting Connections Through a Firewall”
|
| |
工具箱
本文链接 |
|
打印此页 | Comments Off
雁过留声