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

zzj2417 2010-10-25 10:21:34
我现在碰到个很奇怪的问题,用相同速率传送数据包,一个包传20K的不会丢包,传8K却会出现丢包。。。谁能帮我解释下???
...全文
264 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2010-10-25
  • 打赏
  • 举报
回复
没什么,包越小,丢包机率越大。
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片丢了,整个传输失败。

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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