跳转至

TCP 流量应用

组件

  • 发送端:tcp-flow-send-application.cc/h
  • 接收端:tcp-flow-sink.cc/h
  • 调度器:tcp-flow-scheduler.cc/h
  • 辅助类:*-helper.cc/h 系列文件

部署应用

跟前面两节一样,这里依然是存在两种部署方式🚀

部署模式对比

特性 调度器模式 手动模式
配置复杂度 低(自动批量处理) 高(逐流配置)
管理粒度 全局流量管理 单流精细控制
典型场景 多流批量实验 特定流调试

使用调度器

  1. 配置文件设置 (config_ns3.properties):
    Text Only
    1
    2
    3
    enable_tcp_flow_scheduler=true
    tcp_flow_schedule_filename="tcp_flow_schedule.csv"
    tcp_flow_enable_logging_for_tcp_flow_ids=set(0,1)
    
  2. 调度文件格式 (tcp_flow_schedule.csv):
    Text Only
    1
    2
    3
    flow_id,from_node,to_node,size_byte,start_ns,params,metadata
    0,0,1,10000,0,,
    1,0,1,3000,10000,,
    
  3. 代码集成:
    C++
    1
    2
    3
    4
    5
    #include "ns3/tcp-flow-scheduler.h" // 头文件
    
    TcpFlowScheduler scheduler(basicSimulation, topology); // 调度器
    
    scheduler.WriteResults(); // 仿真后输出结果
    

手动安装

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// 接收端配置
TcpFlowSinkHelper sinkHelper("ns3::TcpSocketFactory", InetSocketAddress(Ipv4Address::GetAny(), 1024));
sinkHelper.Install(node_b).Start(Seconds(0));

// 发送端配置
TcpFlowSendHelper senderHelper(
    "ns3::TcpSocketFactory", 
    InetSocketAddress(target_ip, 1024),
    1e9, // 1GB流量
    0,   // 流ID
    true // 启用跟踪
);
senderHelper.Install(node_a).Start(NanoSeconds(0));

流状态监控

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Ptr<TcpFlowSendApplication> tcpFlowSendApp = app_flow_0->GetObject<TcpFlowSendApplication>();

// 获取流的状态
bool is_completed = tcpFlowSendApp->IsCompleted(); // 流发送完了没
bool is_conn_failed = tcpFlowSendApp->IsConnFailed(); // 连接有失败吗
bool is_closed_err = tcpFlowSendApp->IsClosedByError(); // 是因错误暂停的吗
bool is_closed_normal = tcpFlowSendApp->IsClosedNormally(); // 是正常关闭的吗
int64_t sent_byte = tcpFlowSendApp->GetAckedBytes();
int64_t fct_ns; // flow complete time 流完成时间,常表示拥塞程度,单位是ns
if (is_completed) {
    fct_ns = tcpFlowSendApp->GetCompletionTimeNs() - entry.start_time_ns;
} else {
    fct_ns = m_simulation_end_time_ns - entry.start_time_ns;
}
std::string finished_state;
if (is_completed) {
    finished_state = "YES";
} else if (is_conn_failed) {
    finished_state = "NO_CONN_FAIL";
} else if (is_closed_normal) {
    finished_state = "NO_BAD_CLOSE";
} else if (is_closed_err) {
    finished_state = "NO_ERR_CLOSE";
} else {
    finished_state = "NO_ONGOING";
}

日志文件解析

文件名 格式
tcp_flows.csv flow_id,from,to,size_byte,start_ns,end_ns,duration_ns,sent_byte,status
tcp_flows.txt 人类可读格式,包含流完成状态标记(YES/NO_*系列状态码)

状态码说明

  • YES: 成功完成
  • NO_CONN_FAIL: 连接失败
  • NO_BAD_CLOSE: 异常关闭
  • NO_ERR_CLOSE: 错误关闭
  • NO_ONGOING: 未完成