使用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"
问题原因
- TCP Agent未绑定应用层模块:NS2中TCP仅作为传输层代理,本身不会生成流量,必须绑定
Application/FTP这类应用层组件才能产生数据。直接调用$tcp start会因无数据可发送触发错误。 - TCP数据包大小设置错误:
dataSize_是应用层(如FTP)的参数,不能直接在TCP Agent上设置,需在绑定的FTP应用上配置。 - 随机节点选择逻辑存在重复风险:原代码未限制
pair1和pair2为不同的收发对,可能出现两组收发节点完全相同的情况。
解决步骤
- 为TCP Agent绑定FTP应用,通过FTP启动流量,而非直接启动TCP Agent。
- 将TCP数据包大小的设置转移到FTP应用上。
- 优化随机节点选择逻辑,确保两组收发对不重复。
修正后的完整代码
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
相关产品推荐
相关产品推荐

