Касательно SYN-флуда TCP: почему полуоткрытые соединения хуже, чем установленные соединения?

ЭТО НЕ ЗАПРОШЕНО ДЛЯ ВЗЛОМА. Я изучаю информатику, и мне просто интересно.

Итак.. Когда хост A отправляет TCP SYN на хост B, хост B выделяет пространство для приема буфера и т. д., отправляет SYNACK обратно на хост A, а хост A также выделяет такое пространство, а затем отправляет ACK обратно на хост B. После этого соединение устанавливается.

Но почему полуоткрытое соединение (такое, при котором последний ACK от A никогда не отправляется) разрывает хост B больше, чем полностью установленное соединение?


person Community    schedule 08.03.2013    source источник


Ответы (1)


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

Но вам нужно только отправить один пакет на сервер, чтобы он создал полуоткрытое соединение, тогда как вам нужно выполнить рукопожатие TCP (1 отправка, 1 получение, еще одна отправка), чтобы создать полностью открытое соединение. Таким образом, вы можете создать множество полуоткрытых подключений с поддельного IP-адреса или быстро сгенерировать миллионы из них с платформы DDoS. Вам не обязательно быть в состоянии получать SYN|ACK ответы. Вам даже не нужно заботиться о том, способен ли сервер выдавать эти ответы достаточно быстро.

Это предполагает отсутствие файлов cookie SYN или других средств защиты от полуоткрытых соединений.

person Celada    schedule 08.03.2013
comment
Большое спасибо! :) То есть полуоткрытое или полностью установленное соединение почти не влияет на перегрузку сервера? И единственная причина, по которой мы оставляем его полуоткрытым, заключается в том, что нет смысла отправлять ACK с хоста А? (при условии, что нам все равно, используем ли мы собственный IP-адрес источника, иначе причина будет заключаться в том, что мы НЕ МОЖЕМ) Так что в значительной степени ... полуоткрытые и полностью открытые соединения занимают одинаковое количество ресурсов, но полностью открытый требует, чтобы мы отправили еще один сегмент TCP? - person ; 08.03.2013
comment
Чтобы добавить немного информации, полуоткрытые соединения на самом деле используют меньше ресурсов, чем полностью установленные соединения. Из lwn.net/Articles/277146: Linux больше не использует всю память, необходимую для полного соединение, пока новое соединение не будет полностью открыто. Вместо этого он использует мини-носок на этот период. Minisock представляет собой 96-байтовую структуру struct tcp_request_sock, содержащую минимальное состояние, необходимое для полного открытия соединения. Размер полностью установленной структуры tcp_sock составляет 1616 байт. Оба измерения размера структуры относятся к 64-битному ядру. Это может помочь смягчить DOS-атаки. - person seren; 06.10.2017