有关网络类型的疑问

iverson1982 2007-06-19 04:27:28
最近在做一个p2p小程序的过程中,找到一些测试网络类型的资料,但按照文章中的方法觉的自己公司所在的网络情况很是特别.
一般除了在公网上,nat分为full cone,restricted,port restricted,symmetric这几种,按照资料里的方法测试公司的nat是fc的,也就是其它客户端只要知道处于我这个nat之后的某个客户端映射的公网ip和port,向这个ip和port发送信息,我就能收到.但奇怪的是,cone nat本地端口不变的情况下,在nat上映射的端口也是不变的,与其它客户端通信的时候都是用在nat上映射的这个端口的,而在我这的nat之后的客户端与服务器不同port之间的通信时在nat上映射的port也不一样,这是s nat的特性,但s nat会丢弃来自陌生ip和port的信息,而我这儿则会接收,并且在有信息传到我与服务器建立连接时在nat上映射的端口后,我与服务器之间的连接会在nat上映射新的端口,这是从我每隔30秒发给服务器的心跳包上看出来的.请问我这儿的nat是一个什么类型的了?
我测试用的是indy里的udpclient和server那组控件.
...全文
254 18 打赏 收藏 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
constantine 2007-06-20
  • 打赏
  • 举报
回复
第二个测试里面如果都是用同一个socket发的应该一样才对。
udp是无链接,所有没有 “ip1,port1的连接没有断”的说法。
可以的话帖出你测试通信的代码
iverson1982 2007-06-20
  • 打赏
  • 举报
回复
你说的同时做是指第二个测试和第一个测试同时做,还是第二个测试中向不同ip,port发信息是同时的吗?
在第二个测试里,我是先往ip1,port1发信息,这时nat映射的端口是ys_port1,然后我往ip2,port2发信息(ip2,port2和ip1,port1不完全一样),这时nat映射的端口是ys_port2(肯定和ys_port1不同),但此时与ip1,port1的连接没有断,如果再向ip1,port1发信息,用的还是先前映射的端口ys_port1.
至于第二个测试和第一个测试是不是同时,有影响吗?即使我做完第一个测试,得出full cone nat的结论后,立即做第二个测试,得到的结果还是映射的端口不同.
constantine 2007-06-20
  • 打赏
  • 举报
回复
但我做另一个测试,用相同的内网ip,port向服务器相同ip,不同port,或者其它不同ip,port发送信息,每次由nat映射的port都不一样
--------------------
做这个又是否同时做的呢?
如果不是我觉得应该无效。
iverson1982 2007-06-20
  • 打赏
  • 举报
回复
我用的是2个indy的udpserver,第一个绑定ip1,port1,第二个绑定ip2,port2,服务器是本身就有两个公网ip的.绑定ip1,port1的udpserver收到更改ip,port的信息后,获得了客户端的公网ip和port,然后改用绑定ip2,port2的udpserver向客户端发信息.

另:xpdavis发的帖子我只能搜到散分的帖子....感觉csdn现在的搜索到的帖子都是很新的,以前的帖子好像搜不到?
constantine 2007-06-20
  • 打赏
  • 举报
回复
向服务器(ip1,port1)发信息请求服务器用(ip2,port2)回信息
------------
你是如何做到的
constantine 2007-06-20
  • 打赏
  • 举报
回复
http://www.huij.net/html/Borland_jishushequ/C___Builder/20061020/23950_6.html

有代码,之前xpdavis在论坛发过,不过我无法在csdn查找东西,一查ie就死掉,你可以找找他的原帖
iverson1982 2007-06-20
  • 打赏
  • 举报
回复
constantine(飘遥的安吉儿):
你的文章和我做检测依据的资料讲的是一样的.
我的问题是,我做了第一步检测,由服务器返回的我的公网ip和我绑定的内网ip不一样,这说明我是在一个nat后;然后做第二步检测,向服务器(ip1,port1)发信息请求服务器用(ip2,port2)回信息,我收到了,根据资料上讲,由此可以确定nat类型为FULL CONE,检测终止了.
但我做另一个测试,用相同的内网ip,port向服务器相同ip,不同port,或者其它不同ip,port发送信息,每次由nat映射的port都不一样,而CONE NAT是应该一样的,Symmetric NAT才是不一样的,这是为什么?
constantine 2007-06-20
  • 打赏
  • 举报
回复
http://www.cnblogs.com/showna/articles/651725.html
constantine 2007-06-20
  • 打赏
  • 举报
回复
恩,client其实我不熟悉,我从来不用他
iverson1982 2007-06-20
  • 打赏
  • 举报
回复
绑定的是本地的ip,我修改的只是发送的目的ip,控件的属性是叫host,程序里也是host,只是我讲的时候习惯把它说成ip......

不过我用这两个控件确实感觉都差不多,而且随意用两个client控件或server控件都能通信,我先都用server试试!
constantine 2007-06-20
  • 打赏
  • 举报
回复
第二次的测试应该错误了
既然绑定你又如何在中间修改ip,port,再说,控件也没有IP这个属性,而是host
要测试你可以考虑用一个idudpserver做的你client,实际上udp是无链接,没有什么s/c之分,这样封装是为了方便。但是实际上做p2p的时候不会用client这个控件,因为server的发送函数都可以直接指定ip,port,所以很容易发,你就用他给你的2个server1,server2发送,让他们都给你回ip,port看看就知道了。也没有必要绑定。
iverson1982 2007-06-20
  • 打赏
  • 举报
回复
IdUDPClient1->Active=false;
IdUDPClient1->Binding->IP=t_local_ip;
IdUDPClient1->Binding->Port=t_local_port;
IdUDPClient1->Binding->Bind();
IdUDPClient1->Active=true;
在之前就绑定过了.测试过程中没有改动.
iverson1982 2007-06-20
  • 打赏
  • 举报
回复
恩,我的说法不对.我想表达的意思是当向ip1,port1发信息,nat映射了一个端口ys_port1,如果一段时间内不再向ip1,port1发信息后,内网ip和port到映射的ip和ys_port1这个映射会断掉.但如果向ip2,port2发信息后再向ip1,port1发信息和上次向ip1,port1发信息之间的间隔较短的话,nat不会重新映射一个新的端口,而使用刚才映射的ys_port1.
//客户端部分测试代码
//测试1
IdUDPClient1->Host=ip1;
IdUDPClient1->Port=port1;
IdUDPClient1->Send("CHANGE_REQUEST"); //发送寻求映射的公网ip和port的命令
for(int i=0;i<10;i++)
{ if(result_test1=="") //接收到信息后存在result_test1中
::Sleep(1000);
else
break;
Application->ProcessMessages();
}
if(result_test1=="")
{ ShowMessage("网络不支持UDP!");
return;
}

//测试2
IdUDPClient1->Host=ip1;
IdUDPClient1->Port=port1;
IdUDPClient1->Send("CHANGE_IP_PORT"); //发送变更ip和port的请求
for(int i=0;i<10;i++)
{ if(result_test2=="")
::Sleep(1000);
else
break;
Application->ProcessMessages();
}
if(result_test1.SubString(1,result_test1.AnsiPos(":")-1)==t_local_ip&&
result_test2!="") //t_local_ip是绑定的内网ip
{ nat_type="p"; //内网ip和测试1得到的公网ip一样,计算机在公网上
return;
}
if(result_test1.SubString(1,result_test1.AnsiPos(":")-1)==t_local_ip&&
result_test2=="")
{ nat_type="p";
ShowMessage("外部请求被防火墙拒绝!");
return;
}
if(result_test1.SubString(1,result_test1.AnsiPos(":")-1)!=t_local_ip&&
result_test2=="RE_CHANGE_IP_PORT")
{ nat_type="fc"; //我检测的程序到这儿就返回nat类型为fc了
return;
}
......
//服务器端接收到命令后的处理
void __fastcall TForm1::Server1_port1UDPRead(TObject *Sender,
TStream *AData, TIdSocketHandle *ABinding)
{
TStringList *temp_list = new TStringList();
TStringList *send_message = new TStringList();
temp_list->LoadFromStream(AData);
//网络类型测试test1
if(temp_list->Strings[0]=="CHANGE_REQUEST")
{ //用绑定ip1,port1的udpserver回消息
Server1_port1->Send(ABinding->PeerIP,ABinding->PeerPort,
ABinding->PeerIP+":"+AnsiString(ABinding->PeerPort));
}
//网络类型测试test2
else if(temp_list->Strings[0]=="CHANGE_IP_PORT")
{ //用绑定ip2,port2的udpserver回消息
Server2_port2->Send(ABinding->PeerIP,ABinding->PeerPort,
"RE_CHANGE_IP_PORT");
}
......
}
至于第二个测试,我是手动测的,就是改变IdUDPClient1->IP或IdUDPClient1->Port,发送
IdUDPClient1->Send("CHANGE_REQUEST");获取本机公网ip和port,得到的结果port不一样. 当然在较短的时间间隔里往相同的ip,port上发信息得到的结果是一样的.
iverson1982 2007-06-19
  • 打赏
  • 举报
回复
晕,谁来回答我的问题啊......
i_love_pc 2007-06-19
  • 打赏
  • 举报
回复
谢谢!
iverson1982 2007-06-19
  • 打赏
  • 举报
回复
NAT的全称是Network Address Translation,可翻译为网络地址转换或者网络地址翻译--书上的......P2P要做到端对端的连接,必须穿越NAT......
i_love_pc 2007-06-19
  • 打赏
  • 举报
回复
不明白nat是什么意思!
iverson1982 2007-06-19
  • 打赏
  • 举报
回复
还有如果是多层的nat,那nat的类型也应该是所有nat中限制级别最高的nat类型.写的有些乱,不知道大家能看的懂不......

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧