Пусть скорость подключения хостов и сервера одинаковая, например, 100 Мбит/сек. Если хост 1 будет обмениваться данными с сервером на скорости 60 Мбит/сек. То если хост 2 захочет отправить данные на сервер он столкнется с проблемами, его скорость передачи данных не может быть больше 40 Мбит/сек. Даже если на сервере есть свободное место в буфере на прием данных. Так как подключение сервера до свитча всего 100 Мбит/сек.
Еще одна, вполне жизненная ситуация, когда у вас скорость подключения к вашему домашнему роутеру больше, чем скорость, которую предоставляет вам провайдер. Например, вы подключились к своему домашнему Wi-FI роутеру по стандарту IEEE 802.11n (скорость до 600 Мбит/сек), а у вашего провайдера вы купили тариф, по которому скорость передачи данных не более 10 Мбит/сек. Значит, при обмене данными с серверами из сети Интернет вы не сможете отправлять данные быстрей, чем 10 Мбит/сек. А если у вас дома есть еще и другие сетевые устройства (ноутбук, телефоны, …), то ваша скорость передачи данных будет еще меньше.
Все это означает, что во время передачи данных по TCP нельзя ориентироваться только на размер свободного места в буфере на прием.
Задача TCP, определить самое узкое место на пути следования пакета (узкое горлышко, bottleneck) и ограничить скорость передачи данных пропускной способностью этого места.
Как определить узкие места в сети без информации о топологии сети? На самом деле нет нужды определять где именно находится узкое горлышко, достаточно определить, что оно где-то есть и адаптировать скорость передачи данных.
Давайте еще раз посмотрим на рисунок выше. Разбирая этот пример мы предположили, что хост 1 передает на сервер данные со скоростью 60 Мбит/сек, а хост 2 передает на сервер данные со скоростью 40 Мбит/сек. Узким горлышком на схеме будет подключение сервера к свитчу.
На свитч от хоста 1 и хоста 2 данные могут приходить со скоростью по 100 Мбит/сек от каждого, итого, суммарно, 200 Мбит/сек. А выходная скорость от свитча к серверу всего 100 Мбит/сек.
Если сетевое оборудование не успевает передавать пакеты в сеть, оно начинает их размещать в буфере на отправку и ждать, пока освободится канал для передачи. Как это показано на рисунке ниже.
На рисунке пакеты 1 и 2 успешно передаются на хост, а пакеты 3 и 4 расположись в буфере на отправку. Это означает, что время доставки пакетов 3 и 4 до сервера будет больше, чем время доставки пакетов 1 и 2. Чем больше пакетов будет в буфере на отправку, тем больше будет время их доставки.
Таким образом, измеряя время доставки пакетов можно обнаружить момент попадания пакетов в буфер и начать снижать скорость передачи данных.
Еще одним способ определения узкого горлышка является потеря пакета. Если во время передачи данных пакет потерялся, значит есть большая вероятность того, что он не поместился даже в буфер и был отброшен устройством.