Winsock функции send и recv - где хранятся полученные байты?

Подскажите пожалуйста, вот есть две синхронные функции в Winsock: send и recv.

send() - отправляет данные на удаленный сервер, а recv - принимает ответ на этот запрос.

Мой вопрос собственно в следующем:

Я вызываю send().. Далее ставлю к примеру задержку в 20 секунд... И вызываю recv и получаю данные.

А откуда я получаю данные ? То есть, как это абстрактно происходит ?

-После send(), сервер, отправляет в ответ так же данные и эти данные записываются операционной системой во временный буфер, которая же она сама и создает ? А функцией recv() я извлекаю эти данные из этого временного буфера уже в свой буфер ?

-Если это примерно так, а как тогда принимаются данные ну к примеру огромных размеров типа 4 Гб ? То есть я сделал предположим Sleep() между send и recv на час, и что получается ОС будет в оперативной памяти выделять 4Гб и писать туда данные ? Или это будет происходить небольшими частями и пока я функцией recv() не извлеку данные из этого временного буфера, ОС не будет принимать данные ?

-Если это примерно так, то как, тогда происходит приемка 4 Гб данных в асинхронной функции WSARecv() ?


Ответы (1 шт):

Автор решения: Optimus1

Вычитал из Глейзера:

Для решения проблемы протоколу TCP позволено послать сразу множество сегментов, не дожидаясь подтверждения. Однако количество таких сегментов не может быть бесконечным, так как возникает другая проблема. Когда данные транспортного уровня достигают узла, они сохраняются в буфере, пока процесс, связанный с соответствующим портом, не извлечет их. В этот момент данные удаляются из буфера. Неважно, каким объемом памяти обладает узел, сам буфер имеет некоторый фиксированный размер. Легко представить, что сложный процесс на медленном процессоре может не справляться с обработкой данных, поступающих слишком быстро. То есть когда буфер заполнится, вновь прибывающие данные будут отбрасываться. Для протокола TCP это означает, что получаемые данные не будут подтверждаться и быстродействующий отправитель повторит передачу данных с высокой скоростью. Весьма вероятно, что большая часть вновь отправленных данных опять будет сброшена, потому что принимающий узел имеет все тот же медленный процессор, на котором выполняется все тот же сложный процесс. В результате значительная доля трафика будет потеряна, что является недопустимым разбазариванием ресурсов Интернета.

Чтобы устранить эту катастрофическую неэффективность, TCP реализует процедуру, известную как управление потоком данных (flow control). Управление потоком не позволяет быстродействующему узлу «завалить» пакетами менее быстродействующего потребителя. Каждый TCP-заголовок содержит поле с размером окна приема, значение которого указывает, какой объем приемного буфера доступен отправителю пакетов. С его помощью принимающая сторона сообщает передающему узлу максимальный объем данных, который тот может послать, прежде чем приостановиться в ожидании подтверждения.

Непонятно только на каком этапе соединения, точнее на каком этапе вызова Winsock функций происходит обмен данными о:

...размере окна приема, значение которого указывает, какой объем приемного буфера доступен отправителю пакетов...

→ Ссылка