Skip to content

Latest commit

 

History

History
70 lines (39 loc) · 8.89 KB

lecture.adoc

File metadata and controls

70 lines (39 loc) · 8.89 KB

Установка соединения

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

Возможность установить соединение означает, что на другом конце соединение действительно работает приложение и оно готово к обмену данными.

Если соединение установить невозможно, значит на другом конце приложение не готово принимать или отправлять данные, а значит, нет смысла их отправлять или ожидать приема.

Можно провести параллель, установка соединение - это как звонок по телефону. Если пользователь поднимает трубку, значит можно начинать общение, а если нет, то нет никакого смысла что-то говорить в трубку.

Установка соединения в TCP это 3-х разовое рукопожатие (рисунок ниже):

  • Инициатор отправляет TCP пакет с флагом SYN.

  • Принимающая сторона на такой пакет отвечает TCP пакетом с уже двумя установленными флагами: SYN + ACK.

  • в ответ на SYN + ACK инициатор отправляет TCP пакет с флагом ACK.

Установка соединения в TCP.
Figure 1. Установка соединения в TCP.

Таким образом, за 3 пакета TCP устанавливает соединение. После успешной установки соединения TCP может начать принимать и передавать данные.

Для примера, давайте сделаем небольшую сеть из двух хостов: клиент и сервер, как показано на рисунке ниже.

Установка соединения в TCP и передача данных. (https://miminet.ru/web_network?guid=d35bcad2-b2be-4c2a-9902-26d4edd0bb1d).
Figure 2. Установка соединения в TCP и передача данных. (https://miminet.ru/web_network?guid=d35bcad2-b2be-4c2a-9902-26d4edd0bb1d).

На сервере мы запустим TCP сервер на порту 5555. А на клиенте мы запустим передачу данных с использованием протокола TCP на IP адрес сервера и на порт 5555. Передадим 1000 байт данных.

Запустим эмуляцию и посмотрим за пакетами в сети. После ARP запроса и ответа мы видим, как хост 1 отправляет на сервер SYN пакет, в ответ приходит SYN+ACK, и завершается установка соединения TCP пакетом с флагом ACK.

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

А теперь давайте посмотрим, как поведет себя TCP, если на сервере никто не будет ожидать подключения на порт 5555.

Опять, сделаем небольшую сеть, как на рисунке ниже, она очень похожа на сеть из предыдущего примера. Только на этот раз на сервере не будем запускать TCP сервер на порту 5555. Т.е. теперь на сервере нет приложения, которое готово обмениваться данными на порту 5555.

Попытка установки TCP соединения на закрытый порт. (https://miminet.ru/web_network?guid=b768b8a6-322e-4520-8a7a-1da02b4cd008).
Figure 3. Попытка установки TCP соединения на закрытый порт. (https://miminet.ru/web_network?guid=b768b8a6-322e-4520-8a7a-1da02b4cd008).

Запустим эмуляцию и посмотрим, как будет работать протокол TCP в этом случае.

В начале, как обычно, ARP-запрос и ARP-ответ, а после мы видим, как хост 1 отправляет SYN пакет, а в ответ приходит TCP пакет с флагом RST+ACK.

Если на хосте нет приложения, которое готова обмениваться данными, то в ответ на SYN пакет TCP отправляет пакет с флагом RST+ACK (Reset, от английского сброс). Как изображено на рисунке ниже.

Схема установки TCP соединения на закрытый порт.
Figure 4. Схема установки TCP соединения на закрытый порт.

Такой способ позволяет программисту очень быстро понять, что удаленная сторона не готова обмениваться данными и обработать эту ситуацию.

И напоследок, рассмотрим еще одну ситуацию, когда удаленная сторона не отвечает на SYN пакет. Такое может произойти либо если сервер выключен или на нем настроен фаервол - программа, которая умеет блокировать пакеты с определенным IP адресом и портом.

Попытка установки TCP соединения на хост. который не отвечает. (https://miminet.ru/web_network?guid=c16763e6-1ce8-4d50-b3b8-4261ddc9940b).
Figure 5. Попытка установки TCP соединения на хост, который не отвечает. (https://miminet.ru/web_network?guid=c16763e6-1ce8-4d50-b3b8-4261ddc9940b).

Опять, сделаем сеть состоящую из двух хостов. На сервере будем блокировать порт 5555. А на хосте, как обычно, выполним команду отправки данных на сервер на порт 5555.

Блокировка порта 5555 на сервере приведет к тому, что все TCP и UDP пакеты, у которых в поле порт назначения прописан порт 5555 будут выброшены. Т.е. протоколы TCP и UDP ничего не узнают про этот пакет и не смогут на него отреагировать.

Запустим эмуляцию и посмотрим, как TCP пытается установить соединение в этом случае.

Если на SYN пакет не следует никакой реакции, т.е. нет SYN+ACK или RST, то TCP считает, что пакет потерялся и нужно попробовать еще раз, т.е. отправить еще один SYN пакет. При этом пауза между отправками увеличивается в два раза. Первый повторный SYN пакет отправляется через 1 секунду, вторая попытка через 2 секунды, затем через 4 и так далее. Как показано на рисунке ниже.

Схема установки TCP соединения
Figure 6. Схема установки TCP соединения, когда нет ответа.

Последняя попытка установить зависит от настроек ОС. В современных системах TCP ограничивается 4-мя попытками.

Именно по этой причине, можно часто видеть как сетевое приложение зависает при попытке подключиться к удаленному хосту. Оно пытается установить соединение, а в ответ не получает ни SYN+ACK, ни RST+ACK пакета.