← Назад ко всем вопросам

3-way handshake, keep-alive

1️⃣ Как кратко ответить

3-way handshake — это процесс установления TCP-соединения, состоящий из трех шагов: клиент отправляет SYN, сервер отвечает SYN-ACK, клиент подтверждает ACK. Keep-alive — это механизм поддержания активного соединения, отправляющий периодические сообщения для проверки доступности удаленного узла и предотвращения разрыва соединения.

2️⃣ Подробное объяснение темы

3-way handshake

3-way handshake — это метод, используемый в протоколе TCP (Transmission Control Protocol) для установления надежного соединения между клиентом и сервером. Этот процесс состоит из трех шагов, которые обеспечивают синхронизацию и подтверждение соединения.

  1. SYN (Synchronize): Клиент инициирует соединение, отправляя серверу пакет с флагом SYN. Этот пакет содержит начальный номер последовательности, который будет использоваться для передачи данных.

  2. SYN-ACK (Synchronize-Acknowledge): Сервер, получив SYN-пакет, отвечает клиенту пакетом с флагами SYN и ACK. Этот пакет также содержит начальный номер последовательности сервера и подтверждает получение SYN-пакета от клиента.

  3. ACK (Acknowledge): Клиент, получив SYN-ACK от сервера, отправляет обратно ACK-пакет, подтверждая получение SYN-ACK. После этого соединение считается установленным, и стороны могут начать обмен данными.

Пример кода на Python, демонстрирующий установление TCP-соединения:

import socket
​
# Создаем TCP-сокет
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
​
# Устанавливаем соединение с сервером
client_socket.connect(('example.com', 80))
​
# Отправляем данные после установления соединения
client_socket.sendall(b'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n')
​
# Получаем ответ от сервера
response = client_socket.recv(4096)
​
# Закрываем соединение
client_socket.close()
  • socket.socket(socket.AF_INET, socket.SOCK_STREAM): Создание TCP-сокета.
  • client_socket.connect(('example.com', 80)): Установление соединения с сервером по адресу и порту.
  • client_socket.sendall(...): Отправка данных после успешного 3-way handshake.
  • client_socket.recv(4096): Получение данных от сервера.
  • client_socket.close(): Закрытие соединения.

Keep-alive

Keep-alive — это механизм, используемый для поддержания активного соединения между клиентом и сервером. Он предотвращает разрыв соединения из-за бездействия, отправляя периодические сообщения, чтобы убедиться, что удаленный узел доступен.

В HTTP, например, keep-alive позволяет использовать одно и то же соединение для нескольких запросов и ответов, что снижает накладные расходы на установление новых соединений.

Пример использования keep-alive в HTTP-запросе:

GET / HTTP/1.1
Host: example.com
Connection: keep-alive
  • Connection: keep-alive: Заголовок, указывающий серверу, что клиент хочет поддерживать соединение открытым для последующих запросов.

Keep-alive полезен для повышения производительности, так как уменьшает задержки, связанные с повторным установлением соединений, и снижает нагрузку на серверы и сети.

Тема: Сети и протоколы
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки