UDP传输包长8K和20K的传输机制有什么区别

zzj2417 2010-10-25 10:21:34
我现在碰到个很奇怪的问题,用相同速率传送数据包,一个包传20K的不会丢包,传8K却会出现丢包。。。谁能帮我解释下???
...全文
152 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
没什么,包越小,丢包机率越大。
回复
zzj2417 2010-10-25
[Quote=引用 3 楼 jackson35296 的回复:]
楼主的问题应该排查这种丢包原因:接包速度小于发包速度导致丢包。
UDP是无连接的,当接收端接收不过来时,发送端也不会降低发送速度,当发送的字节 - 接收字节 > 网卡缓冲区 时,网卡就把多余的包丢弃。在TCP协议中,当缓冲区接近满时,网卡会通知发送端降低发送速度,而UDP不会
通常是下面这种情况造成
发送端:
while()
{
SentTo()
...//其他的逻辑用时50……
[/Quote]谢谢虾哥的留言,我加Sleep调试下看看吧
回复
jackson35296 2010-10-25
楼主的问题应该排查这种丢包原因:接包速度小于发包速度导致丢包。
UDP是无连接的,当接收端接收不过来时,发送端也不会降低发送速度,当发送的字节 - 接收字节 > 网卡缓冲区 时,网卡就把多余的包丢弃。在TCP协议中,当缓冲区接近满时,网卡会通知发送端降低发送速度,而UDP不会
通常是下面这种情况造成
发送端:
while()
{
SentTo()
...//其他的逻辑用时50ms
}
接收端
while()
{
RecvFrom()
...//处理数据的逻辑用时100ms
}

由于100ms > 50ms,如果数据量较大,发送-接收>网卡缓冲区,则丢包

对于这个问题的排查,可以在发送端加sleep()进行测试,降低发送速度。如果要实现快速接收,接收的循环里不允许做费时操作,要维持一个缓冲队列,收到数据后直接扔到缓冲区,由另外一个线程从队列中取出数据再处理。总之,不要在接收线程里处理数据。

回复
jhayumu 2010-10-25
UDP 本来就会掉包,如果不想丢包,改用TCP
回复
zzj2417 2010-10-25
没有人能回答下吗?急啊
回复
zzj2417 2010-10-25
我发现UDP包小了但是发送太快(用循环发送)就会丢包,包大点用循环就没事,当然不能超过64K,大概20K左右最稳定。。主要问题还是没解决,我现在想用精确到100微秒的计时器来每次发送一个,因为循环的话执行一次的时间是1纳秒。。发送太快了,各位大侠谁给个计时器的介绍,要微秒级别的!!!
回复
herm_lib 2010-10-25
根据IP分片原理,udp包越大丢包概率越高。
回复
herm_lib 2010-10-25
发udp包,如果大于一定长度(一般512bytes)就会IP分片。
传8K, 分成16个分片,只要其中1片丢了,整个传输失败。
回复
相关推荐
发帖
网络编程
创建于2007-09-28

1.8w+

社区成员

VC/MFC 网络编程
申请成为版主
帖子事件
创建了帖子
2010-10-25 10:21
社区公告
暂无公告