Howdy!

Frank Schuster wrote:
iperf knows only what the operating system tells it, so the answer to
this question does not depend on iperf but on the operating system.
For both UDP and TCP what the sending side reports is what has been
sent, NOT what has been received. So it can differ between the sending
and receiving side. But for TCP it cannot differ for long, because in
case of a network problem the TCP socket buffer on the sending side
will fill up and eventually block the sender.

Do I understand it right that iperf on the client site doesn't calculate the 
true bandwidth?
Because the client sends a lot of data but it doesn't know, if the server 
receives this packages.
Only by TCP and SCTP the client will a little bit regulate by the ACKs but it 
has no effect on the measurement on the client site.

Is this correct or is there someting wrong, what I have written?

If it correct, I get the true bandwidth only from the server site?
Because there I can see all packages which have reached the server.

Let's get a bit theoretical here: take a look at diagram of 7 OSI layers. iperf is an ordinary application which talks to the other end (iperf on server) through several network layers. This means that iperf as an application doesn't have accurate idea about what happens in lower layers.

When one runs TCP tests, there are 2 things that block iperf from having clear view of real throughput: buffering on sender's side (TCP/IP stack) and TCP behaviour itself (acking). What iperf can measure is the pace with which it sends data to TCP/IP stack; TPC/IP stack will only accept data from application when buffers are not full. If the buffer is huge, iperf will see hisgh throughput initially, then it will drop. If there's congestion or retrasmission going on, iperf will see it as lower throughput. Receiving is a bit better as Rx buffers tend to be more or less empty (assuming receiver has enough CPU power to consume all packets thrown at it). Application can be pretty sure that receiver got data as TCP itself takes care of reliable delivery of data, so client can more or less reliably tell the throughput. Acknowledgement of TCP, on the other hand, means that theoretical throughput can almost never be achieved due to latency, asimetricity and other problems.

When one runs UDP tests, only buffering blocks iperf from having clear view of throughput. But: UDP doesn't guarantee end-to-end delivery, so if there's some congestion, UDP packets get dropped. Sender only knows the pace it's own IP stack transmits packets and doesn't have any idea about wether they are being delivered to receiver or not. Unless receiver reports that to sender, but that's application's task. Iperf does that every now and then (eg. every 10 seconds or so). One example: say you have one host (A) with giga-ethernet connectivity and another one host (B) with slow dial-up connectivity. You can instruct iperf on host A to run UDP test against host B and send data with 500 Mbps. Most of it will get dropped (unless some routers in between are buggy enough to get overflowed) and host B will receive data at, say, 50 kbps. Iperf on host A doesn't know it unless iperf on host B tells it. Reporting UDP throughput frequently goes against whole UDP idea, hence reporting every now and then. Iperf on host B, however, has perfect idea about real throughput A -> B iff it can process all packets that arrive. While it might be possbile to insert giga-ethernet card into a slow PII machine I sincerely doubt it could even receive data at wire speed, hence iperf wouldn't see whole truth.


I think there is also some additional iperf magic handshake at the end
of the test, not sure. The source code is your friend here.

Yeah, I think really there are some "magic" Handshakes but nobody no which.

There's a lot of magic handshake goind on. Most of it is probably hidden inside dummy data being sent between client and server. Similar to well known ping command: it prints out round trip delay. It can do it only because it actually sends time stamp when sending ICMP ECHO REQUEST inside the packet payload and the other end includescopies the same payload into ICMP ECHO REPLY packet. After receiving, ping can calculate time difference. There's one limitation: requested payload size must be at least 16 bytes to fit timestamp.

--

Peace!
 Mkx

-- perl -e 'print $i=pack(c5,(41*2),sqrt(7056),(unpack(c,H)-2),oct(115),10);'
-- echo 16i[q]sa[ln0=aln100%Pln100/snlbx]sbA0D4D465452snlb xq | dc

------------------------------------------------------------------------

BOFH excuse #277:

Your Flux Capacitor has gone bad.

------------------------------------------------------------------------------
Come build with us! The BlackBerry(R) Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay 
ahead of the curve. Join us from November 9 - 12, 2009. Register now!
http://p.sf.net/sfu/devconference
_______________________________________________
Iperf-users mailing list
Iperf-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iperf-users

Reply via email to