Параметр tcp_rfc1337, кажется, имеет решение для Убийства ВРЕМЕНИ-ОЖИДАНИЯ.
Первая проблема заключается в том, что старые повторяющиеся данные могут быть ошибочно приняты в новых соединениях, что приведет к повреждению отправленных данных.
Вторая проблема заключается в том, что соединения могут рассинхронизироваться и попасть в цикл ACK из-за того, что старые дублированные пакеты поступают в новые соединения, которые будут десинхронизированы.
Третья и последняя проблема заключается в том, что старые дублированные пакеты могут ошибочно входить в новые установленные соединения и уничтожать новое соединение.
Из того, что я прочитал, для решения проблем настройка игнорировать пакеты RST (сброса), пока сокет находится в состоянии TIME-WAIT.
Итак, почему этот параметр не включен по умолчанию? Какие недостатки у этого использования?
На самом деле я узнал об этой переменной, когда исследовал, как остановить атаки SYN-флуда. Как вы думаете, этот параметр помогает их остановить?
Я согласен с комментарием Грега. 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-пакеты, предотвращая TIME-WAIT Assassination. Если параметр не установлен (по умолчанию), мы не соответствуем RFC 1337 и подвержены TIME-WAIT Assassination.
Я нашел исходный код ядра и для меня документ правильный: по умолчанию = 0: kill
if (th->rst) {
/* This is TIME_WAIT assassination, in two flavors.
* Oh well... nobody has a sufficient solution to this
* protocol bug yet.
*/
if (sysctl_tcp_rfc1337 == 0) {
kill:
inet_twsk_deschedule_put(tw);
return TCP_TW_SUCCESS;
}
}
Значение по умолчанию имеет смысл: RFC является информационным, поэтому вы должны установить этот регулятор (значение = 1) в соответствии с ним.