Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux sendto()数据包被内核丢弃_Linux_Sockets_Networking_Linux Kernel_Sendto - Fatal编程技术网

Linux sendto()数据包被内核丢弃

Linux sendto()数据包被内核丢弃,linux,sockets,networking,linux-kernel,sendto,Linux,Sockets,Networking,Linux Kernel,Sendto,我正在使用这两个api调试程序中的数据包丢弃。 观察: sendto将始终返回数据包大小,因此调用sendto总是成功的 当OutstandingBytes达到2040时,数据包将被linux内核丢弃,这意味着我无法在wireshark中看到它所包含的数据包。我正在本地eth接口上捕获数据包 我的sendBuffSize是由getsockopt返回的124928 我发送的数据包大小大约为300到350字节。我有两个套接字,一个用于发送GRE数据包的原始套接字和另一个udp套接字,我看到两种协议的

我正在使用这两个api调试程序中的数据包丢弃。
观察:

  • sendto
    将始终返回数据包大小,因此调用
    sendto
    总是成功的
  • OutstandingBytes达到2040时,数据包将被linux内核丢弃,这意味着我无法在wireshark中看到它所包含的数据包。我正在本地eth接口上捕获数据包
  • 我的sendBuffSize是由
    getsockopt
    返回的124928
  • 我发送的数据包大小大约为300到350字节。我有两个套接字,一个用于发送GRE数据包的原始套接字和另一个udp套接字,我看到两种协议的数据包都会丢失,两个套接字都处于非阻塞模式。
    是否
    sendto
    无法检测到错误,因为数据包在达到sendBuffSize限制之前被丢弃?
    如何在我的系统中增加2040的限制。此值应为124928,由
    getsockopt()
    api返回。
    对于这个问题,我有类似的线程,如下所示,但我无法得到答案,因此决定开始一个新线程。

  • UDP和原始套接字不提供任何方法来检测丢弃的数据包。由于路由器故障或网络拥塞,数据包可能在网络中丢失,也可能在内核中被丢弃。如果需要检测丢失的数据包,则必须在应用程序层进行检测,或者在UDP上实现会话层


    如果在调用
    sendto()
    时内核无法缓冲数据包,它应该返回
    -1
    并将
    errno
    设置为
    ewoolblock

    我的程序中有重传逻辑,但我要寻找的根本原因是,sendto没有返回任何错误,linux内核在达到发送缓冲区大小限制之前就丢弃了数据包。然而,“UDP不提供丢弃数据包的检测”和“网络堆栈将以完全合理的速率丢弃数据包”之间有很大的区别。2040字节在单个UDP图允许的大小范围内,并且小于2个以太网帧(或1个巨型帧)。虽然您显然无法保证数据包会到达电缆的另一端,但您应该能够非常明确地预期数据包至少会到达网卡(即使它们是10个较小的数据包)。我怀疑他所说的当他只排队2040字节时数据包会被丢弃的说法。我确信,高性能DNS服务器正在以高速率发送的字节数是这个数字的许多倍。“2040字节在单个UDP图表允许的大小范围内”——请提供参考。我确实在产品中使用的UDP之上编写了一个可靠的数据报协议。我还记得UDP数据包最大大小的不确定性。无论如何,为了安全起见,我将它保持在640字节以下,并且从来没有任何问题。好吧,除了一个网络驱动程序有一个“腐烂的数据包”问题,我必须修补。请参阅RFC 768。UDP长度字段为16位,允许数据报最多64K字节(包括8字节报头)。如此大的数据报需要IP碎片和重新组装,因此不建议这样做。但是NFS传统上发送8K数据报。
    ioctl(socketFd_, SIOCOUTQ, &outstandingBytes);  
    getsockopt(socketFd_, SOL_SOCKET, SO_SNDBUF, &sendBuffSize, &buffLen);