Я пишу веб-сервер и похоже при взаимодействии с браузером происходит недопонимание.
В браузере открываю веб-страницу, браузер успешно посылает HTTP запрос и успешно принимает HTTP ответ, сразу же после отправки ответа, мой веб-сервер закрывает подключение, но браузер тут-же создаёт новое подключение, однако он не присылает никаких запросов в этом подключении, после 5 секунд соединение разрывается сервером, поскольку на нём стоит тайм-аут для чтения.
Браузер присылает заголовок Connection: keep-alive
Сервер отправляет заголовок "Connection: close", поскольку я хочу просто отправить ответ и закрыть соединение.
Вот как это выглядит в Wireshark:
У сервера порт 7878, остальные браузеру.
Вплоть до 29 пакета всё кажется идёт хорошо, но в 29 пакете браузер пытается отправить ACK, как я понял в ответ на FIN ACK, но похоже тут что-то не так.
У меня подозрение, что в после того как сервер в 28 пакете отправил FIN ACK он не дожидается ACK от клиента, верно ли это?
Я поставил цикл из 10000 вызовов sleep(1 мс) перед завершением соединения сервером(что-бы возможно где-то между ними соединение успело завершиться), в этом варианте клиенту с сервером чуть-чуть не хватило что-бы полностью обработать последовательность:
FIN ACK ->
<- ACK
<- FIN ACK
-> ACK
Тут инициатором завершения был клиент
Правильно ли я понимаю, что сервер посылая FIN ACK не дожидается ACK и в целом неверно производит завершение TCP подключения, завершая соединение раньше времени? Именно поэтому браузер инициирует повторное подключение, но не присылает никаких данных.
Я попробовал отправлять запрос с помощью сторонней утилиты, в этом случае соединение завершается корректно
Похоже, что эта проблема связана только с браузером(я пробовал разные браузеры).