我做了一个测试程序来测试UDP的速度,client这边不停地发送 nSize 大小的数据包,server阻塞地接收及统计,10秒后停止,计算出平均每秒的速度,最后的结果是当nSize=512时,速度是每秒60M左右,当nSize=1024时,速度是80M左右,当nSize=4096时,速度是每秒150M左右。
我就不明白了,不是说包不能太大吗,太大的话,下面的层就会分片,这样就变慢,怎么跟我的结果不一样啊?还要我测出来的速度正常吗?

解决方案 »

  1.   

    最好让UDP包的大小不要超过分片大小,通常1.4K字节左右比较合适。不是说包太大会使速度变慢,而是因为丢包率会影响成功接收一个完整包的概率。假设丢包率是一个固定的值,那么一个包被分片的个数越大,成功接收完整包的几率越低。在局域网的情况下看不出来(丢包率小得可以忽略),放上互联网环境马上就能看出差别。
    除了丢包率,还有另一个因素是,如果包被分片,那么小包是乱序到达的,这给传输控制带来很大的开销。
      

  2.   

    一楼说得好。话说回来,UDP是一个无连接非可靠协议,不论包设得多大或多小,你都要在自己的协议层确保包的正确顺序。
      

  3.   

    那就取包长的最大值65535-40 哈哈,反正在广域网上,MTU一般都是1500的,所以取1460,如果PPPOE就得取1452,还有个播号的是576好像
      

  4.   

    那我到底该如何测试UDP的传输速度?我只想测试在LAN中的传输速度。
      

  5.   

    首先你这样测试不行,要1.4k左右的包比较合适,还有你服务器端recv的时候,每次recv多大?你如果每次recv很小,也会慢些
      

  6.   

    在局域 网可以把包搞大一些,具体有多大,你要在你的局域 网测试一下。但是如果你想在不同的局域 网里运行的话,最好用1024吧,这样在局域 网公网都适用,不同的局域 网有的也会在大于1024分片。比如,我公司 的局域 网,大于1024就会分片。在家里两台机之间可以用8k的包。理论上来说,局域 网,100m的网,udp可以轻松达到10m.很多软件比如飞鸽,有时达到12m
      

  7.   

    取mtu的最大值试试,这个最有说服力了
      

  8.   

    udp局域网内通常不超过32K就不会分片,这也是short类型可以表示的最大数据长度,此时包越大,传输数据越快udp通讯应该尽量避免被动分片,因为到达次序原因,几乎不能重组被动分片的包,当然从实际情况看,即使在广域网,udp乱序到达的几率并不大如果是在广域网上传输,包大小最好小于1460bytes,如果考虑无线通讯则要更小,大概500字节左右,当然,此时NTA穿透也是问题
      

  9.   

    这个根据整个网络中网络节点MTU最小的决定的。你测试nSize=4096,说明你的网络节点最小的MTU值都比较大。和以前老的网络设备不是一个级别的。