Почему 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), чтобы соответствовать ей.