关于P2P穿越NAT中心跳包的问题:
维持Nat本次会话所分配的端口不变,NAT后的主机需要定时向NAT发送保持映射的UDP消息,保证NAT为相应主机分配的UDP端口不被收回.问题:
1.NAT后的主机发送的心跳包的目的地址和端口?
2.发送的频率?多久发一个?一些帖子里说是60秒,30秒,10秒都可以,
要不要启动一个线程来专门负责发送心跳包,发送一个包后sleep一段时间?
有没有示例的代码?
《P2P之UDP穿透NAT的原理与实现(附源代码)》中好象是没有心跳包的吧,3.在一份资料中看到,如果NAT为client A为分配的端口是2500,NAT的IP是133.23.23.52,
那么client A要向(133.23.23.52:2500)发心跳包,这个包到达NAT后又被转回client A自己,
client A收到后将它忽略,是这样的吗?那如果是
Server
  |
NAT 2
  |
NAT 1
  |
client A
这种情况,clientA的心跳包是发给谁呢?应该是发给NAT 2吧?请大家多多指教,谢谢!

解决方案 »

  1.   

    时间:1分钟足够了,太短也没用,NAT绝不会1分钟就把端口回收的。
      

  2.   

    Server
      |
    NAT 2
      |
    NAT 1
      |
    client A第一次与NAT请求端口的时候,已经作好这些映射了,server直连NAT2,包头填目的ip为NAT1,发心跳的时候,直接给NAT2就OK。
      

  3.   

    1 即"打洞"数据包的地址和端口2 QQ2003是1分钟一次3 为什么要想NAT发送心跳包呢?
      直接向你想通信的对方发送就可以了,这样的数据包在通过NAT时,NAT会自动延长Session的时间
      

  4.   

    To:shootingstars(有容乃大,无欲则刚) 
    3 为什么要想NAT发送心跳包呢?
      直接向你想通信的对方发送就可以了,这样的数据包在通过NAT时,NAT会自动延长Session的时间
    但是,并不是每时每刻都有数据要传输,要是不发心跳包的话,停止传输数据一段时间后,端口绑定或者相应的洞就消失了,对方再发数据给你,你就收不到了,是这样的吧?---
    我做过实验,如最简单的情形client->NAT->server,
    [state1]
    client通过UDP与server联系,起初双方可以双向通信,
    若不发心跳包,过了几分钟之后,若server向client发,
    则server的recvfrom函数调用将会出错:10054(远程主机强迫关闭了一个现有的连接。),
    client收不到server发来的数据.[state2]
    此时,client再向server发,server是能收到的(因为消息是从NAT内往外发),
    我特意在server查看了源消息的(ip:端口),发现[state2]的和[state1]的一样,
    说明NAT在[state2]使用了原先的端口绑定(比如10.0.0.2:1020<->210.45.110.52:1235),既然端口绑定没变,为什么[state1]中,server在一段时间以后向client发就不行了呢?
    是不是NAT上对应server的洞已经消失了?
    那么端口绑定和"洞"是什么关系呢?为什么"洞"消失了而端口绑定没变呢?还有一个问题就是:我试了,要是client的心跳包发往(210.45.110.52:1235),则会它的recvfrom调用将会报错:10054,(曾经在一些地方看到说client自己会收到这一心跳包,与实验结果不符),若心跳包发往server,则一切OK.请各位指点指点,解释解释上述情况,谢谢!
      

  5.   


    建议不要再使用这种原始的打洞方式
    P2P中的打洞问题,早已经随着支持UPNP技术的GATEWAY ROUTER的广泛使用而解决掉了
    WIN XP支持UPNP技术穿透,没有必要再去走老路
    应该采用UPNP技术来打洞,XML请求格式和返回格式,
    原来的那种已经落后了。