Открыл для себя мир разнообразных алгоритмов управления контролем потока TCP в FreeBSD'шном стеке TCP/IP. По умолчанию используется sysctl net.inet.tcp.cc.algorithm=newreno
, он же единственный в списке sysctl net.inet.tcp.cc.available
.
Но достаточно было сделать kldload cc_chd
и sysctl net.inet.tcp.cc.algorithm=chd
, как скорость загрузки файла через ssh с удаленного сервера, до которого 11 хопов, 128ms rtt (и иногда бывают потери пакетов в незначительном количестве) стала разгоняться не до 55-60Kbyte/s, а до 75-80, а иногда и до 90Kbyte/s. Плюс первоначальный разгон скорости быстрее (видно невооруженным взглядом) и после притормаживаний сети шустрее возвращается на прежнюю скорость.
Эффект воспроизводимый. Оставлю так, пожалуй. Пробовал ещё cc_hd, cc_cubic, cc_htcp и cc_vegas, но в данных условиях они такого впечатляющего результата не дали. Все алгоритмы пробовал на дефолтных настройках.
Возможность тасовать эти алгоритмы появилась в FreeBSD, начиная с версий 8.3-RELEASE и 9.0-RELEASE.
Update: удалённый сервер - тоже FreeBSD, тоже под моим контролем и настройки менял синхронно на сервере и на клиенте.
Заметки на манжетах: оверхед в сети Ethernet.
При отправке одного пакета с 64 байтами данных протоколом UDP (оверхеда меньше, чем в TCP) по сети Ethernet имеем в линии:
- 8 байтов преамбулы и маркера "начало фрейма"
- 14 байт заголовка Ethernet (без тегов)
- 20 байт заголовка IP
- 8 байт заголовка UDP
- 64 байта данных
- 4 байта FCS
- 12 байт межпакетного промежутка
Итого, 130 байт. При использовании VLAN - 134 байта, при Q-in-Q - 138 байт.
Источник: http://download.intel.com/design/network/applnots/ap450.pdf, с. 14.
Оверхед более 100%. При стандартном MTU=1500 для IP-пакета полезных данных внутри нефрагментированного UDP может быть не более 1472 байт, оверхед от 4.5% до 5.3%. Для TCP добавляется ещё 12-52 байта оверхеда на каждый пакет, но там скорость дополнительно ограничивается задержками в линии.
Даже если отвлечься от задержек: для передачи данных по TCP через Ethernet с MTU=1500 максимальный размер сегмента будет 1460 байт (за вычетом 20 байт заголовка IP и минимум 20 байт заголовка TCP), целиком такой фрейм в линии с учётом всех заголовков займёт минимум 1538 байт. Оверхед более 5%. Это значит, что при копировании файла по сети со скоростью, скажем, 8 мегабайт в секунду в Ethernet будет занята полоса не в 8*8=64 мегабита, а 8*1024*1024*8*1.05, что более 70 миллионов бит из 100 миллионов номинальной скорости FastEthernet.