SACK был добавлен позже, поэтому существует необходимость в обратной совместимости, как для конечных хостов, так и для промежуточных ящиков (также см. Ниже). Опция SACK-permitted
Разрешения выполняет только это.
SACK-permitted
отправляется из A в B, чтобы указать, что A готов принять опции SACK. Для обработки SACK (как и для большинства обработок повторной передачи) TCP может рассматриваться как состоящий из двух симплексных соединений с различным состоянием каждое. Таким образом, совершенно законно (но редко) иметь SACK, перемещающийся только в одном направлении (обратное направление SACK-permitted
во время SYN или SYNACK).
Как правило, вы можете оставить SACK включенным, так как это повышает производительность. Однако были (и, возможно, все еще есть) межсетевые экраны и блоки NAT, которые изменяют поля заголовка SEQ и ACK, но не знают о SACK и, таким образом, не адаптируют соответствующие порядковые номера в параметрах SACK. Это может привести к зависанию соединения (так как SACK подтвердил другой сегмент, который не был получен). По этой причине вы можете захотеть отключить SACK, даже если обе машины его поддерживают.
SACK можно отключить (для тестирования или при наличии вышеупомянутых некрасивых промежуточных ящиков) в системах * BSD (включая MacOS X), введя sysctl -w net.inet.tcp.sack=0
и включить его, установив его обратно в 1. В Linux sysctl -w net.ipv4.tcp_sack=0
достигает того же эффекта.
Первый абзац раздела 4 в RFC 2018 позволяет отправлять SACK, когда получено разрешение SACK. Обычно хост с поддержкой SACK объявляет о разрешении SACK. Я не могу представить себе полезного сценария, в котором хост с поддержкой SACK не будет объявлять разрешенный SACK, но будет использовать SACK (нереалистичным примером будет промежуточный ящик, плохо работающий с SACK только в одном направлении). Поэтому я не ожидаю, что SACK используется только в одном направлении.
Быстрый тест с Wireshark для Linux, MacOSX (возможно, обобщенный для * BSD) и принтера HP показывает, что они будут отвечать с разрешением SACK в SYNACK именно тогда, когда разрешение SACK было в SYN. Однако в RFC я не вижу ничего, что могло бы требовать или поощрять такое поведение.