менной экземпляра определенного агента затрагивает значения, используемые только этим агентом. Например,
Agent/TCP set window_ 100 ;# Изменяет переменную класса $tcp set window_ 2.0 ;# Изменяет, window_ только для объек-
та $tcp
Заданные по умолчанию параметры для каждого агента TCP: Agent/TCP set window_ 20 ;# максимальное значение размера
окна
Agent/TCP set windowInit_ 1 ;# установка/сброс значения
cwnd
Agent/TCP set windowOption_ 1 ;# алгоритм избежания пере-
грузки (1: стандарт)
Agent/TCP set windowConstant_ 4 ;# используется только ко-
гда windowOption! =1
Agent/TCP set windowThresh_ 0.002 ;# используется в вычис-
лении усредненного окна
Agent/TCP set overhead_ 0 ;# !=0 добавляет случайный интер-
вал времени между посылками
Agent/TCP set ecn_ 0 ;# TCP должна реагировать на бит ecn Agent/TCP set packetSize_ 1000 ;# размер пакета, используе-
мый отправителем (байты)
Agent/TCP set tcpTick_ 0.1 ;# таймер гранулирован в секундах (.1– НЕСТАНДАРТ)
Agent/TCP set maxrto_ 64 ;# ограничение на RTO (секунды) Agent/TCP set dupacks_ 0 ;# счетчик копий ACK
Agent/TCP set ack_ 0 ;# самый высокий полученный ACK Agent/TCP set cwnd_ 0 ;# окно перегрузки (пакеты) Agent/TCP set awnd_ 0 ;# усредненный cwnd (эксперимен-
тальный)
Agent/TCP set ssthresh_ 0 ;# порог медленного пуска (паке-
ты)
Agent/TCP set rtt_ 0 ;# отсчет rtt Agent/TCP set srtt_ 0 ;# усредненный rtt
Agent/TCP set rttvar_ 0 ;# значение отклонения rtt отсчета Agent/TCP set backoff_ 0 ;# текущий фактор отсрочки RTO Agent/TCP set maxseq_ 0 ;# максимальный номер посланного
сегмента (пакет)
Для большинства экспериментов, вероятно, немногие пара-
46
метры конфигурации будут требовать модификации. Обычно включают наиболее изменяемые параметры: window_ и packetSize_. Первый из них ограничивает использования окна TCP, и как рассматривалось, играет роль объявления окна получателя в реальной TCP (хотя оно остается постоянным). Размер пакета по существу функционирует подобно размеру MSS в реальной TCP. Изменяя эти параметры, можно оказать сильное влияние на поведение TCP. Обычно TCP с большими размерами пакета, большими окнами и меньшими временами кругооборота (результат топологии и перегрузки) более агрессивны в запрашивании сетевой пропускной способности.
Другие однонаправленные отправители
Reno TCP Агент Reno TCP agent очень подобен агенту Tahoe TCP, кроме этого он также включает быстрое восстановление в тех случаях, когда текущее окно перегрузки"раздуто" числом копий ACK, полученных отправителем TCP перед получением нового ACK. Понятие “ новый ACK” относится к любому ACK, значение которого выше чем наивысшее замеченное до сих пор. Кроме того, агент Reno TCP не возвращается к медленному пуску в течение быстрой повторной передачи. Скорее, он уменьшит установку окна перегрузки на половину текущего окна и сбросит ssthresh_ для соответствия этому значению.
Newreno TCP Этот агент основан на Reno TCP agent, но у которого изменены действия, принимаемые при получении нового ACK. Чтобы выйти на быстрое восстановление, отправитель должен получить ACK для самого высокого посланного номера последовательности. Таким образом, новые “ частичные ACK” (т.е. те, которые представляют новые ACK, но не представляют ACK для всех ожидающих выполнения данных) не уменьшают размеры окна (и возможно ведут к останову, характерному
Reno).
Vegas TCP Этот агент осуществляет “Vegas” TCP.
Sack TCP Этот агент осуществляет выборочное повторение, основанное на выборочных ACK, обеспечиваемых получателем.
Fack TCP Этот агент выполняет “ ускоренный ACK” TCP (модификация Sack TCP).
Linux TCP Этот агент выполняет TCP модули управления перегрузкой, импортированные из Linux ядра. Агент вырабаты-
47
вает результаты моделирования, которые являются совместимыми на уровне траектории окна перегрузки с поведением Linux хостов.
Пользователи моделирования могут модифицировать или импортировать новые модули управления перегрузкой из исходного кода ядра Linux для этого агента. Модули управления перегрузкой Linux компилированы в бинарный код NS-2. Пользователи могут выбирать различные алгоритмы управления перегрузкой, различные параметры модуля управления перегрузки, и различные Linux параметры TCP для различных экземпляров этого агента. Этот агент поддерживает SACK. Получателю, который поддерживает SACK, рекомендуют работать с этим агентом. Есть обучающая программа для использования этого агента.
Реализация этого агента свободно следует за Linux TCP пакетной обработкой маршрутизации и вызывает исходные коды управления перегрузкой из ядра Linux для изменения управлением перегрузкой, связанного с параметрами (например окно перегрузки, порог медленного пуска и т. д.).
Для достижения результатов моделирования, близких к рабочим характеристикам Linux, этот агент заменяет заданные по умолчанию значения следующих параметров согласно парамет-
рам Linux:
Agent/TCP/Linux set maxrto_ 120 Agent/TCP/Linux set ts_resetRTO_ true
Agent/TCP/Linux set delay_growth_ false
TCP получатели (стоки)
Отправители TCP, описанные выше, представляют однонаправленных отправителей данных. Они должны быть одного ранга с объектами “TCP sink”.
Базовый TCP получатель Основной объект TCP sink (Agent/TCPSink) ответствен за возвращение ACK одноранговому объекту TCP отправителя. Он формирует один ACK на полученный пакет. Размер ACK может быть конфигурирован. Создание и конфигурация объекта TCP sink обычно выполняются автоматически запросом библиотеки (см. create-connection выше).
Параметры конфигурации
Agent/TCPSink set packetSize_ 40
48
TCP получатель с задержанными ACK Объект задержанный
ACK агент (Agent/TCPSink/DelAck) доступен получателю TCP
для моделирования для того, чтобы было менее одного ACK на полученный пакет. Этот объект содержит ограничиваемую переменную interval_, которая задает количество секунд для ожидания между ACK. Получатель задержанного ACK осуществляет агрессивную ACK политику, в силу чего задерживаются только ACK для пакетов, поступающих по порядку. Пакеты вне порядка вызывают немедленную генерацию ACK.
Параметры конфигурации
Agent/TCPSink/DelAck set interval_ 100ms
Sack TCP получатели Получатели TCP с выборочным подтверждением (Agent/TCPSink/Sack1) выполняют SACK генерацию, смоделированную после описания SACK в RFC 2018. Этот объект включает ограничиваемую переменную maxSackBlocks_, которая задает максимальное число блоков информации в ACK, доступном для сохраняемой информации SACK. Заданное по умолчанию значение для этой переменной - 3, в соответствии с ожидаемым использованием SACK с RTTM (см. RFC 2018, раздел 3). Отсроченный и выборочный ACK осуществляются со-
вместно объектом типа Agent/TCPSink/Sack1/DelAck.
Параметры конфигурации
Agent/TCPSink set maxSackBlocks_ 3
Архитектура и внутреннее строение
Основной агент TCP (класс Agent/TCP) создан как совокупность программ для посылки пакетов, обработки ACK, управления окном отправителя и обработкой таймаутов. В общем, каждая из этих программ может быть отменена функцией с тем же самым названием в порождающем классе (поэтому осуществлено столько вариантов отправителя TCP).
Заголовок TCP Заголовок TCP определен структурой hdr_tcp в файле ~ns/tcp.h. Основной агент использует только следующую подгруппу полей:
ts_ / * текущее время посылки пакета источником */ ts_echo_ / * для ACKs: поля timestamp из пакета, связанного с
этим ACK */
seqno_ / * номер последовательности для сегмента этих данных или ACK (Примечание: перегрузка!) */
49
reason_ / * устанавливается отправителем при (повторной) передаче для того, чтобы проследить причину для отправки */
Функции для отправки данных Заметим, что вообще отправитель TCP фактически никогда не посылает данных (он устанавливают только размер пакета).
send_much(force, reason, maxburst - эта функция пытается по-
сылать столько пакетов, сколько позволяет окно отправителя. Она также сохраняет трассировку того, сколько пакетов послано и ограничено общим количеством maxburst.
Функция output(seqno, reason) посылает один пакет с данным номером последовательности и обновляет максимум переменной номера последовательности отправителя (maxseq _), чтобы сохранить данный номер последовательности, если он пока самый большой из посланных. Эта функция также назначает различные поля в заголовке TCP (номер последовательности, timestamp, причина для передачи). Эта функция также устанавливает таймер повторной передачи, если он уже не в ожидании.
Функции для управления окна Используемое окно отправителя каждый раз задается функцией window(). Она возвращает минимум окна перегрузки и переменную wnd _, которая представляет объявляемое окно получателя.
opencwnd () - эта функция открывает окно перегрузки. Она вызываться, когда прибывает новый ACK. При медленном пуске функция просто увеличивает cwnd_ с каждым полученным ACK. При предотвращении перегрузки – стандартная конфигурация увеличивает cwnd_ на его обратное значение. Другие опции роста окна в течение избегания перегрузки поддерживаются, но они экспериментальны (и не зарегистрированы).
closecwnd (int, how) - эта функция уменьшает окно перегрузки. Это может быть вызвано несколькими способами: при вводе быстрой повторной передачи из-за истечения таймера, или из-за уведомления перегрузки (установлен бит ECN). Эта переменная указывает как должно быть восстановлено окно перегрузки. Значение 0 используется для таймаутов повторной передачи и быстрой повторной передачи в Tahoe TCP. Это обычно заставляет TCP вводить медленный пуск и уменьшать ssthresh_ до половины текущего окна. Значение 1 используется Reno TCP для осуществления быстрого восстановления (которое избегает возвра-
50