比如通讯双方都在NAT后面,协调打洞的服务器在公网里!服务器告诉A端打洞(IP,Port),于是A就往那里发UDP报文,这时候报文在经过NAT的时候会有转换(内网IP转换成外网IP,内部端口会转换成路由端口,然后把这些转换记录进路由表里)数据就发出去了,这样A端NAT就有个洞了!
但是服务器再告诉B端坐同样的事的时候B肯定是要往A端的路由端口发送的吧?那么哪呢他是怎么知道A端路由口是多少的?
但是服务器再告诉B端坐同样的事的时候B肯定是要往A端的路由端口发送的吧?那么哪呢他是怎么知道A端路由口是多少的?
解决方案 »
- win32编程 ,有关进度条显示问题
- 请问我将一个dll工程中的对话框中添加控件,然后为控件关联变量,但是为什么编译的时候,会出现error C2065: 'IDC_ZHLX_COMBO' : undeclared identifier
- 菜单的问题
- 一个 EDITBOX 的问题
- 怎样操作网络接受的错误处理?
- vc的高手救命阿!!请问有什么工具能快速删掉asp程序或vb程序或存储过程的注释
- 我想在tab control上画图,可是刚开始的时候tab control把图盖住拉。非要重画一篇才可以。
- oxc000005:读取位置0x80c20014时发生访问冲突
- C++中DLL回调函数的问题
- 请问spy++的主要功能有那些
- 谁能告诉我JSONCPP在 VC6.0怎么用啊。
- 通讯录的问题
2、 A和B分别与S的【主连接】保持联系。
3、 当A需要和B建立直接的TCP连接时,首先连接S的【协助打洞】端口,并发送协助连接申请。同时在该端口号上启动侦听。注意由于要在相同的网络终端上绑定到不同的套接字上,所以必须为这些套接字设置 SO_REUSEADDR 属性(即允许重用),否则侦听会失败。
4、 S的【协助打洞】连接收到A的申请后通过【主连接】通知B,并将A经过NAT-A转换后的公网IP地址和端口等信息告诉B。
5、 B收到S的连接通知后首先与S的【协助打洞】端口连接,随便发送一些数据后立即断开,这样做的目的是让S能知道B经过NAT-B转换后的公网IP和端口号。
6、 B尝试与A的经过NAT-A转换后的公网IP地址和端口进行connect,根据不同的路由器会有不同的结果,有些路由器在这个操作就能建立连接,大多数路由器对于不请自到的SYN请求包直接丢弃而导致connect失败,但NAT-A会纪录此次连接的源地址和端口号,为接下来真正的连接做好了准备,这就是所谓的打洞,即B向A打了一个洞,下次A就能直接连接到B刚才使用的端口号了。
7、 客户端B打洞的同时在相同的端口上启动侦听。B在一切准备就绪以后通过与S的【主连接】回复消息“我已经准备好”,S在收到以后将B经过NAT-B转换后的公网IP和端口号告诉给A。
8、 A收到S回复的B的公网IP和端口号等信息以后,开始连接到B公网IP和端口号,由于在步骤6中B曾经尝试连接过A的公网IP地址和端口,NAT-A纪录了此次连接的信息,所以当A主动连接B时,NAT-B会认为是合法的SYN数据,并允许通过,从而直接的TCP连接建立起来了。
等B-->A 才能成功,因为A的nat已经保存了一份A-->B的记录
NAT只能允许从内往外发,不允许无限制的从外往内发
http://topic.csdn.net/u/20080725/00/da21424c-c366-4ca8-bca7-5b4c9e8c98e8.html