You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NS2.35启动TCP时出现未知错误的技术求助

NS2.35 TCP启动错误排查及解决方法

问题背景

使用NS2.35搭建10节点环形拓扑,包含2个发送节点、2个接收节点、6个中继节点,一对收发采用TCP协议,另一对采用UDP。编写Tcl代码后,启动TCP时出现模糊错误。

原代码如下:

set ns [new Simulator]
#the nam trace file
set nf [open out.nam w]
$ns namtrace-all $nf


#finish procedure

proc finish {} {
global ns nf
$ns flush-trace
#close the trace file
close $nf
#executenam on the trace file
exec nam out.nam &
exit 0
}

array set nodes {}

for {set i 0} {$i < 10} {incr i} {
    set nodes($i) [$ns node]
}


proc selectSenderReceiver {} {
    global nodes
    set sender [expr int(rand()*10)]  ;# choose a random sender node index (0-9)
    set receiver [expr int(rand()*10)]  ;# choose a random receiver node index (0-9)
    
    # ensure sender and receiver are different and not relay nodes
    while {$sender == $receiver || $sender > 7 || $receiver > 7} {
        set sender [expr int(rand()*10)]
        set receiver [expr int(rand()*10)]
    }
    
    return [list $nodes($sender) $nodes($receiver)]
}



set pair1 [selectSenderReceiver]
set pair2 [selectSenderReceiver]

set sender1 [lindex $pair1 0]
set receiver1 [lindex $pair1 1]

set sender2 [lindex $pair2 0]
set receiver2 [lindex $pair2 1]


# create links between the nodes
$ns duplex-link $nodes(0) $nodes(1) 1Mb 10ms DropTail
$ns duplex-link $nodes(1) $nodes(2) 1Mb 10ms DropTail
$ns duplex-link $nodes(2) $nodes(3) 1Mb 10ms DropTail
$ns duplex-link $nodes(3) $nodes(4) 1Mb 10ms DropTail
$ns duplex-link $nodes(4) $nodes(5) 1Mb 10ms DropTail
$ns duplex-link $nodes(5) $nodes(6) 1Mb 10ms DropTail
$ns duplex-link $nodes(6) $nodes(7) 1Mb 10ms DropTail
$ns duplex-link $nodes(7) $nodes(8) 1Mb 10ms DropTail
$ns duplex-link $nodes(8) $nodes(9) 1Mb 10ms DropTail
$ns duplex-link $nodes(9) $nodes(0) 1Mb 10ms DropTail

# set orientation for visualization
$ns duplex-link-op $nodes(0) $nodes(1) orient right
$ns duplex-link-op $nodes(1) $nodes(2) orient right
$ns duplex-link-op $nodes(2) $nodes(3) orient down
$ns duplex-link-op $nodes(3) $nodes(4) orient down
$ns duplex-link-op $nodes(4) $nodes(5) orient left
$ns duplex-link-op $nodes(5) $nodes(6) orient left
$ns duplex-link-op $nodes(6) $nodes(7) orient up
$ns duplex-link-op $nodes(7) $nodes(8) orient up
$ns duplex-link-op $nodes(8) $nodes(9) orient right
$ns duplex-link-op $nodes(9) $nodes(0) orient right


set tcp [new Agent/TCP]
$ns attach-agent $sender1 $tcp
set sink1 [new Agent/TCPSink]
$ns attach-agent $receiver1 $sink1
$ns connect $tcp $sink1
$ns at 0.1 "$tcp set dataSize_ 1000"  ;# set packet size for TCP

set udp [new Agent/UDP]
$ns attach-agent $sender2 $udp
set sink2 [new Agent/Null]
$ns attach-agent $receiver2 $sink2
$ns connect $udp $sink2
$ns at 0.1 "$udp set packetSize_ 1000"  ;# set packet size for UDP

# schedule events
$ns at 1.0 "$tcp start"
$ns at 1.5 "$udp send -1"

# call finish procedure at end of simulation
$ns at 2.0 "finish"

# run
$ns run

错误信息

ns: _o240 start: 
    (_o240 cmd line 1)
    invoked from within
"_o240 cmd start"
    invoked from within
"catch "$self cmd $args" ret"
    invoked from within
"if [catch "$self cmd $args" ret] {
set cls [$self info class]
global errorInfo
set savedInfo $errorInfo
error "error when calling class $cls: $args" $..."
    (procedure "_o240" line 2)
    (SplitObject unknown line 2)
    invoked from within
"_o240 start"

问题原因

  1. TCP Agent未绑定应用层模块:NS2中TCP仅作为传输层代理,本身不会生成流量,必须绑定Application/FTP这类应用层组件才能产生数据。直接调用$tcp start会因无数据可发送触发错误。
  2. TCP数据包大小设置错误:dataSize_是应用层(如FTP)的参数,不能直接在TCP Agent上设置,需在绑定的FTP应用上配置。
  3. 随机节点选择逻辑存在重复风险:原代码未限制pair1和pair2为不同的收发对,可能出现两组收发节点完全相同的情况。

解决步骤

  1. 为TCP Agent绑定FTP应用,通过FTP启动流量,而非直接启动TCP Agent。
  2. 将TCP数据包大小的设置转移到FTP应用上。
  3. 优化随机节点选择逻辑,确保两组收发对不重复。

修正后的完整代码

set ns [new Simulator]
# the nam trace file
set nf [open out.nam w]
$ns namtrace-all $nf

# finish procedure
proc finish {} {
    global ns nf
    $ns flush-trace
    close $nf
    exec nam out.nam &
    exit 0
}

array set nodes {}
for {set i 0} {$i < 10} {incr i} {
    set nodes($i) [$ns node]
}

# 优化节点选择逻辑:确保两组收发对不重复
proc selectSenderReceiver {used_pairs} {
    global nodes
    while 1 {
        set sender [expr int(rand()*10)]
        set receiver [expr int(rand()*10)]
        
        # 确保收发节点不同,且属于非中继节点(0-7)
        if {$sender != $receiver && $sender <=7 && $receiver <=7} {
            set pair [list $sender $receiver]
            set reverse_pair [list $receiver $sender]
            # 检查是否已被使用
            if {![lsearch $used_pairs $pair] != -1 && ![lsearch $used_pairs $reverse_pair] != -1} {
                lappend used_pairs $pair
                return [list $nodes($sender) $nodes($receiver) $used_pairs]
            }
        }
    }
}

set used_pairs [list]
set result1 [selectSenderReceiver $used_pairs]
set pair1 [lrange $result1 0 1]
set used_pairs [lindex $result1 2]

set result2 [selectSenderReceiver $used_pairs]
set pair2 [lrange $result2 0 1]

set sender1 [lindex $pair1 0]
set receiver1 [lindex $pair1 1]

set sender2 [lindex $pair2 0]
set receiver2 [lindex $pair2 1]

# 创建环形链路
$ns duplex-link $nodes(0) $nodes(1) 1Mb 10ms DropTail
$ns duplex-link $nodes(1) $nodes(2) 1Mb 10ms DropTail
$ns duplex-link $nodes(2) $nodes(3) 1Mb 10ms DropTail
$ns duplex-link $nodes(3) $nodes(4) 1Mb 10ms DropTail
$ns duplex-link $nodes(4) $nodes(5) 1Mb 10ms DropTail
$ns duplex-link $nodes(5) $nodes(6) 1Mb 10ms DropTail
$ns duplex-link $nodes(6) $nodes(7) 1Mb 10ms DropTail
$ns duplex-link $nodes(7) $nodes(8) 1Mb 10ms DropTail
$ns duplex-link $nodes(8) $nodes(9) 1Mb 10ms DropTail
$ns duplex-link $nodes(9) $nodes(0) 1Mb 10ms DropTail

# 设置可视化方向
$ns duplex-link-op $nodes(0) $nodes(1) orient right
$ns duplex-link-op $nodes(1) $nodes(2) orient right
$ns duplex-link-op $nodes(2) $nodes(3) orient down
$ns duplex-link-op $nodes(3) $nodes(4) orient down
$ns duplex-link-op $nodes(4) $nodes(5) orient left
$ns duplex-link-op $nodes(5) $nodes(6) orient left
$ns duplex-link-op $nodes(6) $nodes(7) orient up
$ns duplex-link-op $nodes(7) $nodes(8) orient up
$ns duplex-link-op $nodes(8) $nodes(9) orient right
$ns duplex-link-op $nodes(9) $nodes(0) orient right

# TCP配置:绑定FTP应用
set tcp [new Agent/TCP]
$ns attach-agent $sender1 $tcp
set sink1 [new Agent/TCPSink]
$ns attach-agent $receiver1 $sink1
$ns connect $tcp $sink1

set ftp [new Application/FTP]
$ftp attach-agent $tcp
$ns at 0.1 "$ftp set packetSize_ 1000"  ;# 在FTP上设置数据包大小

# UDP配置
set udp [new Agent/UDP]
$ns attach-agent $sender2 $udp
set sink2 [new Agent/Null]
$ns attach-agent $receiver2 $sink2
$ns connect $udp $sink2
$ns at 0.1 "$udp set packetSize_ 1000"

# 调度事件:启动FTP而非TCP
$ns at 1.0 "$ftp start"
$ns at 1.5 "$udp send -1"

$ns at 2.0 "finish"
$ns run

内容的提问来源于stack exchange,提问作者O Z

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 22:38:09