Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Хочу все знать (http://forum.oszone.net/forumdisplay.php?f=23)
-   -   Как работает TCP-соединение (http://forum.oszone.net/showthread.php?t=256043)

RasKolbas 11-03-2013 21:08 2108818

Как работает 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 задал. Какие флаги должны будут стоять на пакетах, когда запрашиваемая страница придёт к клиенту и как должен вести себя фаерволл, чтобы не допустить в открытый порт пакеты не от общающегося сервера, а от какого-то левого хоста?
г) Какой механизм используется, чтобы отставить соединение открытым, чтобы браузер потом мог запросить изображения, таблицы стилей и другие компоненты веб-страницы?

RasKolbas 16-03-2013 18:33 2112510

up!

AMDBulldozer 16-03-2013 19:14 2112543

Цитата:

Цитата RasKolbas
SYN это всегда запрос, а ACK это всегда ответ, либо бывают ответы с флагом SYN. »

Бывают. В процессе установления сессии, который описан в статье wiki, ссылку на которую Вы приводите, всё подробно описано.

Цитата:

Цитата RasKolbas
В общем непонятно, как при помощи фаерволла можно запрещать хосту входящие соединения, фильтруя пакеты по флагам. Какие именно флаги при этом нужно отфильтровывать? »

Флаги SYN и ACK. Необходимо проверять оба флага. Первый должен быть установлен, а второй - нет. (Естественно в данном случае речь идет исключительно о протоколе TCP. Для UDP этот метод, как легко догадаться, абсолютно непригоден - этот протокол не предусматривает установки сессий).
Однако! Есть один нюанс. Многие протоколы устанавливают сразу несколько соединений. К примеру, FTP в активном режиме.
Причем эти соединения инициируются сервером, а не клиентом. Поэтому простая проверка флагов TCP-пакета заодно заблокирует и все подобные протоколы, начиная с активного режима FTP и заканчивая torrent'ом.
Цитата:

Цитата RasKolbas
Так вот, флаги SYN и ACK установлены только на первом пакете в последовательности или во всех? »

Только в первом. Они не могут быть установлены в других пакетах, поскольку установленный SYN задает новый начальный номер последовательности.
Цитата:

Цитата RasKolbas
б) Потом браузер шлёт SYN-пакет серверу, указав портом источника этот самый выбранный порт, а портом приёмника 80. Начало GET-запроса как раз в этом самом SYN-пакете будет? »

Непредсказуемо и не имеет ни малейшего значения.
Цитата:

Цитата RasKolbas
Какие флаги должны будут стоять на пакетах, когда запрашиваемая страница придёт к клиенту»

Зависит от обстоятельств (в процессе передачи может потребоваться установка каких-то флагов, к примеру, для изменения размера tcp-окна), но необходимости в обязательном порядке устанавливать какие-то флаги нет.

Цитата:

Цитата RasKolbas
как должен вести себя фаерволл, чтобы не допустить в открытый порт пакеты не от общающегося сервера, а от какого-то левого хоста? »

С одной стороны, "левому хосту" будет сложно влезть в чужую последовательность - ведь он не знает, какие номера необходимо присваивать пакетам. Но обычно, перед отправкой запроса на установление TCP-сессии межсетевой экран открывается для приема пакетов с ip узла на который был отправлен запрос.
Поскольку пакеты от "левых узлов" имеют другой ip отправителя, они легко отсеиваются брандмауэром.

Цитата:

Цитата RasKolbas
Какой механизм используется, чтобы отставить соединение открытым, чтобы браузер потом мог запросить изображения, таблицы стилей и другие компоненты веб-страницы? »

Как уже было сказано, в основе TCP-протокола лежит понятие сессии. Сессия открывается трехэтапным процессом установления соединения ("3-way handshake"). Сессия закрывается либо по истечению периода таймаута, если в течение некоторого времени от сервера не поступает ни одного пакета, либо, обычно, по получению пакета с установленным флагом FIN. Завершение сессии - такой же трехэтапный процесс. только вместо флага инициации сессии (SYN) посылается пакет с установленным флагом завершения сессии (FIN). В остальном эти процессы абсолютно одинаковы.
Поэтому никакого механизма "чтобы отставить соединение открытым" не существует в природе. Существует прямо обратный механизм - закрытия сессии. До тех пор, пока он не применен, сессия будет оставаться открытой (если не прервется по таймауту).

prosto user 17-03-2013 14:17 2112987

RasKolbas, Протокол TCP

Протокол TCP/IP или как работает Интернет .

How TCP/IP Works.

How TCP/IP Works™ .com Lecture Series.

Ускорение доступа в Internet с помощью функции Traffic Shaping.

Обновлено:
Цитата:

Цитата RasKolbas
к сожалению мне ваши ссылки не помогли, я пока только только собираюсь через два месяца на курсы английского пойти »

онлайн-переводчики еще не отменили.

RasKolbas 21-03-2013 03:10 2115344

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 -j ACCEPT

Но в статьях я больше такие варианты видел:
Код:

iptables -t filter -A INPUT -i eth0 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -i eth0 -p tcp j ACCEPT -j DROP

Какой вариант более правильный?

lxa85 21-03-2013 08:49 2115401

Цитата:

Цитата RasKolbas
. Или и там, и там недостаточно подробно алгоритм описан. Интересуюсь не просто так, а для потому что для дипломной работы нужно »

Если мы касаемся серьезных документов как то "Дипломная работа", то правильно будет ссылаться не на википедию, не на форум, а на первоисточник. Первоисточником информации о протоколах взаимодействия в сети являются RFC ()
TCP (русский) Одна из атак на TCP Сканирование портов TCP rfc 793 (оригинал) Статья про стандарты интернета
От себя хочу добавить. Стандарты - крайне интересная вещь, если "распробовать". Есть риск провалиться в них и потерять время.
Цитата:

Цитата RasKolbas
Какой вариант более правильный? »

С виду оба. Просто один основывается на разборе TCP пакета и передаваемых флагов, второй на основе состояния соединения.
Если дробить:
  1. Передали флаг SYN,
  2. Получили флаг SYN,
  3. Перешли в следующие состояние
В совокупности это один этап. Кстати, в предложенном документе (rfc 793 на русском) есть подробная диаграмма переходов (рис. 6) (Этот рисунок лишь иллюстрирует возможные состояния и не является спецификацией таковых. (В параграфе 4.2.2.8 RFC-1122 приведен ряд поправок к этой диаграмме. Прим. перев.) RFC-1122


Время: 14:58.

Время: 14:58.
© OSzone.net 2001-