2

在 TCP New Reno 中,一旦识别出丢包,它将阈值设置为当前 CWND 的一半。我需要找到完成任务的方法。

tcp-l4-protocol.hTcpClassicRecovery用作恢复方法。在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。如果是这样我怎么能改变它?

在此处输入图像描述

4

2 回答 2

1

我找到了答案。问题出在seventh.cc. 它不使用默认的第 4 层 TCP 协议。

为了运行默认的第 4 层 TCP 协议(​​TCP New Reno),我找到了一个示例,即tcp-large-transfer.cc. 它位于ns-3.30/examples/tcp/tcp-large-transfer.cc.

于 2020-04-13T02:27:19.757 回答
0

我只是想添加一个快速说明:更改 cwnd 的代码就在您问题的代码段中。具体来说,就是这一行:

tcb->m_cWnd = tcb->m_ssThresh;

TCP Socket 的大部分状态实际上存储tcbPtr<TcpSocketState>.

于 2020-06-23T06:12:51.467 回答