
Работа протокола TCP
Установка соединения в TCP (Transmission Control Protocol) происходит с использованием механизма, известного как трехэтапное рукопожатие (three-way handshake). Этот процесс не только инициирует соединение между двумя хостами, но и синхронизирует начальные последовательные номера (sequence numbers, Seq) для обеспечения надежной передачи данных. Вот как происходит установка соединения и генерация Seq:
Шаг 1: SYN
Клиент отправляет пакет SYN (synchronize) на сервер, чтобы начать установление соединения. В этом пакете клиент указывает свой начальный последовательный номер (Initial Sequence Number, ISN) для соединения, который обычно генерируется случайным образом. Этот номер используется для упорядочивания байтов данных, передаваемых в TCP-сегментах.
Шаг 2: SYN-ACK
Сервер получает пакет SYN, выделяет ресурсы для соединения и отправляет обратно пакет SYN-ACK. В этом пакете сервер подтверждает получение пакета SYN от клиента, отправляя обратно подтверждение (ACK) с номером, на единицу большим, чем полученный ISN клиента. Также сервер отправляет свой собственный ISN, который также генерируется случайным образом, для использования в качестве начального номера последовательности в направлении от сервера к клиенту.
Шаг 3: ACK
Клиент получает пакет SYN-ACK, выделяет ресурсы для соединения и отправляет пакет ACK на сервер, подтверждая получение ISN сервера. Номер подтверждения в этом пакете устанавливается на единицу больше, чем ISN, полученный от сервера. После получения этого пакета сервер знает, что соединение успешно установлено, и обе стороны могут начать передачу данных.
Передача данных
- Сегментация данных: Приложение передает данные протоколу TCP для отправки. TCP делит эти данные на сегменты, размер которых не превышает максимальный размер сегмента (MSS, Maximum Segment Size), который был согласован во время установления соединения. MSS обычно определяется на основе MTU (Maximum Transmission Unit) сети, чтобы избежать фрагментации пакетов на уровне IP.
- Нумерация сегментов: Каждому сегменту присваивается последовательный номер (Seq), который соответствует порядковому номеру первого байта данных в сегменте. Это позволяет получателю упорядочивать полученные сегменты и обнаруживать любые пропущенные или повторно переданные сегменты.
- Подтверждение получения: Когда получатель принимает один или несколько сегментов, он отправляет обратно сегмент ACK (Acknowledgment), указывая номер последовательности следующего ожидаемого байта. Это служит подтверждением того, что все байты до этого номера были успешно получены.
- Управление потоком: Получатель использует размер окна (Window Size) в сегментах ACK, чтобы сообщить отправителю, сколько данных он готов принять. Это предотвращает переполнение буфера получателя, позволяя отправителю регулировать скорость передачи данных.
- Управление перегрузкой: TCP использует различные алгоритмы управления перегрузкой, такие как Slow Start, Congestion Avoidance, Fast Retransmit и Fast Recovery, чтобы контролировать скорость передачи данных в условиях изменяющейся пропускной способности сети и избегать коллапса сети из-за перегрузки.
- Повторная передача: Если отправитель не получает подтверждение (ACK) для сегмента в течение определенного времени (RTO, Retransmission Timeout), он предполагает, что сегмент был потерян или отброшен и повторно передает его.
- Завершение передачи данных: Когда одна из сторон завершает отправку данных, она отправляет сегмент с флагом FIN, чтобы указать на завершение передачи данных. Другая сторона подтверждает получение FIN сегмента, отправляя ACK. После этого вторая сторона также может инициировать закрытие соединения, отправив свой собственный FIN сегмент.