В том месте, где TCP New Reno устанавливает пороговое значение после отбрасывания пакета в NS3
В TCP New Reno он устанавливает пороговое значение на половину текущего CWND, как только обнаруживается отбрасывание пакета. Мне нужно найти метод, который решит эту задачу.
В tcp-l4-protocol.h
оно использует TcpClassicRecovery
как метод восстановления. ВTcpClassicRecovery
входя в фазу, он использует следующий сегмент кода для установки текущего CWND,
void
TcpClassicRecovery::EnterRecovery (Ptr<TcpSocketState> tcb, uint32_t dupAckCount,
uint32_t unAckDataCount, uint32_t lastSackedBytes)
{
NS_LOG_FUNCTION (this << tcb << dupAckCount << unAckDataCount << lastSackedBytes);
NS_UNUSED (unAckDataCount);
NS_UNUSED (lastSackedBytes);
tcb->m_cWnd = tcb->m_ssThresh;
tcb->m_cWndInfl = tcb->m_ssThresh + (dupAckCount * tcb->m_segmentSize);
}
Тогда я предполагаю, прежде чем позвонить EnterRecovery
метод cwnd уже обновлен. Мне нужно найти место, где обновляется cwnd.
Я также обновил TcpNewReno::GetSsThresh
и проанализировал вывод. Но это также не тот метод, который мне нужен, поскольку он не сокращает cwnd вдвое.
ПРИМЕЧАНИЕ: я использую seventh.cc
проверить cwnd. Всегда опускает cwnd до 1072. График, который я получаю, тоже включен. Что мне нужно сделать, так это сбросить cwnd до половины значения после отбрасывания пакета. Может бытьseventh.cc
не использует значение по умолчанию tcp-l4-protocol.h
. Если да, то как я могу это изменить?
2 ответа
Я нашел ответ. Проблема была вseventh.cc
. Он не использует протокол TCP уровня 4 по умолчанию.
Чтобы запустить протокол TCP уровня 4 по умолчанию (TCP New Reno), я нашел пример, который tcp-large-transfer.cc
. Он расположен вns-3.30/examples/tcp/tcp-large-transfer.cc
.
Я просто хотел добавить небольшое примечание: код для изменения cwnd находится в самом фрагменте вашего вопроса. В частности, это строка:
tcb-> m_cWnd = tcb-> m_ssThresh;
Большая часть состояния сокета TCP фактически хранится в tcb
который является Ptr<TcpSocketState>
.