TCP обеспечивает управление потоком .Стек TCP (как на стороне отправителя, так и на стороне получателя) сможет буферизовать некоторые данные для вас, и это обычно делается в ядре ОС.
Когда буферы получателя заполняются, отправитель узнает ои прекратить отправку большего количества данных, что в конечном итоге приведет к блокировке отправляющего приложения (или, в противном случае, к невозможности отправки большего количества данных), пока пространство снова не станет доступным.
Вкратце, каждый отправленный пакет TCP (сегмент) включает размер данных, которые могут быть буферизованы - размер окна.Это означает, что другой конец всегда знает, сколько данных он может отправить без того, чтобы получатель не выбросил их, потому что буферы заполнены.Если размер окна становится равным 0, буферы заполнены, и больше не будут отправляться данные (и в случае блокирования отправителя вызов send()
будет блокироваться), Theres процедуры для проверки того, равно ли окно tcp 0, поэтому отправкаможет возобновить работу после того, как данные были использованы.
Здесь есть некоторые подробности здесь