请教高手,关于udp数据包穿越防火墙的问题 ( 积分: 200 )

  • 主题发起人 主题发起人 FreeBit
  • 开始时间 开始时间
F

FreeBit

Unregistered / Unconfirmed
GUEST, unregistred user!
网络结构如下:
Server S(验证服务器)
18.181.0.31:1234
|
|
+----------------------+----------------------+
| |
155.99.25.11(外部地址) 138.76.29.7(外部地址)
NAT A(代理服务器) NAT B(代理服务器)
192.168.0.1 (内部地址) 192.168.0.1(内部地址)
| |
| |
Client A Client B
192.168.0.2:1234 192.168.0.2:1234
Client A要通过互联网连接Client B,我的想法是通过下面的顺序建立连接
1、b上网后到Server S(验证服务器)上注册自己的ip和端口(含代理服务器);
2、a到Server S(验证服务器)上取得b的相关地址信息
3、a建立与b的连接

现在的问题是:
1、a在建立与b的连接时,需要那些地址信息
2、如何处理发送的数据包(比如在包头增加一些地址信息)
3、b在想服务器注册的时候,如何获得代理服务器外部地址,以便a建立连接
一些控件也许能够解决这个问题,但是我们的项目只能对数据包进行处理,因为含有一些加密和视频的数据。
 
网络结构如下:
Server S(验证服务器)
18.181.0.31:1234
|
|
+----------------------+----------------------+
| |
155.99.25.11(外部地址) 138.76.29.7(外部地址)
NAT A(代理服务器) NAT B(代理服务器)
192.168.0.1 (内部地址) 192.168.0.1(内部地址)
| |
| |
Client A Client B
192.168.0.2:1234 192.168.0.2:1234
Client A要通过互联网连接Client B,我的想法是通过下面的顺序建立连接
1、b上网后到Server S(验证服务器)上注册自己的ip和端口(含代理服务器);
2、a到Server S(验证服务器)上取得b的相关地址信息
3、a建立与b的连接

现在的问题是:
1、a在建立与b的连接时,需要那些地址信息
2、如何处理发送的数据包(比如在包头增加一些地址信息)
3、b在想服务器注册的时候,如何获得代理服务器外部地址,以便a建立连接
一些控件也许能够解决这个问题,但是我们的项目只能对数据包进行处理,因为含有一些加密和视频的数据。
 
这样应该可以。
让a和Server S连接,然后让b和Server S连接。在Server S上将他们的数据进行传递一些就可以了!
你说的a直接和b进行连接的方式,我没有试过。但是想着好像有错误。上面我给你说的方法我已经实现通过了,并且已经应用。
 
传递应该可以,但是实时性可能不会太好
因为我们是要做视频传输的,需要a和b建立直接连接
 
即便是实时传送,也可以使用中转的方式的呀!也就是说在Server S处接收到A的数据以后,使用B和Server S连接的套接字发送给B。反过来也是这样的。
我们使用这样方式,根本没有觉得和直接连接有什么区别,并且也比较稳定!
 
也可以啊,你采用的是udp连接吗
 
我使用的是TCP的连接,稳定。
使用UDP的话不能保证每一个数据包都可以接收到呀!
 
那恐怕不行,我们的代码都基本写完了,用的是udp传输视频和语音信息
现在要对每一个数据包进行改造。
 
获得代理服务器外部地址要由Server S来处理啊,你的意思是通过Sevr S验证两端后再来建立udp连接吧,不过代理要开通信用的端口,S端验证后返回双方IP就可以连接了。
 
那这样你想一想,如果A的程序放的不是它出去的公网上的机子怎么办?
就是说如果,A机在一个局域网内的任何一个PC上。而连接公网的机器又在另一个机子上。怎么办??你如何连接??
可是如果使用Server S作为交换的方式就不会存在这样的问题。下面的可扩展性就比较好!
并且如果没有特殊的处理,将UDP修改成TCP也不是非常的麻烦的!

Server S(验证服务器)
18.181.0.31:1234
|
|
+----------------------+----------------------+
| |
155.99.25.11(外部地址) 138.76.29.7(外部地址)
NAT A(代理服务器) NAT B(代理服务器)
| 局域网 | 局域网
192.168.0.4 192.168.0.4
| |
| |
Client A Client B
192.168.0.2:1234 192.168.0.2:1234
 
to FreeBit:
首先,传输音视频用UDP是可以的,成熟的视频会议协议大多用UDP来传音视频的。即使丢了一两个包也是无所谓的。
其次是关于你想达到的效果也是不难的,你自己已经把问题想复杂化了,现在把你问的三个问题结合起来回答一下。
你需要在Serve S上跑一个程序,它在监听一个特定的UDP端口(假定是1234)。在Client B向它注册的时候只要在发送的包里面添加一个信息,就是Client B自己的ID(在这里可能就是名称"client b",也可能是编号B,也可能是使用Client B的用户的登陆名,反正只要是能唯一区分不同Client的标志就行。假设这里用的是编号“B”)。这样,Client B向Server S的1234端口发送了包含"B"的一个注册包,并且Server S能够知道这个包的源IP和源端口。在这里,Server S看到的源IP是NAT B的地址,也就是138.76.29.7,而源端口则是NAT临时使用的一个对你来说是随机的端口,假设本次注册时NAT用的是端口2345。这是,Server S上的程序需要记下Client B来自138.76.29.7:2345,以备后用。
当Client A想要连接Client B时,先向Server S发送一个查询,询问B的IP地址。Client A将发送一个包含"B"的询问包,Server S接收到此包时,同时也得到了此询问包的源IP和源端口(于Client B的注册包类似,IP是NAT A的IP,端口是NAT A随机用的端口,假设为3456),于是Server S就将Client B的地址信息138.76.29.7:2345发回给155.99.25.11:3456。
Client A在得到Client B的地址信息后,可以直接向该地址发送数据,Client B就能接受到。并且Client B将根据接受到的数据的源IP和源端口自动获得Client A的地址信息。
到此,P2P的连接就建立了。顺便说一句,QQ就是这个工作原理。
 
打洞原理

但是在某些代理服务器可能不行,因为连上s端的senssion可能和连到别的client的不一样,导致端口不一样
 
补充一点,上面的方法有个不太好听的名字叫“打洞”,上例中138.76.29.7:2345可以理解为Client B打的洞,而155.99.25.11:3456则是Client A打的洞。隔一段时间,NAT就会把你打的洞补上,这个时间间隔取决于具体NAT的实现。一旦洞被补上,发往138.76.29.7:2345的包Client B就收不到了,所以,需要以小于NAT补洞周期的间隔重复发送注册包。
 
to zealothasu:
你说的不同的senssion导致NAT使用的端口不一样是存在的,但是通过简单的程序处理就可以解决,还是用上例:
Client A在向Server S发询问包的时候的洞是155.99.25.11:3456,而Client A在取得Client B的地址信息并向Client B发送数据的时候的洞可能已经变成了155.99.25.11:4567。但是对于Client B来说,它看见的Client A就是155.99.25.11.4567,直接跟它通讯就可以,不用去关心Client A打的另外一个洞155.99.25.11:3456
 
to LeeChange
非常感谢你详细的介绍,你说的就是我们要解决的问题。可是有一点我还是不太明白,就是关于“Clinet B 临时端口改变”处理方法的描述。
当临时端口变化时(已变为155.99.25.11:4567),Client A发过来的数据包Client B可能已经收不到了,他怎么能“看见的Client A就是155.99.25.11.4567”,而直接和Client A通讯呢?
 
呵呵,任何进程接受IP包时都能知道对方的IP和端口,而当Client B收到Client A发来的连接时,Client B得到的源地址就是155.99.25.11.4567
 
可能是我没有说清楚,这个临时的端口不是 Client B 所在局域网的代理服务器自动分配的吗?也就是 NAT B(代理服务器),如果它分配给 Client B 的临时端口被改变,Client A的数据包应该不会到达Client B 的。
 
如果分配给Client B的临时端口改变了,并且这个改变没有通知到Server S,那么Client A的数据包就不会到达Client B了。因此,只要在程序上保证Client B的临时端口不改变,或者及时通知Server S就行了。
 
这个时间间隔一般是多长时间?
 
另外,在Client A和Client B一直保持通讯的情况下,端口还是会自动分配吗?
端口重新分配的条件是什么?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
741
SUNSTONE的Delphi笔记
S
后退
顶部