если вы отправите TCP-пакет с dst-портом 80 хосту, обслуживающему http-запрос на порту 80, что произойдет?

#networking #tcp #ip

Вопрос:

Я изучаю трехстороннее рукопожатие TCP и чувствую, что есть много скрытых знаний, о которых я не знаю.

Интересно, если я отправлю случайный TCP-пакет с портом dst 80 хосту, обслуживающему http-запрос на порту 80, что произойдет?

Есть ли инструмент, с которым я могу поэкспериментировать?

Комментарии:

1. Если у вас еще нет TCP — соединения, вы сначала получите TCP-соединение. См. RFC 793 , который является определением TCP, и в нем описан конечный автомат TCP.

Ответ №1:

… что будет дальше?

Это зависит от конкретного веб-сервера и конкретного содержимого того, что вы отправили. Например, он может просто подождать, потому что это неполный HTTP-запрос, может закрыть соединение, так как оно недействительно, может вернуть HTTP-ответ, указывающий на неправильный запрос …

… Есть ли инструмент, с которым я могу поэкспериментировать?

Существует множество инструментов, которые позволяют выполнять простое TCP-соединение, например netcat, telnet … или даже простые программы на Python или аналогичные.

Ответ №2:

Интересно, если я отправлю случайный TCP-пакет с портом dst 80 хосту, обслуживающему http-запрос на порту 80, что произойдет?

Если вы сначала не завершили рукопожатие SYN / SYN/ACK / ACK, все остальное считается несинхронизированным и на него СНАЧАЛА отвечают.

Проверьте RFC 793 (выделено мной):

Генерация сброса

Как правило, сброс (ПЕРВЫЙ) должен отправляться всякий раз, когда поступает сегмент, который, по-видимому, не предназначен для текущего соединения. Сброс не должен быть отправлен, если не ясно, что это так.

Существует три группы государств:

  1. Если соединение не существует (ЗАКРЫТО), то сброс отправляется в ответ на любой входящий сегмент, кроме другого сброса. В частности, этим способом отвергаются SYN, адресованные несуществующему соединению.

Если входящий сегмент имеет поле ACK, сброс берет его порядковый номер из поля ACK сегмента, в противном случае сброс имеет нулевой порядковый номер, а поле ACK равно сумме порядкового номера и длины сегмента входящего сегмента. Соединение остается в ЗАКРЫТОМ состоянии.

  1. Если соединение находится в каком-либо несинхронизированном состоянии (ПРОСЛУШИВАНИЕ, SYN-ОТПРАВЛЕНО, SYN-ПОЛУЧЕНО), и входящий сегмент подтверждает что-то, что еще не отправлено (сегмент содержит неприемлемый ACK), или если входящий сегмент имеет уровень безопасности или отсек, который точно не соответствует уровню и отсеку, запрошенным для подключения, отправляется сброс.

Если наш SYN не был подтвержден, и уровень приоритета входящего сегмента выше запрошенного уровня приоритета, либо повысьте локальный уровень приоритета (если это разрешено пользователем и системой), либо отправьте сброс; или, если уровень приоритета входящего сегмента ниже запрошенного уровня приоритета, продолжайте, как если бы приоритет точно соответствовал (если удаленный TCP не может повысить уровень приоритета до нашего, это будет обнаружено в следующем сегменте, который он отправляет, и тогда соединение будет прервано). Если наш SYN был подтвержден (возможно, в этом входящем сегменте), уровень приоритета входящего сегмента должен точно соответствовать локальному уровню приоритета, если это не так, необходимо отправить сброс.

Если входящий сегмент имеет поле ACK, сброс берет его порядковый номер из поля ACK сегмента, в противном случае сброс имеет нулевой порядковый номер, а поле ACK равно сумме порядкового номера и длины сегмента входящего сегмента. Соединение остается в том же состоянии.

  1. Если соединение находится в синхронизированном состоянии (УСТАНОВЛЕНО, FIN-WAIT-1, FIN-WAIT-2, ЗАКРЫТИЕ, ЗАКРЫТИЕ, ПОСЛЕДНЕЕ ПОДТВЕРЖДЕНИЕ, ОЖИДАНИЕ ВРЕМЕНИ), любой неприемлемый сегмент (порядковый номер вне окна или неприемлемый номер подтверждения) должен вызывать только пустой сегмент подтверждения, содержащий текущий порядковый номер отправки и подтверждение, указывающее следующий порядковый номер, который ожидается получить, и соединение остается в том же состоянии.

Если входящий сегмент имеет уровень безопасности, отсек или приоритет, который точно не соответствует уровню, отсеку и приоритету, запрошенным для соединения,отправляется сброс, и соединение переходит в ЗАКРЫТОЕ состояние. Сброс берет свой порядковый номер из поля ACK входящего сегмента.