我用INDY的UPD控件做的测试。
现在的问题是这样的:
我在同一个NAT里开两个客户端,IP分别是c1=192.168.0.2、c2=192.168.0.3。端口都是7000,
然后一起连接一个服务器。服务器的IP是s=201.0.0.1,端口是8000,
在服务器中出现两个客户端的NAT后的IP及PORT,
它们分别是(201.0.0.2:7000, 201.0.0.2:1024),
然后再在别外服务器中开一个客户端,IP及PORT为c3=201.0.0.3:7000。这时候,两个客户端都从服务器中得到彼此的NAT后的IP及PORT。
连接图如下: s (201.0.0.1:8000)-------c3 (201.0.0.3:7000)
|
|
nat (201.0.0.2)
|
|
-------------------------
| |
| |
c1 (192.168.0.2:7000) c2 (192.168.0.3:7000)当我用c1向C3发信息时,可以双向发送。
当我用C2向C3发信息时,只能C2向C3发送信息,C3不能向C2发信息,经过查看,发现C2连接c3时的PORT发生了变化,变成了1077了,与S里记录的1024不一样了。这是为什么呀????如果我在同一个NAT里的C1,C2的本地端口改成不一样的,即c1为7000,而C2为7001,那么就可以成功发送了。
xixuemao() 偶就是不会C,看了C就头痛呀。
难道楼主的NAT不是锥形的?
一般情况下,用win2000server做nat的话是锥形nat。
关于nat的类型,楼主看看这个
http://www.zahui.com/html/14/36352.htm
可是我在NAT里的第一台机器去是用提交给服务器的端口去接收最终客户通讯的呀。而且这个最终客户不止一台,几乎是所有的客户呀。
而在NAT里的第二台机器去开始变端口的呀。
我看那个iptables的资料,跟里面的情况有点相似呀。
|
|
nat1 (201.0.0.2)
|
|
-------------------------
| |
| |
c1 (192.168.0.2:7000) c2 (192.168.0.3:7000)要想C1和C3,或者C2和C3能够正常通讯,需要nat1和nat2相互信任,使它们相互信任的方法就是各自在自己的nat上“打个洞”。大致过程如下:
1. C1:7000向s:8000发送一个UDP包。这会使nat1创建一个session,端口号假设为A。
2. C3:7000向s:8000发送一个UDP包。这会使nat2创建一个session,端口号假设为B。
3. s向nat1:A发送UDP包,这个包会被传送给C1:7000,包内容为nat2的地址和端口号B。
4. s向nat2:B发送UDP包,这个包会被传送给C3:7000,包内容为nat1的地址和端口号A。
5. C1:7000向nat2:8000发送一个UDP包,这个包会被nat2丢弃,但是却会使nat1信任由nat2发送来的UDP包了。此后,C3:7000向nat1:A发送的数据就会被传送给C1:7000。
6. C3:7000向nat1:8000发送一个UDP包,这个包会被nat1丢弃,但是却会使nat2信任由nat1发送来的UDP包了。此后,C1:7000向nat2:B发送的数据就会被传送给C3:7000。说到这里,如果此时C2:7000向nat2:B发送一个UDP包,则这个数据包会被传送给C3:7000,但是C3:7000发送给nat1:A的UDP包只会被nat1转发给C1:7000。因此,如果C2也想和C3双向通讯,C3需要用另外一个端口(比如7001)重复以上建立信任的过程。否则,就会出现楼主所遇到的情况了。
只有Cone NAT才会使得以上步骤中的5和6及以后的通讯正常进行,如果是Symmetric NAT,则在第5步中,nat1会另外创建一个session(端口号假设为C)用来与nat2建立通讯,结果,后面的通讯就全对不上号了。
我的图画的是对,是你理解错了。
我现在也找到解决方法了。
我的就根IPTABLES差不多的。而且,如果是你CISCO一类的路由器共享上网的话,好象都符合IPTABLES类型的。