Hi,
I am Hira. Kindly if someone has any experience with Quick Start
implementation of TCP in ns2.31 or ns 2.34 , reply. I am detailed the
problems that i faced.
Thank you in advance.
*Problem:*
I have compiled and tested the Quick Start (QS) TCP implementation in ns
2.31 and 2.34. I have compared throughput results with SACK. If comparison
of instantaneous throughput is drawn yes it comes closely to SACK. but
regards congestion window behaviour and if i calculate average throughput in
QS implemented TCP sources the variations are not much different from normal
TCP implementations.
*A brief on the simulation scenario:*
3 nodes. 1 sender node, 1 act as Base station node and 1 node acts as a
mobile node.
links are configured to: *ns duplex_link $W1 $W2 1Mb 15ms DropTail*
* ns duplex_link $W2 $W3 550Kb
15ms DropTail - the last mile*
3 TCP/Reno sources starting at 0 secs.
*What I have observed by debugging is:**
*
1. In TCP.cc file there is a function 'process quickstart'. In it there is
an 'If' statement that compares ttl_diff at sender with ttl_diff of receiver
according to the QS algorithm. Well these two values never equal. I have
configured the nodes with statement in tcl as $ns node-config-QS ON, and put
QS/Agent set qs_enabled_ false and put TCP set qs_enabled _ true (i have
double checked these values from the test files present in ns2.31/tcl/test/
test-suite-quickstart.tcl) ...
2. I defined a source file where I changed values for TCP QS parameters
such as $tcp1 set window_ 10000 $tcp1 set rate_request_ 20 ... and after
every 0.5 seconds different window and rate_requests were generated..
However the TCP and QS modules weren't able to take these values. The QS
only invoked for the first request. But it never got approved since ttl_diff
at sender and receiver never equaled.
3. Also, I changed the link of the last mile as in alternated it to act as a
link first having 550Kb and than 1Mb. and changed the TCP QS parameters of
window and rate request. But nothing seemed to happen.
4. Also for your reference, I set the following parameters for QS mode. I am
including all the parameters for QS/Agent as well as TCP/Agent that I
enabled for QS:*
*
*# parameters for QS*
set opt(qs) 0
set opt(qs_alloc_rate) 0.75
set opt(qs_threshold) 0.75
set opt(qs_state_delay) 0.35
set opt(qs_request_mode) 2
set opt(qs_algorithm) 3
set opt(qs_rate_request) 40
set opt(qs_rtt) 50
set opt(util_records) 3
set opt(util_weight) 2
set opt(qs_rate_function) 1
set opt(tcp_qs_recovery) true
set opt(qs_set_ssthresh) 4 // this is from the default.tcl file .....
Queue set util_weight_ $opt(util_weight)
Queue set util_records_ $opt(util_records)
Agent/QSAgent set alloc_rate_ $opt(qs_alloc_rate)
Agent/QSAgent set qs_enabled_ $opt(qs) // I have
even checked this by putting it 1
Agent/QSAgent set state_delay_ $opt(qs_state_delay)
Agent/QSAgent set rate_function_ $opt(qs_rate_function)
Agent/QSAgent set algorithm_ $opt(qs_algorithm)
Agent/QSAgent set threshold_ $opt(qs_threshold)
Agent/TCPSink set qs_enabled_ true
Agent/TCP/Newreno set qs_enabled_ true
Agent/TCP/Reno set qs_enabled_ true
if {$opt(qs)} {
Agent/TCP set tcp_qs_recovery_ $opt(tcp_qs_recovery)
Agent/TCP/Reno set tcp_qs_recovery_ $opt(tcp_qs_recovery)
}
Agent/TCP/Reno set qs_request_mode_ $opt(qs_request_mode)
Agent/TCP/Reno set qs_thresh_ $opt(qs_set_ssthresh)
Agent/TCP/Reno set rate_request_ $opt(qs_rate_request)
Agent/TCP/Reno set qs_rtt_ $opt(qs_rtt)
Agent/TCP/Newreno set qs_request_mode_ $opt(qs_request_mode)
Agent/TCP/Newreno set qs_thresh_ $opt(qs_set_ssthresh)
Agent/TCP/Newreno set rate_request_ $opt(qs_rate_request)
Agent/TCP/Newreno set qs_rtt_ $opt(qs_rtt)
5. I debugged the tcp.cc, reno.cc, qs_hdr.cc, QSagent.cc. Below is the
sequence of the functions called.
Here is the set of printf statements:
Called from TCP.cc for sender ttl_diff: -127
QS Response is being made in TCPSink ttl: -129
QS request is called from Reno sender
Process QS in TCP.cc is called
*flag: 2 ttl: -129 ttl_diff: -127 rate: 2*
The last line shows : flag= QS response, ttl = receiver side
ttl_diff, diff = sender side ttl, which is displayed from process
quickstart function in tcp.cc
The reason I feel that the QS is not being approved is the ttl_diff at
sender and receiver are not same.
Perhaps because the nodes are not decrementing the qs->ttl? I have
configured the nodes by the way it has been done in test.tcl for quickstart
that I found in ns2.31/tcl/test/test-all-quickstart.tcl ... I have also
checked my code by setting $my_node set qs_agent_ [new agent/QSAgent], to
check if now the node works as QS agent or QS/Agent.cc is called.. but to no
avail.
6. A final word, I fixed/hard coded the value for ttl_diff at sender and
receiver inside the tcp.cc code, the QS got approved and the cwnd in the
start rose to 47, 28, 20 for the three reno sources.
*Kindly if someone is working on/ or has worked with Quick start TCP in ns2,
please reply. *
Regards.
Hira Samir.