Почему net.ipv4.tcp_rfc1337 не включен по умолчанию?

Параметр tcp_rfc1337, кажется, имеет решение для убийства ВРЕМЕННОГО ОЖИДАНИЯ.

Первая проблема заключается в том, что старые дублированные данные могут быть ошибочно приняты в новых соединениях, что приведет к повреждению отправленных данных.
Вторая проблема заключается в том, что соединения могут стать десинхронизированными и попасть в цикл ACK из-за того, что старые дублированные пакеты входят в новые соединения, которые становятся десинхронизированными.
Третья и последняя проблема заключается в том, что старые дублированные пакеты могут ошибочно входить во вновь установленные соединения и разрушать новое соединение.

Из того, что я прочитал, чтобы решить проблемы, настройка игнорирует пакеты RST (сброс), пока сокет находится в состоянии TIME-WAIT.

Итак, почему этот параметр не включен по умолчанию? Каковы недостатки использования этого?

Я на самом деле узнал об этой переменной, когда исследовал вопрос о прекращении SYN-атак. Как вы думаете, этот параметр помогает остановить их?

2 ответа

Решение

Я согласен с комментарием Грега. RFC 1337 является только информационным RFC и не является частью стандарта TCP. Чтобы гарантировать отсутствие каких-либо неожиданных изменений в производственных сетях, имеет смысл оставить эту функцию отключенной по умолчанию и предоставить администраторам сети возможность решить, хотели бы они включить ее для тестирования.

Отбрасывание пакетов RST для сокетов в TIME-WAIT, по- видимому, не будет иметь никаких негативных последствий, однако это не означает, что их нет - возможно, случайный крайний случай, который не был полностью исследован.

Интересно, что документация по ядру для tcp_rfc1337 представляется неверной:

tcp_rfc1337 - BOOLEAN
    If set, the TCP stack behaves conforming to RFC1337. If unset,
    we are not conforming to RFC, but prevent TCP TIME_WAIT
    assassination.
    Default: 0

Если эта опция установлена, мы соблюдаем RFC 1337 и отбрасываем пакеты RST, предотвращая убийство по времени. Если опция не установлена ​​(по умолчанию), мы не соблюдаем RFC 1337, подвержены убийству по времени.

Я нашел исходный код ядра и для меня документ верен: default = 0: kill

if (th-> rst) {/ * Это убийство TIME_WAIT, в двух вариантах. * О, хорошо... ни у кого пока нет достаточного решения этой * ошибки протокола. */ if (sysctl_tcp_rfc1337 == 0) { kill: inet_twsk_deschedule_put(tw); вернуть TCP_TW_SUCCESS; } }

Значение по умолчанию имеет смысл: RFC является информационным, поэтому вы должны установить эту ручку (значение = 1), чтобы соответствовать ей.

Другие вопросы по тегам