Рассмотрим процесс сервера, который прослушивает порт для входящих соединений TCP.
Ядро поддерживает «очередь ожидающих соединений» для входящих соединений TCP, которые еще не были приняты процессом сервера.В этом состоянии ожидания я ожидаю, что полное подтверждение TCP уже завершено (syn, syn ack, ack)?
Однако только когда серверный процесс вызывает системный вызов accept, одно из ожидающих соединений получаетфактически установлен и извлечен из очереди, что позволяет отправлять и получать данные на / с серверного процесса.
У меня есть два конкретных вопроса.
Принимает ли ядро входящиеданные полезной нагрузки до того, как процесс сервера "принял" соединение?Эти входящие данные должны храниться в «буфере приема сокетов», ожидая, пока процесс сервера примет соединение и в конечном итоге прочитает данные.
Если ответ отрицательный, как ядро отклоняет данные полезной нагрузки при сохранениисвязь жива?Если установить размер окна приема TCP равным нулю?
Если ответ положительный, как ядро предотвращает чрезмерное использование ОЗУ, вызванное раздувающимися буферами приема сокетов?Конечно, должен быть настроен некоторый разумный лимит приемного буфера.
Как долго ядро поддерживает живые ожидающие соединения, которые еще не были приняты серверным процессом?Отправляет ли ядро сообщения проверки активности для ожидающих TCP-соединений?