【问题标题】:rawsocket sendto() some of the packet are dropped and not seen in the networkrawsocket sendto() 一些数据包被丢弃并且在网络中看不到
【发布时间】:2014-03-16 17:56:08
【问题描述】:
socketFd_ = socket(AF_INET, SOCK_RAW, protoType);    
sentBytes = sendto(socketFd_, buf, len, 0, 
                  (struct sockaddr   *)&sa,sizeof(structsockaddr_in));
protoType = GRE

我正在网络中发送 1000 个数据包。 如果我的 tx 数据包速率为 40,我可以在 Wireshark 中看到所有数据包。 但是,当我尝试以 100 的速率发送时,一些数据包(3-4)将无法到达网络,但是 sendto 没有返回任何错误。 我知道 sendto 只会将 txpacket 放入队列中,并且不会保证数据包在网络中的传递,但是我可以从那里获得丢包统计信息和内核中丢包的原因。 我尝试将接口的 txqueuelen 增加到 65000,但没有帮助。 我该如何调试这个问题?。

【问题讨论】:

  • 我尝试使用以下命令检查发送缓冲区大小:getsockopt(socketFd_, SOL_SOCKET, SO_SNDBUF, &sendBuffSize, &buffLen);它显示了一个很大的值 sendBuffSize = 124928,我观察到每当我在系统调用 sendto() 后挂起的缓冲区大小达到 2040 时,它就会丢弃数据包(sendto 在这里成功返回),我正在使用 ioctl(socketFd_ , SIOCOUTQ, &outstandingBytes);我的问题是为什么 sendto 没有返回任何错误?是因为sendBuffSize 比outstandingBytes 大吗?谁能帮我调试这个问题?谢谢
  • 在 sendto 之后再测试一个场景,如果我在再次调用 sendto 之前等待 outstatndingBytes 达到零,那么系统中不会有任何丢包

标签: c linux sockets linux-kernel raw-sockets


【解决方案1】:

你说得对,sendto 只会将 txpacket 放入队列中而不保证交付。

来自 sendto 上的 iEEE 文档:

成功完成对 sendto() 的调用并不能保证消息的传递。返回值 -1 表示仅本地检测到错误。

您必须通过 ioctl() 和 getsockopt() 执行一些您自己的限制,就像您几乎正在做的那样。我认为您不能指望网络堆栈为您完成所有工作。

类似:

sendMsgThrottled( msg Msg ) {
    ioctl(socketFd_, SIOCOUTQ, &outstandingBytes);  
    if ( outStandingBytes < limit )
          sendto(socketFd_, ..)
    else
          queueMsg();  /* Or delay */
}

我会通过让发送方和接收方在同一台机器上来测试这一点,数据包丢失可能来自操作系统的网络层之外的其他地方。

【讨论】:

  • 在每次 sendto 之后调用系统调用 ioctl 都会对性能造成影响,但是我在这里担心的是为什么当 oustandingBytes 达到 2040 时数据包会被丢弃,我该如何增加这个限制。我的发送缓冲区大小是 124928 我使用 getsockopt() SO_SNDBUF 选项得到这个值。
  • 您发送的数据包大小是多少? 40/sec 的速率是多少? ioctl() 通常不会对性能造成很大影响。
  • 数据包的大小将是 326 字节,当我以 400 个数据包/秒的速率发送时,我正在观察这个问题,从我在 150 微秒内看到的 Wireshark 中我将注入 10数据包进入网络。(一种小突发,我会调用一个 1 毫秒的计时器,它会根据速率周期性地注入数据​​包)
  • 您是否关闭了 Naggle 算法?
  • 如果我没记错的话,nagles 的算法仅适用于 tcp,对于我的情况,IP 以上的协议将是 GRE 或 UDP。
猜你喜欢
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
  • 2017-03-11
  • 2019-07-25
  • 1970-01-01
  • 2012-08-18
相关资源
最近更新 更多