环境:
         udp协议/大文件传输/
   问题:
         采用时钟来控制超时重发, 感觉效果不理想, 不能根据网络的状况来动态的调整重发的时间!
     求:
         1. 怎么测试当前网络的状况(延时长短)?<最好有算法描述!丷哈>         2. 一般使用udp协议传数据采用什么样的"重发机制"效果比较好?!
           
         3. 大家讨论"p2p Nat穿越"的时候, 总谈到"cone nat"不能穿透, 那么有没有办法识别nat的类型? 若有,怎么识别?

解决方案 »

  1.   

    发送数据包时计算当前发送速度(发送字节数/所用时间),如果速度低于设定阀值,停止发送,隔一段时间再继续发送,重复此发送过程。就像windows资源浏览器打开一个ftp站点拷贝文件就是动态计算速度,得出剩下时间。
      

  2.   

    http://community.csdn.net/Expert/topic/4297/4297692.xml?temp=.9950373
      

  3.   

    TCP的重发机制我看过了,算法有点复杂,有没有人有类似的简单点的算法啊!!!
      

  4.   

    超时时间可以动态调整的, 这也是TCP实现中的一种标准算法. 大致做法是:
    系统中有一个最小超时时间min 和一个最大超时时间max.
     如果当前当前初始化超时时间为n, 如果在发送数据后<n内收到确认, 则对n减小固定步长值m, n=n-m , 并且判断n不能够小于min.  如果n内没有收到确认, 则 n=n+m, 但是要判断n不能大于MAX. 就这样,可以根据网络动态变化情况实现动态调整超时间.
      

  5.   

    1. 怎么测试当前网络的状况(延时长短)?<最好有算法描述!丷哈>
    ==>取上一次数据发送接收的往返RTT作为参考时间,本次波动时间RT_WAVE(取常量,属经验值,视),则本次网络延时预测为 RT_NOW = a*RTT+(1-a)RT_WAVE  [a,RT_WAVE为经验值,取常量,0<=a<=1]若超时则采用快速递减,若未超时则慢启动(步增一个段),具体方案见 flashboy(爱写程序的小绵羊)的发言2. 一般使用udp协议传数据采用什么样的"重发机制"效果比较好?!
    ==>普通是滑动窗口,但其效率不算太高,理解了这个机制,可以在其基础上写自己的选择重传协议
    3. 大家讨论"p2p Nat穿越"的时候, 总谈到"cone nat"不能穿透, 那么有没有办法识别nat的类型? 若有,怎么识别?
    cone nat 容易穿透的
    symmetric NAT很困难,能否穿透看你运气如何啦
    如何区分cone,symmetric等NAT类型,你须要看cone,symmetric具体表示什么,明白后是很容易写出检测程序的,建议参考一下 shootingstars那个贴子大约是这样(实际情况比这复杂):
    假如内网一台终端c对于外部节点M,N
    M发现c的映射地址为a1:p1
    N发现c的映射地址为a2:p2
    若a1=a2,p1=p2,则你的NAT为cone型;本型具体还可分IP受限,与Port受限
    若p1!=p2(或者a1~=a2)则你的NAT为symmetric型
    最完整的测试大约最少需要9个轮回发送接收解析
    你需要准备两个外网(相对于内网来说)地址,即M,N
      

  6.   

    谢谢各位了, 经过大家的指点,我看了TCP/IP协议的重发机制, 终于搞出来一个比较晚上的解决方案,呵呵!!