2016-06-22 8 views
2

Может ли кто-нибудь объяснить разницу между SO_DEBUG и SO_DONTROUTE. Это мое пониманиеSO_DEBUG и SO_DONTROUTE в traceroute

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 

Но в трассировку, если я дать опцию -d в командной строке, опция SO_DONTROUTE также включена. Также, когда я включаю -d вариант -d также разрешает. Могу я узнать почему ?

+0

Какую версию traceroute вы используете? – Malt

+0

Первая версия traceroute, написанная van jacobson – pretty

+0

Как вы определили, что '-d' включен' SO_DONTROUTE'? – Malt

ответ

1

Я не вижу четкой связи между этими двумя флагами, так что это (возможно) определенное поведение конкретной реализации, возможно, даже ошибка.

Я запустил traceroute -d 8.8.8.8 на машине Ubuntu 14.04 с установленным по умолчанию трассировщиком - Modern traceroute for Linux, version 2.0.20, Aug 19 2014 и смог достичь 8.8.8.8 просто отлично. С флагом -r traceroute выходит из строя с сообщением об ошибке Network is unreachable, так как аппарат не может найти 8.8.8.8.

Глядя на strace обоих traceroute -r и traceroute -d я также подтвердил, что один называет толькоsetsockopt(3, SOL_SOCKET, SO_DONTROUTE, [1], 4), а другой называет толькоsetsockopt(3, SOL_SOCKET, SO_DEBUG, [1], 4).

Источники для traceroute Van Jacobson от official (?) Должны вести себя одинаково. Вот (часть) кода, который разбирает параметры командной строки:

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)); 

Но, возможно, источники из другой версии ..

+0

Благодарим вас за разъяснения. Согласно вашему объяснению, я запускал traceroute версии 2.0.13, 23 ноября 2009 г. с опцией -d. И я проверю с помощью команды strace, которая разрешает только SO_DEBUG. Как вы сказали, это может быть ошибкой в ​​traceroute Ван Якобсона. Спасибо – pretty

+0

Не могли бы вы объяснить мне пример реального мира для SO_DEBUG и SO_DONTROUTE с любым сценарием – pretty