udp-sender - broadcast file on a LAN
udp-sender [--file file] [--full-duplex] [--half-duplex]
[--pipe pipe] [--portbase portbase] [--blocksize size]
[--interface net-interface] [--mcast-data-address
data-mcast-address] [--mcast-rdv-address mcast-rdv-address]
[--max-bitrate bitrate] [--pointopoint] [--async] [--log file]
[--min-slice-size min] [--max-slice-size max] [--slice-size]
[--ttl time-to-live] [--fec
stripesxredundancy/stripesize] [--print-seed]
[--rexmit-hello-interval interval] [--autostart autostart]
[--broadcast] [--min-receivers receivers] [--min-wait sec]
[--max-wait sec] [--nokbd] [--retries-until-drop n]
[--bw-period n] [--rate-governor
module.so:key1=value1,key2=value2] [--stat-period n]
[--print-uncompressed-position flag]
"Udp-sender" is used to
broadcast a file (for instance a disk image) to multiple
"udp-receivers" on the local LAN. In order
to do this, it uses Ethernet multicast or broadcast, so that all receivers
profit from the same physical datastream. Thus, sending to 10 destinations
does not take more time than it would take to send just 2.
- --file file
- Reads data to be transmitted from file. If this parameter is not
supplied, data to be transmitted is read from stdin instead.
- --pipe command
- Sends data through pipe before transmitting it. This is useful for
compressing/decompressing it, or for stripping out unused blocks. The
command gets a direct handle on the input file or device, and thus
may seek inside it, if needed. "Udpcast"
itself also keeps a handle on the file, which is used for an informal
progress display. The command's stdout is a pipe to udpcast.
- --autostart
n
- Starts transmission after n retransmissions of hello packet,
without waiting for a key stroke. Useful for unattended operation, where
udp-sender is started from a cron-job for a broadcast/multicast at a
scheduled time.
The following networking options should be supplied both on the
sender and the receivers:
- --portbase
portbase
- Default ports to use for udpcast. Two ports are used: portbase and
portbase+1 . Thus, Portbase must be even. Default is
9000. The same portbase must be specified
for both "udp-sender" and
"udp-receiver".
- --interface
interface
- Network interface used to send out the data. Default is
"eth0"
- --ttl time to
live
- Sets the time-to-live parameter for the multicast packets. Should
theoretically allow to use UDPCast beyond the local network, but not
tested for lack of a multicast router.
- --mcast-rdv-address
address
- Uses a non-standard multicast address for the control (rendez-vous)
connection. This address is used by the sender and receivers to
"find" each other. This is not the address that is used
to transfer the actual data.
By default
"mcast-rdv-address" is the Ethernet
broadcast address if "ttl" is 1, and
224.0.0.1 otherwise. This setting should not be
used except in very special situations, such as when
224.0.0.1 cannot be used for policy reasons.
The following networking options should be supplied only on the
sender:
- --mcast-data-address
address
- Uses the given address for multicasting the data. If not specified, the
program will automatically derive a multicast address from its own IP (by
keeping the last 27 bits of the IP and then prepending 232).
- --pointopoint
- Point-to-point mode. Only a single receiver is allowed, but the data will
be directly send to this receiver (in unicast mode), rather than
multicast/broadcast all over the place. If no async mode is chosen, and
there happens to be only one receiver, point-to-point is activated
automatically.
- --nopointopoint
- Don't use point-to-point, even if there is only one single receiver.
- --full-duplex
- Use this option if you use a full-duplex network. T-base-10 or 100 is full
duplex if equipped with a switch. Hub based networks, or T-base-2 networks
(coaxial cable) are only half-duplex and you should not use this
option with these networks, or else you may experience a 10% performance
hit.
N.B. On high-latency WAN links, the full-duplex option can
lead to substantial performance improvements, because it allows
udp-sender to send more data while it is still waiting for the previous
batch to get acknowledged.
- --half-duplex
- Use half duplex mode (needed for Hub based or T-base-2 networks). This is
the default behavior in this version of udpcast.
- --broadcast
- Use Ethernet broadcast, rather than multicast. Useful if you have Ethernet
cards which don't support multicast.
By default, "udpcast" uses
multicast. This allows sending the data only to those receivers that
requested it. Ethernet cards of machines which don't participate
in the transmission automatically block out the packets at the hardware
level. Moreover, network switches are able to selectively transmit the
packets only to those network ports to which receivers are connected.
Both features thus allow a much more efficient operation than broadcast.
This option should only be supplied on the sender.
- -b blocksize
- Choses the packet size. Default (and also maximum) is 1456.
The options described below are useful in situations where no
"return channel" is available, or where such a channel is
impractical due to high latency. In an unidirectional setup (i.e. without
return channel), the sender only sends data but doesn't expect any reply
from the receiver.
Unidirectional options must be used together, or else the transfer
will not work correctly. You may for example use the following command
line:
"udp-sender --async --max-bitrate 10m --fec
8x8"
- --async
- Asynchronous mode. Do not request confirmations from the receiver. Best
used together with forward error correction and bandwidth limitation, or
else the receiver will abort the reception as soon as it misses a packet.
When the receiver aborts the reception in such a way, it will print a list
of packets lost in the slice causing the problem. You can use this list to
tune the forward error correction parameters.
- --max-bitrate
bitrate
- Limits bandwidth used by udpcast. Useful in asynchronous mode, or else the
sender may send too fast for the switch and/or receiver to keep up.
Bitrate may be expressed in bits per second (--bitrate 5000000), kilobits
per second ("--bitrate 5000k") or
megabits per second ("--bitrate 5m").
This is the raw bitrate, including packet headers, forward error
correction, retransmissions, etc. Actual payload bitrate will be
lower.
- --fec
interleave"x"redundancy"/"stripesize
- Enables forward error correction. The goal of forward error correction is
to transmit redundant data, in order to make up for packets lost in
transit. Indeed, in unidirectional mode, the receivers have no way of
requesting retransmission of lost packets, thus the only way to address
packet loss is to include redundant information to begin with. The
algorithm is designed in such a way that if r redundant packets are
transmitted, that those can be used to compensate for the loss of
any r packets in the same FEC group (stripe).
In order to increase robustness of the FEC algorithm against
burst packet losses, each slice is divided in interleave
stripes. Each stripe has stripesize blocks (if not specified,
stripesize is calculated by diving slice-size by
interleave). For each stripe, redundancy FEC packets are
added. Stripes are organized in such a fashion that consecutive packets
belong to different stripes. This way, we ensure that burst losses
affect different stripes, rather than using all FEC packets of a single
stripe. Example: "--fec 8x8/128"
- --rate-governor
module.so:key1=value1,key2=value2
- Applies a dynamically loadable rate governor. module.so is the name
of the preloadable module, which is followed by a number of property
assignments (key1=value1). The rate governor controls the
transmission rate according to various criteria, such as congestion
information received from a routing or encapsulating device. See comments
in "/usr/include/udpcast/rateGovernor.h"
and example in "examples/rateGovernor"
for more details
- --rexmit-hello-interval
timeout
- If set, rebroadcasts the HELLO packet used for initiating the casting each
timeout milliseconds.
This option is useful together with asyc mode, because
with async mode the receiver won't send a connection request to the
sender (and hence won't get a connection reply). In async mode,
the receivers get all needed information from the hello packet
instead, and are thus particularly dependent on the reception of this
packet, making retransmission useful.
This option is also useful on networks where packet loss is so
high that even with connection requests, sender and receiver would not
find each other otherwise.
- --retries-until-drop
retries
- How many time to send a REQACK until dropping a receiver. Lower
retrycounts make "udp-sender" faster to
react to crashed receivers, but they also increase the probability of
false alerts (dropping receivers that are not actually crashed, but merely
slow to respond for whatever reason)
- --streaming
- Allows receivers to join an ongoing transmission mid through
The options below help to run a sender in unattended mode.
- --min-receivers
n
- Automatically start as soon as a minimal number of receivers have
connected.
- --min-wait t
- Even when the necessary amount of receivers do have connected,
still wait until t seconds since first receiver connection have
passed.
- --max-wait t
- When not enough receivers have connected (but at least one), start anyways
when t seconds since first receiver connection have passed.
- --nokbd
- Do not read start signal from keyboard, and do not display any message
telling the user to press any key to start.
- --start-timeout
sec
- sender aborts at start if it doesn't see a receiver within this many
seconds. Furthermore, transmission of data needs to start within this
delay. Once transmission is started, the timeout no longer applies.
- --daemon-mode
- Do not exit when done, but instead wait for the next batch of receivers.
If this option is given twice, udp-sender puts itself into the background,
closes its standard file descriptors, and acts as a real daemon.
- --pid-file file
- Allow to specify a pid file. If given together with
"--daemon-mode", udp-sender will write
its pid into this file. If given together with
"--kill", the process with the given pid
will be killed.
- --kill
- Shuts down the udp-sender identified by the pid file (which also must be
specified). Kill does not interrupt an ongoing transmission, but instead
waits until it is finished.
Example:
"udp-sender -f zozo --min-receivers 5
--min-wait 20 --max-wait 80"
- If one receiver connects at 18h00.00, and 4 more within the next 5
minutes, start at 18h00.20. (5 receivers connected, but min-wait not yet
passed)
- If one receiver connects at 18h00.00, and 3 more within the next 5
minutes, then a last one at 18h00.25, start right after.
- If one receiver connects at 18h00.00, then 3 more within the next 15
minutes, then no one, start at 18h01.20. (not enough receivers, but we
start anyways after max-wait).
The options instruct
"udp-sender" to log some additional
statistics to a file:
- --stat-period
seconds
- Every so much milliseconds, print some statistics to stderr: how much
bytes sent so far log, position in uncompressed file (if applicable),
retransmit count... By default, this is printed every half second.
- --print-uncompressed-position
flag
- By default, udp-sender only prints the position in uncompressed file if
the 2 following conditions are met:
- Input is piped via a compressor ("-p "
option).
- The primary input is seekable (file or device)
With the
"--print-uncompressed-position", options,
you can change this behavior:
- If flag is 0, uncompressed position will never be printed, even if
above conditions are met
- If flag is 1, uncompressed position will always be printed, even if
above conditions are not met
- --log file
- Logs some stuff into file.
- --no-progress
- Do not display progress statistics.
- --bw-period
seconds
- Every so much seconds, log instantenous bandwidth seen during that period.
Note: this is different from the bandwidth displayed to stderr of the
receiver, which is the average since start of transmission.
The following tuning options are all about slice size. Udpcast
groups its data in slices, which are a series of blocks (UDP
packets). These groups are relevant for
- data retransmission: after each slice, the server asks the receivers
whether they have received all blocks, and if needed retransmits what has
been missing
- forward error correction: each slice has its set of data blocks, and
matching FEC blocks.
- --min-slice-size
size
- minimum slice size (expressed in blocks). Default is 16. When dynamically
adjusting slice size (only in non-duplex mode), never use smaller slices
than this. Ignored in duplex mode (default).
- --max-slice-size
size
- maximum slice size (expressed in blocks). Default is 1024. When
dynamically adjusting slice size (only in non-duplex mode), never use
larger slices than this. Ignored in duplex mode (default).
- --default-slice-size
size
- Slice size used (starting slice size in half-duplex mode).
- --rehello-offset
offs
- in streaming mode, how many packets before end of slice the hello packet
will be transferred (default 50). Chose larger values if you notice that
receivers are excessively slow to pick up running transmission
There are three parameters on which to act:
- redundancy
- This influences how much extra packets are included per stripe. The higher
this is, the more redundancy there is, which means that the transmission
becomes more robust against loss. However, CPU time necessary is also
proportional to redundancy (a factor to consider on slow PC's), and of
course, a higher redundancy augments the amount of data to be
transmitted.
- interleave
- This influences among how many stripes the data is divided. Higher
interleave improves robustness against burst loss (for example, 64 packets
in a row...). It doesn't increase robustness against randomly spread
packet loss. Note: interleave bigger than 8 will force a smaller
stripesize, due to the fact that slicesize is limited to 1024.
- stripesize
- How many data blocks there are in a stripe. Due to the algorithm used,
this cannot be more than 128. Reducing stripe size is an indirect way of
augmenting (relative) redundancy, without incurring the CPU penalty of
larger (absolute) redundancy. However, a larger absolute redundancy is
still preferable over a smaller stripesize, because it improves robustness
against clustered losses. For instance, if 8/128 is preferable over 4/64,
because with 8/128 the 8 FEC packets can be used to compensate for the
loss of any of the 128 data packets, whereas with 4/64, each group of 4
FEC packets can only be used against its own set of 64 data packets. If
for instance the first 8 packets were lost, they would be recoverable with
8/128, but not with 4/64.
Considering these, change parameters as follows:
- If you observe long stretches of lost packets, increase interleave
- If you observe that transfer is slowed down by CPU saturation, decrease
redundancy and stripesize proportionnally.
- If you observe big variations in packet loss rate, increase
redundancy and stripesize proportionnally.
- If you just observe high loss, but not necessarily clustered in any
special way, increase redundancy or decrease stripesize
- Be aware that network equipment or the receiver may be dropping packets
because of a bandwidth which is too high. Try limiting it using
"max-bitrate"
- The receiver may also be dropping packets because it cannot write the data
to disk fast enough. Use hdparm to optimize disk access on the receiver.
Try playing with the settings in
"/proc/sys/net/core/rmem_default" and
"/proc/sys/net/core/rmem_max", i.e.
setting them to a higher value.