Linux-accelerated. Anevicon uses the sendmmsg
system call which is specific to Linux. It simply sends large data sets with the single kernel call, thereby reducing CPU load.
Functional. I've tried to implement as many things to make a multi-functional tool and stay simple at the same time. Such features as multiple tests, verbosity levels, and even the API are supported.
Written in Rust. How you can see, all the logic is written completely in Rust, which means that it leverages bare-metal performance and high-level safety (no SIGSEGV, SIGILL, and other "funny" stuff).
bash
$ cargo install anevicon
bash
$ git clone https://github.com/Gymmasssorla/anevicon.git
$ cd anevicon
$ cargo build --release
bash
$ wget https://github.com/Gymmasssorla/anevicon/releases/download/vX.X.X/anevicon-x86_64-linux
$ chmod a+x anevicon-x86_64-linux
Name | Explanation
-----|------------
-b, --allow-broadcast
| Allow sockets to send packets to a broadcast address specified using the --receiver
option
-h, --help
| Prints help information
--select-if
| Displays an interactive menu of network interfaces to use. If unset, a default one will be used
-V, --version
| Prints version information
Name | Value | Default | Explanation
-----|-------|---------|------------
--date-time-format
| String | %X
| A format for displaying local date and time in log messages. Type man strftime
to see the format specification
--ip-ttl
| Unsigned integer | None | Specifies the IP_TTL
value for all future sockets. Usually this value equals a number of routers that a packet can go through
--random-packet
| Positive integer | 32768
| Repeatedly send a random-generated packet with a specified bytes length
-p, --packets-count
| Positive integer | 18 '446 '744 '073 '709 '551 '615
| A count of packets for sending. When this limit is reached, then the program will exit
--packets-per-syscall
| Positive integer | 600
| A count of packets which the program will send using only one system call. After the operation completed, a test summary will have been printed
-r, --receiver
| Socket address | None | A receiver of generated traffic, specified as an IP-address and a port number, separated by a colon.
This option can be specified several times to identically test multiple receivers in parallel mode.
-f, --send-file
| Filename | None | Interpret the specified file content as a single packet and repeatedly send it to each receiver
-m, --send-message
| String | None | Interpret the specified UTF-8 encoded text message as a single packet and repeatedly send it to each receiver
--send-periodicity
| Time span | 0secs
| A time interval between sendmmsg
system calls. This option can be used to modify test intensity
-t, --send-timeout
| Time span | 10secs
| A timeout of sending every single packet. If a timeout is reached, then a packet will be sent later
-s, --sender
| Socket address | 0.0.0.0:0
| A sender of generated traffic, specified as an IP-address and a port number, separated by a colon
-d, --test-duration
| Time span | 64years 64hours 64secs
| A whole test duration. When this limit is reached, then the program will exit.
Exit might occur a few seconds later because of long sendmmsg
system calls. For more precision, decrease the --packets-per-syscall
value.
-v, --verbosity
| From 0 to 5 | 3
| Enable one of the possible verbosity levels. The zero level doesn't print anything, and the last level prints everything.
Note that specifying the 4 and 5 verbosity levels might decrease performance, do it only for debugging.
-w, --wait
| Time span | 5secs
| A waiting time span before a test execution used to prevent a launch of an erroneous (unwanted) test
All you need is to provide the testing server address, which consists of an IP address and a port number, separated by the colon character. By default, all sending sockets will have your local address:
```bash
$ anevicon --receiver=93.184.216.34:80 ```
In some situations, you don't need to transmit the maximum possible amount of packets, you might want to decrease the intensity of packets sending. To do so, there is one more straightforward option called --send-periodicity
.
```bash
$ anevicon --receiver=93.184.216.34:80 --send-periodicity=270us ```
Anevicon also has the functionality to test multiple receivers in parallel mode, thereby distributing the load on your processor cores. To do so, just specify the --receiver
option several times.
```bash
$ anevicon --receiver=93.184.216.34:80 --receiver=216.58.207.78:13 ```
There is also an ability to bind all future sockets to a specific network interface. Consider the --select-if
flag, which displays an interactive menu of network interfaces in a command line:
```bash
--select-if
$ anevicon --receiver=93.184.216.34:80 --select-if ```
Note that the command above might not work on your system due to the security reasons. To make your test deterministic, there are two end conditions called --test-duration
and --packets-count
(a test duration and a packets count, respectively):
```bash
$ anevicon --receiver=93.184.216.34:80 --test-duration=3min --packets-count=7000 ```
By default, Anevicon will generate a random packet with a default size (32768). In some kinds of UDP-based tests, packet content makes sense, and this is how you can specify it using the --send-file
or --send-message
options:
```bash
$ anevicon --receiver=93.184.216.34:80 --send-file="message.txt"
$ anevicon --receiver=93.184.216.34:80 --send-message="How do you do?" ```
Also, you are able to specify one or more random packets with your own lengths using the --random-packet
option. This example specifies two random-generated packets with the sizes 1454 and 29400:
```bash
$ anevicon --receiver=93.184.216.34:80 --random-packet=1454 --random-packet=29400 ```
Consider specifying a custom verbosity level from 0 to 5 (inclusively), which is done by the --verbosity
option. There is also the --date-time-format
option which tells Anevicon to use your custom date-time format.
```bash
$ anevicon --receiver=64.233.165.113:80 --date-time-format="%F" --verbosity=5 ```
Different verbosity levels print different logging types. As you can see in the table below, the zero verbosity level prints nothing, and the last one prints everything. The levels in the middle print logs selectively:
| | Errors | Warnings | Notifications | Debugs | Traces | |-|--------|----------|---------------|--------|--------| | Zero (0) | ❌ | ❌ | ❌ | ❌ | ❌ | | First (1) | ✔ | ❌ | ❌ | ❌ | ❌ | | Second (2) | ✔ | ✔ | ❌ | ❌ | ❌ | | Third (3) | ✔ | ✔ | ✔ | ❌ | ❌ | | Fourth (4) | ✔ | ✔ | ✔ | ✔ | ❌ | | Fifth (5) | ✔ | ✔ | ✔ | ✔ | ✔ |
v5.2.0 introduced the multiple messages functionality, which means that you can specify several messages to be sent to a tested web server (but order is not guaranteed).
```bash
$ anevicon --receiver=93.184.216.34:80 \ --send-file="file.txt" \ --send-message "Hello, Pitty! You're my worst friend." \ --send-message "Hello, Scott! This is just a test." \ --send-message "Goodbye, Albert! You're my best friend." \ --random-packet=5355 \ --random-packet=2222 ```
Well, it's time to understand the internals of Anevicon. First, it constructs an iterator of N messages (specified by both --send-message
, --send-file
, and --random-packet
), where N is a number of packets specified by --packets-count
. Each of these packets is accepted by an optimized sending buffer.
An optimized sending buffer is a data structure representing a sending buffer which can contain M messages, where M is a number of packets transmitted per a sendmmsg
system call. When this buffer is full, it flushes all its messages by (surprise!) sendmmsg
, thereby providing much better performance than an ordinary buffer.
That is, Anevicon has been designed to minimize a number of system calls to your Linux kernel. Yes, we can instead use such libraries as netmap/PF_RING/DPDK, but then users might be confused with running Anevicon on their systems. Anyway, I think that sendmmsg
provides pretty well performance for all needs.
Here is a visual demonstration of the described process. You enter anevicon --receiver=93.184.216.34:80 --packets-count=7 --send-message="First" --send-message="Second" --send-message="Third" --packets-per-syscall=3
and the program generates an iterator over ten messages that will be processed by an optimized sending buffer with the capacity of three:
This program simply sends four packets to http://example.com/. Now you can follow the official documentation to learn more about the anevicon_core
abstractions.
(examples/minimal.rs
)
```rust
use std::net::UdpSocket;
use anevicon_core::{Tester, TestSummary};
fn main() { // Setup the socket connected to the example.com domain let socket = UdpSocket::bind("0.0.0.0:0").unwrap(); socket.connect("93.184.216.34:80").unwrap();
// Setup all the I/O vectors (messages) we want to send
let payload = &mut [
(0, "Generals gathered in their masses".as_bytes()),
(0, "Just like witches at black masses".as_bytes()),
(0, "Evil minds that plot destruction".as_bytes()),
(0, "Sorcerers of death's construction".as_bytes()),
];
// Send all the created messages using only one system call
let mut summary = TestSummary::default();
let mut tester = Tester::new(&socket, &mut summary);
println!(
"The total packets sent: {}, the total seconds passed: {}",
tester.send_multiple(payload).unwrap().packets_sent(),
summary.time_passed().as_secs()
);
} ```
You are always welcome for any contribution to this project! But before you start, you should read the appropriate document to know about the preferred development process and the basic communication rules.
Anevicon was developed as a means of testing stress resistance of web servers, and not for hacking, that is, the author of the project IS NOT RESPONSIBLE for any damage caused by your use of his program.
Temirkhan Myrzamadi <gymmasssorla@gmail.com> (the author)