Вступить в клуб →
средняявопросСети в Linux: сокеты, epoll и Boost.Asio

Каждый маленький запрос к сервису занимает ровно около 40 мс

Клиент в одной сети с сервером отправляет запрос двумя вызовами:

send(fd, &header, sizeof header, 0);   // 16 байт
send(fd, body.data(), body.size(), 0); // 60 байт
recv(fd, reply, sizeof reply, 0);

Сервер обрабатывает запрос за 0,2 мс, пинг — 0,1 мс, но клиент получает ответ через ~40 мс. Если склеить заголовок и тело в один send, задержка пропадает. В чём дело?

  • Алгоритм Нейгла ждёт ACK, а ACK отложен сервером
  • Ядро копит данные, пока не наберётся MSS
  • Каждый send ждёт подтверждения от приложения
  • Второй send открывает новое TCP-соединение

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела