【问题标题】:SO_DEBUG and SO_DONTROUTE in traceroutetraceroute 中的 SO_DEBUG 和 SO_DONTROUTE
【发布时间】:2016-06-22 21:18:14
【问题描述】:

谁能解释 SO_DEBUG 和 SO_DONTROUTE 之间的区别。这是我的理解

SO_DONTROUTE

            Enable / disable routing bypass for outgoing message

            Routing takes place only when it goes to out of subnet.

            This tell that do not route, directly connect to the destination instead of routing

            SO_DONTROUTE refers to the local routing

            But default it is zero

            Do not route send directly to the connected network

            If the host is not on a directly-attached network
    an error is returned.  This option can be used to ping
    a local host through an interface that has no route.

SO_DEBUG

            When enabled, the kernel keeps track of detailed
    information about the packets sent and received by TCP for the socket

但是在 traceroute 中,如果我在命令行中给出 -d 选项,那么 SO_DONTROUTE 选项也会被启用。此外,当我启用 -r 选项时,-d 也启用了 .我可以知道为什么吗?

【问题讨论】:

  • 你用的是什么版本的traceroute?
  • van jacobson 编写的第一版 traceroute
  • 你是如何确定-d开启了SO_DONTROUTE
  • 我已经使用 strace 命令检查了哪些选项都已启用
  • 这很奇怪。我看不出这两个标志之间有任何合理的关系,并且 van jacobson 的 traceroute 的来源是有意义的 - -r 导致 SO_DONTROUTE 被设置为 -d 设置为 SO_DEBUG。也许来源来自不同的版本。无论如何,这听起来像是一个错误,而不是一个功能。我的 Ubuntu 14.04 服务器上的(默认)traceroute 没有这样做。

标签: sockets network-programming traceroute


【解决方案1】:

我没有看到这两个标志之间有任何明确的关系,所以这(可能)是一些特定于实现的行为,甚至可能是一个错误。

我已经在安装了默认跟踪路由的 Ubuntu 14.04 机器上运行 traceroute -d 8.8.8.8 - Modern traceroute for Linux, version 2.0.20, Aug 19 2014 并成功地达到了 8.8.8.8。使用-r 标志,由于机器找不到8.8.8.8,因此traceroute 失败并显示Network is unreachable 错误消息。

查看traceroute -rtraceroute -dstrace 我还验证了一个调用 setsockopt(3, SOL_SOCKET, SO_DONTROUTE, [1], 4),而另一个调用 setsockopt(3, SOL_SOCKET, SO_DEBUG, [1], 4).

来自official (?) 的 Van Jacobson 跟踪路由的源应该以相同的方式运行。这是(一段)解析命令行开关的代码:

case 'r':
    options |= SO_DONTROUTE;
    break;

case 'd':
    options |= SO_DEBUG;
    break;

这里是套接字选项:

if (options & SO_DEBUG)
    (void)setsockopt(s, SOL_SOCKET, SO_DEBUG, (char *)&on,
        sizeof(on));
if (options & SO_DONTROUTE)
    (void)setsockopt(s, SOL_SOCKET, SO_DONTROUTE, (char *)&on,
        sizeof(on));

但也许来源来自不同的版本..

【讨论】:

  • 感谢您的解释。根据您的解释,我使用 -d 选项运行了 traceroute 版本 2.0.13,2009 年 11 月 23 日。我用 strace 命令检查,它只启用 SO_DEBUG 选项。正如您所说,这可能是 Van Jacobson 的跟踪路由中的一个错误。谢谢
  • 你能解释一下 SO_DEBUG 和 SO_DONTROUTE 在任何场景下的真实例子吗
猜你喜欢
  • 2010-09-13
  • 2011-02-11
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
相关资源
最近更新 更多