![]() |
Как работает TCP-соединение
Здравствуйте! Подскажите, пожалуйста, не получается усвоить материал касающийся TCP-соединений. Я не очень понял то, как это в этой статье описано. TCP-пакет не содержит никакой информации о IP-адресе источника и приёмника, она есть в IP-пакете в который TCP-пакет вложен. Ключевой информацией в заголовке TCP-пакета являются номера портов источника и приёмника и, что наиболее интересно - флаги.
Вот написано, что для установления соединения клиент посылает серверу TCP-пакет с флагом SYN. В случае, если сервер может ответить на такой запрос, он отсылает клиенту SYN+ACK, если не может - то отсылает RST. Далее написано, что при передаче данных периодически идут пакеты с флагами SYN и ACK, а завершается соединение либо отсылкой пакета с флагом FIN, либо по таймауту. Что мне непонятно в описании: 1. SYN это всегда запрос, а ACK это всегда ответ, либо бывают ответы с флагом SYN. В общем непонятно, как при помощи фаерволла можно запрещать хосту входящие соединения, фильтруя пакеты по флагам. Какие именно флаги при этом нужно отфильтровывать? 2. Допустим, что это HTTP-соединение. Клиент серверу шлёт GET-запрос, сервер клиенту высылает запрашиваемый файл. И файл и запрос в один пакет не поместятся, речь идёт о последовательности пакетов. Так вот, флаги SYN и ACK установлены только на первом пакете в последовательности или во всех? 3. Ещё раз про HTTP. а) Сначала на клиенте браузер выбирает произвольный свободный порт, номер которого выше 1024 и начинает его слушать. б) Потом браузер шлёт SYN-пакет серверу, указав портом источника этот самый выбранный порт, а портом приёмника 80. Начало GET-запроса как раз в этом самом SYN-пакете будет? в) Дальше непонятно, но об этом я уже в пунктах 1 и 2 задал. Какие флаги должны будут стоять на пакетах, когда запрашиваемая страница придёт к клиенту и как должен вести себя фаерволл, чтобы не допустить в открытый порт пакеты не от общающегося сервера, а от какого-то левого хоста? г) Какой механизм используется, чтобы отставить соединение открытым, чтобы браузер потом мог запросить изображения, таблицы стилей и другие компоненты веб-страницы? |
up!
|
Цитата:
Цитата:
Однако! Есть один нюанс. Многие протоколы устанавливают сразу несколько соединений. К примеру, FTP в активном режиме. Причем эти соединения инициируются сервером, а не клиентом. Поэтому простая проверка флагов TCP-пакета заодно заблокирует и все подобные протоколы, начиная с активного режима FTP и заканчивая torrent'ом. Цитата:
Цитата:
Цитата:
Цитата:
Поскольку пакеты от "левых узлов" имеют другой ip отправителя, они легко отсеиваются брандмауэром. Цитата:
Поэтому никакого механизма "чтобы отставить соединение открытым" не существует в природе. Существует прямо обратный механизм - закрытия сессии. До тех пор, пока он не применен, сессия будет оставаться открытой (если не прервется по таймауту). |
RasKolbas, Протокол TCP
Протокол TCP/IP или как работает Интернет . How TCP/IP Works. How TCP/IP Works™ .com Lecture Series. Ускорение доступа в Internet с помощью функции Traffic Shaping. Обновлено: Цитата:
|
prosto user, к сожалению мне ваши ссылки не помогли, я пока только только собираюсь через два месяца на курсы английского пойти. А в последней ссылке - просто принципы функционирования сети даны, я это ещё 4 года назад проходил.
AMDBulldozer, не совсем понял и статью в википедии, и ваш ответ. Или и там, и там недостаточно подробно алгоритм описан. Интересуюсь не просто так, а для потому что для дипломной работы нужно написать экспертную систему, которая будет закрывать порты и защищать от атак типа SYN flood. На счёт понятия сессии вроде понятно. Сессия открывается трехэтапным процессом установления соединения. То есть браузер должен сначала открыть сессию (убедиться что на удалённом сервере сокет перешёл в состояние ESTABLISHED), а только потом посылать GET-запрос, я правильно понял? И меня больше интересуеют настройки клиента. Правила сетевой безопасности рекомендуют блокировать входящие соединения на хосте, если он не является сервером. В то же время нельзя просто взять и заблокировать весь входящий трафик, потому как хост должен работать как клиент (принимать входящие пакеты, являющиеся ответом в созданные им исходящие соединения). Понять является ли пакет ответом или попыткой приконнектиться можно только посмотрев на его флаги. То есть, если я заблокирую все пакеты содержащие единственный флаг SYN, я при этом отключу на хосте возможности сервера, оставив возможности клиента или как? То есть при помощи брадмауэра netfilter, входящего в состав ядра Linux это так делается? Код:
iptables -t filter -A INPUT -i eth0 -p tcp --tcp-flags SYN,ACK,FIN SYN -j DROP Код:
iptables -t filter -A INPUT -i eth0 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT |
Цитата:
TCP (русский) Одна из атак на TCP Сканирование портов TCP rfc 793 (оригинал) Статья про стандарты интернета От себя хочу добавить. Стандарты - крайне интересная вещь, если "распробовать". Есть риск провалиться в них и потерять время. Цитата:
Если дробить:
|
Время: 14:58. |
Время: 14:58.
© OSzone.net 2001-