Saturday, Sep 04th

Last update09:09:00 PM GMT

Вы находитесь на: FreeBSD Сетевые протоколы Отложенные подтверждения и обновления окон

Отложенные подтверждения и обновления окон

TCP-пакеты должны передаваться и по другим причинам, кроме передачи данных. В одностороннем соединении принимающий TCP по-прежнему должен посылать пакеты для подтверждения полученных данных и перемещения окна отправки отправителя. При передаче большого количества данных время, с которым отправляются обновления окон, является определяющим фактором для пропускной способности сети.

Например, если получатель просто устанавливает флаг TFDELACK каждый раз, когда были получены данные в соединении с большим количеством данных, подтверждения отправлялись бы каждые 200 миллисекунд. Если используются 8192-октетные окна в 10 Мбит/с Ethernet, этот алгоритм приведет к максимальной пропускной способности 320 Кбит/с, или 3,2 процента от физической пропускной способности сети.

Очевидно, раз отправитель заполнил данное окно отправки, он должен остановиться до тех пор, пока получатель не подтвердит старые данные (позволив удалить их из буфера отправки и заменить их новыми данными) и не предоставит обновление окна (позволив отправлять новые данные).
Поскольку основанное на окнах управление потоком TCP ограничено местом в приемном буфере сокета, TCP устанавливает в своем элементе переключения протокола флаг PRRCVD таким образом, что протокол будет вызываться (через процедуру tcp_usr_rcvd()), когда пользователь сделал принимающий вызов, который удалил данные из приемного буфера.

Процедура tcp_usr_rcvd() просто вызывает tcp_output(). Каждый раз, когда tcp_output() определяет, что обновление окна, отправленное в текущих условиях, предоставило бы отправителю новое окно отправки, достаточно большое, чтобы представлять ценность, она отправляет подтверждение и обновление окна. Если получатель будет ждать до тех пор, пока окно заполнится, отправитель на самом деле в течение некоторого времени будет бездействовать, пока не получит в конце концов обновление окна.

Более того, если бы буфер отправки в отправляющей системе был меньше, чем буфер принимающего, - и поэтому меньше, чем окно получателя, -отправитель не смог бы заполнить окно получателя, не получив подтверждения. Поэтому стратегия обновления окна в FreeBSD основана лишь на максимальном размере сегмента. Каждый раз, когда новое обновление окна переместило бы окно вперед на по крайней мере два полных размера сегмента, отправляется обновление окна. Эта стратегия обновления окна создает двойное уменьшение трафика обновлений и двойное уменьшение обработки ввода для отправителя. Однако обновления отправляются достаточно часто, чтобы предоставить отправителю обратную связь о ходе соединения и чтобы позволить отправителю посылать дополнительные сегменты.

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

Сейчас 16 гостей онлайн

Реклама на сайте: