udp sendto成功,tcpdump却没有抓到包

379 views
Skip to first unread message

flybirding

unread,
Sep 8, 2009, 8:27:24 AM9/8/09
to 高性能服务器研发与运营邮件列表
大家有没有遇到在使用udp套接字sendto成功,但包实际没有发送出去的情况呢?
偶今天遇到了这个诡异的现象,在服务器压力很轻的时候不会出现,重一些的时候就会有。
按道理sendto不会存在队列缓冲的现象,直接就到网卡了,不应该没到网卡啊。

刘国标

unread,
Sep 8, 2009, 8:46:51 AM9/8/09
to dev4s...@googlegroups.com

碰到过TCP socket send函数调用成功,数据却没到对方的情况。
哪位大牛解释一下原因、以及如何处理?
2009/9/8 flybirding <flybi...@gmail.com>

flybirding

unread,
Sep 8, 2009, 11:05:16 AM9/8/09
to dev4s...@googlegroups.com
tcp出现这种情况,很正常。
 
2009/9/8 刘国标 <liugu...@gmail.com>

刘国标

unread,
Sep 9, 2009, 4:30:38 AM9/9/09
to dev4s...@googlegroups.com
该文不通。
阻塞模式。
假定n=send(10MB),按该文意思,通常应返回n=10M-缓冲区。实际不是这样。

2009/9/8 flybirding <flybi...@gmail.com>

sunway

unread,
Sep 9, 2009, 5:34:44 AM9/9/09
to 高性能服务器研发与运营邮件列表
UDP出这种情况很正常,压力大的情况下,会被协议栈直接丢掉。

stefan

unread,
Sep 13, 2009, 5:24:00 AM9/13/09
to 高性能服务器研发与运营邮件列表
sendto确实在udp层没有发送缓冲区,而tcp是存在一个发送缓冲区的,而这个就是保证tcp是可靠传输,而udp是不可靠传输的关键。
当数据通过ip层传给数据链路层的时候,如果数据链路层的输出队列满了,则数据将会被丢弃(此时无论tcp还是udp还是其他的协议),区别在于tcp
会得到这个消息并重传数据包(前面说过,tcp有发送缓冲区),而udp则可能不会得到这个信息,这个跟实现相关。
所以sendto成功,网卡上也不一定会有数据,因为在这之前就被丢弃了。

On 9月8日, 下午8时27分, flybirding <flybird...@gmail.com> wrote:

flybirding

unread,
Sep 13, 2009, 10:03:09 AM9/13/09
to dev4s...@googlegroups.com

stefan说的有道理。
 
有没有方法知道数据链路层丢包了呢?

sunway

unread,
Sep 14, 2009, 4:49:11 AM9/14/09
to 高性能服务器研发与运营邮件列表
每个包都需要对方收到后回ACK给你。

On 9月13日, 下午10时03分, flybirding <flybird...@gmail.com> wrote:
> stefan说的有道理。
>
> 有没有方法知道数据链路层丢包了呢?

刘国标

unread,
Sep 14, 2009, 6:32:30 AM9/14/09
to dev4s...@googlegroups.com
愿闻其详。UDP没有发送缓冲区?没有哪一层(UDP,IP?)的缓冲区?

2009/9/13 stefan <pengl...@gmail.com>

重构生活

unread,
Sep 14, 2009, 7:08:09 AM9/14/09
to 高性能服务器研发与运营邮件列表
一个简单的做法,估计下你每10m或者100ms网卡能发送的udp包的数量,然后适当的sleep下。我自己这么做的话,一般的PC的千兆网卡,做
600M数据流进,600M数据流出的转发,能够保证丢包率在百万分之一。不这么做的话,碰上数据流突发的时候,就丢包很多很多,万分之一的丢包率都保
证不了。

当然这方法比较土,上不了台面。

On 9月8日, 下午8时27分, flybirding <flybird...@gmail.com> wrote:

钟磊

unread,
Sep 14, 2009, 10:53:13 AM9/14/09
to dev4server
同问,
貌似TCP作为可靠传输的条件不是发送缓冲区的问题,应该是TCP的重传、确认、连接保持、流量控制这些
 
 
2009-09-14

钟磊

发件人: 刘国标
发送时间: 2009-09-14  18:32:56
收件人: dev4server
抄送:
主题: Re: udp sendto成功,tcpdump却没有抓到包

peng li

unread,
Sep 14, 2009, 11:09:58 AM9/14/09
to dev4s...@googlegroups.com
感觉stefan说得是有道理的,分片不会导致丢包的。Tcpdump也可以抓到分片的包。所以原因肯定出现在应用层->网络层->数据链路层,对于UDP而言,应用层到网络层中是没有发送缓冲区队列这一说法的。那么比较有可能是在数据链路层这一块丢了包。

2009/9/8 flybirding <flybi...@gmail.com>

刘国标

unread,
Sep 14, 2009, 12:14:22 PM9/14/09
to dev4s...@googlegroups.com
---------------------------------------------------HUB  or switch
'                   '                '               
'                   '                ' 
'                   '                '
发送机器 接收机器 抓包机器

2009/9/14 peng li <keju...@gmail.com>

stefan

unread,
Sep 15, 2009, 6:46:57 AM9/15/09
to 高性能服务器研发与运营邮件列表

tcp的重传是以发送缓冲区为基础的,没有缓冲区拿什么东西重传呢,你的write可已经是返回了的。。。

On 9月14日, 下午10时53分, "钟磊" <nivana...@163.com> wrote:
> 同问,
> 貌似TCP作为可靠传输的条件不是发送缓冲区的问题,应该是TCP的重传、确认、连接保持、流量控制这些
>
> 2009-09-14
>
> 钟磊

>
> 发件人: 刘国标
> 发送时间: 2009-09-14 18:32:56
> 收件人: dev4server
> 抄送:
> 主题: Re: udp sendto成功,tcpdump却没有抓到包
>
> 愿闻其详。UDP没有发送缓冲区?没有哪一层(UDP,IP?)的缓冲区?
>
> 2009/9/13 stefan <pengli.h...@gmail.com>
Reply all
Reply to author
Forward
0 new messages