Протокол TCP

Оглавление

1. Подключился и пожал руку

Теперь рассмотрим более сложный протокол: TCP (Transmission Control Protocol). Он имеет ряд свойств, полностью противоположных UDP:

Данный протокол требует чёткого разделение на сервер и клиент. Первый ожидает входящие подключения, второй подключается к серверу.

Протокол требует установки канала связи между двумя устройствами, это происходит путём трёх "рукопожатий". Клиент отправляет серверу запрос на подключение, сервер отвечает клиенту на него, клиент подтверждает подключение.

Для осуществления данных операций, интерфейс сокета расширен дополнительными методами:

  1. listen(count) #Указывает количество подключений в "очереди", которые не будут отклонены при попытке подключения.
  2. socket, address = accept() #Принять подключение, возвращает сокет используемый для этого подключения, а также адрес подключившегося
  3. connect(address) #Попытка подключения к указанному адресу

Метод accept возвращает адрес подключившегося к серверу и новый сокет. Этот сокет использует все операции обычного сокета, и должен быть закрыт для завершения подключения.

В случае разрыва соединения, сокеты выбрасывает исключение, поэтому работа с ними должна проходить в окружении try-except.

Клиент на своей стороне должен создать сокет и вызвать у того метод connect, после завершения работы с сервером клиент должен вызвать метод close.

Для повторного подключения создаётся новый сокет.

2. Отправил и повторил

Ключевая особенность TCP в том, что данные доходят гарантировано. Это осуществляется путём повторения запросов. Клиент после отправки данных ждёт подтверждения, если оно не пришло, он повторяет отправку. Сервер и клиент автоматически сортируют все приходящие к ним пакеты по внутреннему времени. Это гарантирует порядок получения.

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

3. Описание сервера

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

Каждый поток в своей работе использует схему из предыдущей статьи.

Неверный запрос или разрыв связи приводит к выбросу исключения, вызову close() и остановке потока.