Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,31 @@ The format follows [Keep a Changelog](https://keepachangelog.com/); versions fol

## [Unreleased]

### Added

- **"Internet only (no local network)" - a new checkbox under "Traffic to modify", the mirror of
LAN mode.** It drops traffic to and from local addresses and leaves the internet up, so you can
test an app whose intranet server, NAS or printer has gone away. On the command line:
`--internet-only`. Its counter is "Local network cut".
- **Two things to know before ticking it.** Loopback keeps working, so anything talking to itself
on your own machine is untouched. But your router is on the local network, so if your PC asks it
for DNS, name lookups stop with everything else. Both checkboxes can be on at once - that cuts
everything except loopback, and the log says so when you apply it.

- **The search box on the Control page can be switched off.** Settings (the cog) has a new
"Show the search box on the Control page" switch under Display. It is on by default, and
turning it off takes the box away at once - Ctrl+F then goes to the search box in the
Connections tab, the way it does from any other page.

### Fixed

- The right-click copy menu on the Statistics page opened with a white background instead of the
dark one used everywhere else. It now looks like the menu in the Connections table, on both
Live and Session.
- **A reproduction command left out `--narrow-filter`.** A session started with "Capture only the
targeted traffic" produced a command that re-ran a WIDER capture, so the packet counts of the
re-run could not match the report they came from.

## [0.5.0] - 2026-08-19

**The short version.** Two things, and the first is about not losing your files when the
Expand Down
26 changes: 22 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,21 @@ public (internet) addresses and passes the local network: 10.0.0.0/8, 172.16-31.
loopback, link-local and CGNAT. It simulates "LAN works, internet is down" - a test of how the app
behaves without internet access (e.g. no gateway/WAN, a captive portal).

**Internet only** - the mirror of it, an "Internet only (no local network)" checkbox in the same
section. It drops traffic to/from those same local addresses and leaves the internet working, so
you can test an app that talks to an intranet server, a NAS or a printer while the WAN is fine.
Two things it does not do, and both matter:

- **Loopback keeps working.** 127.x and `::1` pass either way, so a local development server, a
database on your own machine and anything using loopback to talk to itself are untouched. That
is deliberate: your own machine talking to itself is not "the local network".
- **The router is on the local network.** If your PC asks the router for DNS, name lookups stop
working with it, and the internet then looks broken even though internet traffic is being let
through. Use a public resolver while testing this if that gets in the way.

Both checkboxes can be on at once. That is allowed and it cuts everything except loopback - the
program says so in the log when you apply it, and each of the two counters reports its own half.

**Target process** - narrow the effect to chosen apps: process name (e.g. `chrome.exe`), PID, a
comma-separated list, PID range, wildcard or regular expression - see
[Filter syntax](#filter-syntax-process--ip--port). The rest of the machine's traffic stays
Expand Down Expand Up @@ -554,7 +569,7 @@ tool is overloaded), Dropped at stop (were still queued when STOP was pressed),
tool captured them but could not put them back on the wire - the connection went down, or the driver
refused), Rate-limit drop (dropped by a full speed-limit buffer - counted separately from
loss and from "Buffer overflow"), SYN dropped, MTU dropped, NAT expired, RST torn, LAN: internet cut
off, RST sent.
off, Local network cut, RST sent.

**Copying the figures.** Right-click any value on "Live" or "Session" to copy that value, or the
whole tab. Each panel also has a button - "Copy counters" under the grid, "Copy session details"
Expand Down Expand Up @@ -583,7 +598,7 @@ Designed so that after a bug you can recreate exactly the same conditions:
- **Start / Duration / Effective loss / Queue peak / Down-up peak** - a quick picture of the run.
- **What "Effective loss" counts** - the share of the traffic you aimed at that **this tool**
broke, across **every** impairment: the configured Loss plus rate-limit drops, blocking, LAN cut,
link outages, connection resets, SYN drops, MTU drops and NAT expiry. With a target set, only
local-network cut, link outages, connection resets, SYN drops, MTU drops and NAT expiry. With a target set, only
the target's traffic counts, so other applications cannot dilute it. Packets the **tool** threw
away are deliberately excluded - "Buffer overflow", "Dropped at stop" and "Send failed" are its
own failures, not the link's, and they have their own counters. The report's `effective_loss_pct` is the same
Expand Down Expand Up @@ -691,6 +706,7 @@ BeanNetworkTester.exe --simulate --duration 30 --format json > run.ndjson
| `--flap-period` `--flap-down` | s / % | cyclic link outage: how often and for what fraction of the period |
| `--rate-schedule` | - | changing throughput: `"time:download:upload,..."` in KB/s, looped |
| `--lan-mode` | - | LAN mode: cut off the internet (public addresses), keep the local network |
| `--internet-only` | - | the mirror: cut off the local network (10.x, 172.16-31.x, 192.168.x, link-local, CGNAT), keep the internet. Loopback keeps working. Careful: DNS asked of your router is local traffic, so the internet can stop working with it |
| `--narrow-filter` | - | push `--dst-ip`/`--dst-port` into the WinDivert filter so the driver never hands over traffic that could not be impaired (much faster at high packet rates). START-time only. While it is on, statistics and connections cover the narrowed traffic only |

**Targeting** (all three accept the full [filter syntax](#filter-syntax-process--ip--port): lists,
Expand Down Expand Up @@ -828,7 +844,7 @@ tooltip on that header.
| `l.port` | Port on this machine - what links the connection to a process. Empty for ping/ICMP, which is also why those rows usually have no process name. |
| `packets` | Packets seen on this connection since it appeared. |
| `impaired?` | Whether the connection was **in impairment scope** this session - impaired, not merely watched. It stays `yes` after the connection closes, as a record. With no targeting set, everything is in scope. |
| `dropped` | Packets dropped on this connection by the active impairments (loss, link outage, LAN mode, resets, ...). |
| `dropped` | Packets dropped on this connection by the active impairments (loss, link outage, LAN mode, "Internet only", resets, ...). |
| `down` | Data that actually **reached** the application - what it downloaded. Same quantity the session panel calls "Downloaded (MB)". |
| `up` | Data that actually **left** this machine - what the application uploaded. |
| `total` | Delivered download + delivered upload. |
Expand Down Expand Up @@ -903,6 +919,7 @@ what `packets_seen` counted in the first place - so every row records it in `cap
| `dropped_nat` | dropped because the NAT mapping had expired |
| `dropped_rst` | traffic swallowed while a connection was held down after a reset |
| `dropped_lan` | dropped by LAN mode (internet cut, local network alive) |
| `dropped_local_network` | dropped by "Internet only" (local network cut, internet and loopback alive) |
| `dropped_block` | dropped by the blocking (firewall) fields |
| `dropped_link_outage` | dropped during a flapping outage |
| `dropped_rate_limit` | dropped by a full speed-limit buffer |
Expand Down Expand Up @@ -971,7 +988,8 @@ pause.
**Which names go in `settings`** - any setting the tool has, under the **same name as the config
file** (that is, its command-line flag with the dashes turned into underscores): `loss`, `latency`, `jitter`,
`down`, `up`, `buffer`, `spike_prob`, `flap_period`, `dst_ip`, `block_port`, `target`,
`rate_schedule`, `max_size`, `nat_timeout`, `rst_prob`, `lan_mode`, `seed` and the rest. Run
`rate_schedule`, `max_size`, `nat_timeout`, `rst_prob`, `lan_mode`, `internet_only`, `seed` and the
rest. Run
`--print-config` to dump the full set of names with their current values.

**Everything is validated when the file loads, and a mistake names itself.** An unknown setting, an
Expand Down
20 changes: 15 additions & 5 deletions README.pl.md
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,13 @@ Pola liczbowe są sprawdzane **na żywo, razem z zakresem** (np. utrata 0-100%,

**Tryb LAN** - pole wyboru „Tryb LAN (tylko sieć lokalna, bez internetu)”. Odrzuca ruch do/od adresów publicznych (internet), a przepuszcza sieć lokalną: 10.0.0.0/8, 172.16-31.x, 192.168.x, loopback, link-local i CGNAT. Symuluje sytuację „LAN działa, internetu brak” - test zachowania aplikacji bez dostępu do internetu (np. brak bramy/WAN, portal przechwytujący).

**Tylko internet** - lustro tamtego, pole wyboru „Tylko internet (bez sieci lokalnej)” w tej samej sekcji. Odrzuca ruch do/od tych samych adresów lokalnych, a zostawia działający internet - można więc przetestować aplikację gadającą z serwerem w intranecie, z NAS-em albo z drukarką, przy sprawnym WAN-ie. Dwie rzeczy, których ta opcja NIE robi, i obie są ważne:

- **Loopback działa dalej.** 127.x i `::1` przechodzą w obu trybach, więc lokalny serwer deweloperski, baza na tej samej maszynie i wszystko, co rozmawia samo ze sobą przez loopback, zostaje nietknięte. To jest celowe: własna maszyna gadająca sama ze sobą nie jest „siecią lokalną”.
- **Router jest w sieci lokalnej.** Jeśli komputer pyta o DNS router, razem z siecią lokalną przestaje działać rozwiązywanie nazw, a wtedy internet wygląda na zepsuty, choć ruch do internetu jest przepuszczany. Gdy to przeszkadza, ustaw na czas testu publiczny resolver.

Oba pola wyboru można włączyć naraz. To jest dozwolone i odcina wszystko poza loopbackiem - program mówi o tym w logu przy zastosowaniu, a każdy z dwóch liczników raportuje swoją połowę.

**Celuj w proces** - zawęź działanie do wybranych aplikacji: nazwa procesu (np. `chrome.exe`),
PID, lista po przecinku, zakres PID, wildcard lub wyrażenie regularne - patrz
[Składnia filtrów](#składnia-filtrów-proces--ip--port). Reszta ruchu na komputerze pozostaje
Expand Down Expand Up @@ -448,7 +455,7 @@ przeciążeniu narzędzia), Porzuc. przy stopie (czekały w kolejce, gdy nacisni
(narzędzie je przechwyciło, ale nie zdołało odesłać do sieci - padło połączenie albo sterownik
odrzucił pakiet), Odrzuc. przez limit (porzucone przez pełny bufor limitu prędkości -
liczone osobno od strat i od „Bufor przepełn.”), SYN odrzucone, MTU odrzucone, NAT wygasło,
RST zerwane, LAN: internet odcięty, RST wysłane.
RST zerwane, LAN: internet odcięty, Sieć lokalna odcięta, RST wysłane.

**Kopiowanie liczb.** Prawy przycisk na dowolnej wartości w „Na żywo" albo „Sesja" kopiuje tę
wartość albo całą zakładkę. Każdy panel ma też przycisk - „Kopiuj liczniki" pod siatką, „Kopiuj
Expand All @@ -469,7 +476,7 @@ Zaprojektowane tak, by po wystąpieniu błędu odtworzyć dokładnie te same war
- **Powtarzalny flapping** - wzorzec przerw łącza liczony jest względem startu sesji, więc przy tych samych ustawieniach powtarza się identycznie między uruchomieniami (a nie zależy od zegara systemowego).
- **Co dokładnie odtwarza seed** - seed odtwarza **decyzje** silnika (które pakiety zostaną porzucone, uszkodzone, zduplikowane, o ile opóźnione), a nie **liczbę pakietów**. Ruch, który przechodzi przez łącze, zależy od tego, co w danej chwili robią aplikacje i system, więc dwa przebiegi z tym samym seedem dadzą te same *proporcje* (np. 15,8% strat w obu), ale nie identyczne liczniki co do sztuki. Do porównań w CI używaj wskaźników (%), nie surowych liczb pakietów.
- **Start / Czas trwania / Efektywna utrata / Szczyt kolejki / Szczyt down-up** - szybki obraz przebiegu.
- **Co liczą „Efektywne straty”** - jaką część ruchu, w który celujesz, zepsuło **to narzędzie**, licząc **każde** zakłócenie: ustawioną Utratę plus porzucenia z limitu prędkości, blokadę, odcięcie internetu w trybie LAN, przerwy w łączu, zrywanie połączeń, odrzucone SYN-y, odrzucenia z MTU i wygasanie NAT. Gdy ustawisz cel, liczy się wyłącznie jego ruch, więc inne aplikacje nie rozwadniają tej liczby. Pakiety porzucone przez samo **narzędzie** są świadomie pominięte - „Bufor przepełn.”, „Porzuc. przy stopie” i „Nie odesłane” to jego własne awarie, nie zachowanie łącza, i mają osobne liczniki. `effective_loss_pct` w raporcie to ta sama liczba, obok `packets_in_scope`.
- **Co liczą „Efektywne straty”** - jaką część ruchu, w który celujesz, zepsuło **to narzędzie**, licząc **każde** zakłócenie: ustawioną Utratę plus porzucenia z limitu prędkości, blokadę, odcięcie internetu w trybie LAN, odcięcie sieci lokalnej, przerwy w łączu, zrywanie połączeń, odrzucone SYN-y, odrzucenia z MTU i wygasanie NAT. Gdy ustawisz cel, liczy się wyłącznie jego ruch, więc inne aplikacje nie rozwadniają tej liczby. Pakiety porzucone przez samo **narzędzie** są świadomie pominięte - „Bufor przepełn.”, „Porzuc. przy stopie” i „Nie odesłane” to jego własne awarie, nie zachowanie łącza, i mają osobne liczniki. `effective_loss_pct` w raporcie to ta sama liczba, obok `packets_in_scope`.
- **Czekanie w kolejce sterownika (szczyt)** - najdłuższy czas, jaki pakiet **już** przeczekał wewnątrz WinDiverta, zanim narzędzie go dostało. To pomiar, nie oszacowanie: sterownik stempluje każdy pakiet czasem przechwycenia, a narzędzie próbkuje to 20 razy na sekundę. Na spokojnej maszynie to ułamek milisekundy (zmierzone tutaj: 0,05-0,16 ms). Gdy rośnie, narzędzie dokłada opóźnienie, którego nie widać w żadnym innym liczniku, bo powstaje w kolejce sterownika przed jego własną - a powyżej 50 ms mówi o tym w logu i na liście zdarzeń. Puste przy `--simulate`, bo tam nie ma sterownika.
- **To miara tej maszyny, nie internetu.** Narzędzie widzi pakiety przechodzące przez stos sieciowy tego komputera, więc pakiet zgubiony w sieci - odpowiedź, która nie wróciła - nigdy tu nie dociera i nic go tu nie policzy. Czysty ping 30 pakietów, w którym zginie jedna odpowiedź, pokaże w wierszu połączenia **59** pakietów i **zero** porzuceń, i obie liczby są prawdziwe: wyszło 30 żądań, wróciło 29 odpowiedzi, a narzędzie nie zepsuło żadnego. Od straty end-to-end są liczniki samej aplikacji (albo „Lost” w wyniku `ping`).
- **Zużycie danych** - Pobrano / Wysłano / Razem (MB) narastająco od startu oraz średnia przepustowość sesji. Od razu wiesz, ile danych aplikacja zużyła. (W raporcie jest też „próbowano MB” - ile aplikacja chciała przesłać przed odjęciem strat/limitów.)
Expand Down Expand Up @@ -552,6 +559,7 @@ BeanNetworkTester.exe --simulate --duration 30 --format json > run.ndjson
| `--flap-period` `--flap-down` | s / % | cykliczne zrywanie łącza: co ile i na jaki ułamek okresu |
| `--rate-schedule` | - | zmienna przepustowość: `"czas:pobieranie:wysyłanie,..."` w KB/s, w pętli |
| `--lan-mode` | - | tryb LAN: odetnij internet (adresy publiczne), zostaw sieć lokalną |
| `--internet-only` | - | lustro tamtego: odetnij sieć lokalną (10.x, 172.16-31.x, 192.168.x, link-local, CGNAT), zostaw internet. Loopback działa dalej. Uwaga: DNS pytany u routera to ruch lokalny, więc internet może przestać działać razem z siecią lokalną |
| `--narrow-filter` | - | wepchnij `--dst-ip`/`--dst-port` do filtra WinDiverta, żeby sterownik w ogóle nie podawał ruchu, którego nie dałoby się popsuć (dużo szybciej przy dużej liczbie pakietów). Tylko przy STARCIE. Gdy działa, statystyki i połączenia obejmują wyłącznie zawężony ruch |

**Celowanie** (wszystkie trzy przyjmują pełną [składnię filtrów](#składnia-filtrów-proces--ip--port): listy, zakresy, `!`, `>`, `<`, `>=`, `<=`, wildcardy, `re:`, a `--dst-ip` dodatkowo CIDR)
Expand Down Expand Up @@ -688,7 +696,7 @@ w podpowiedzi nad tym nagłówkiem.
| `lok.port` | Port na tej maszynie - to on wiąże połączenie z procesem. Pusty dla ping/ICMP, dlatego te wiersze zwykle nie mają nazwy procesu. |
| `pakiety` | Pakiety zobaczone na tym połączeniu, odkąd się pojawiło. |
| `psute?` | Czy połączenie było **w zasięgu psucia** w tej sesji - psute, a nie tylko obserwowane. Zostaje na `tak` po zamknięciu połączenia, jako zapis. Bez ustawionego celowania wszystko jest w zasięgu. |
| `odrzucone` | Pakiety odrzucone na tym połączeniu przez aktywne zakłócenia (strata, przerwa w łączu, tryb LAN, resety, ...). |
| `odrzucone` | Pakiety odrzucone na tym połączeniu przez aktywne zakłócenia (strata, przerwa w łączu, tryb LAN, „Tylko internet”, resety, ...). |
| `pobrane` | Dane, które **naprawdę dotarły** do aplikacji - tyle pobrała. To ta sama wielkość, którą panel sesji nazywa „Pobrano (MB)". |
| `wysłane` | Dane, które **naprawdę wyszły** z tej maszyny - tyle aplikacja wysłała. |
| `razem` | Dostarczone pobieranie + dostarczone wysyłanie. |
Expand Down Expand Up @@ -762,6 +770,7 @@ w ogóle policzył - więc każdy wiersz zapisuje to w kolumnie `capture_narrowe
| `dropped_nat` | odrzucone, bo mapowanie NAT wygasło |
| `dropped_rst` | ruch pochłonięty, gdy połączenie było trzymane po resecie |
| `dropped_lan` | odrzucone przez tryb LAN (internet odcięty, sieć lokalna żyje) |
| `dropped_local_network` | odrzucone przez „Tylko internet” (sieć lokalna odcięta, internet i loopback żyją) |
| `dropped_block` | odrzucone przez blokadę (firewall) |
| `dropped_link_outage` | odrzucone w trakcie przerwy w łączu (flapping) |
| `dropped_rate_limit` | odrzucone przez pełny bufor limitu prędkości |
Expand Down Expand Up @@ -830,7 +839,8 @@ błąd, a nie pauza.
**Jakie nazwy wchodzą do `settings`** - dowolne ustawienie, jakie ma narzędzie, pod **tą samą nazwą
co w pliku konfiguracji** (czyli jej flaga wiersza poleceń z myślnikami zamienionymi na podkreślenia): `loss`,
`latency`, `jitter`, `down`, `up`, `buffer`, `spike_prob`, `flap_period`, `dst_ip`, `block_port`,
`target`, `rate_schedule`, `max_size`, `nat_timeout`, `rst_prob`, `lan_mode`, `seed` i reszta.
`target`, `rate_schedule`, `max_size`, `nat_timeout`, `rst_prob`, `lan_mode`, `internet_only`,
`seed` i reszta.
`--print-config` wypisuje pełny zestaw nazw wraz z bieżącymi wartościami.

**Wszystko jest sprawdzane przy wczytaniu, a pomyłka sama się nazywa.** Nieznane ustawienie,
Expand Down Expand Up @@ -1113,7 +1123,7 @@ BeanNetworkTester.spec przepis builda (onedir, konsola, asInvoker)
## Jak to działa (skrót)

Rdzeń `BeanCore.decide()` to czysta funkcja decydująca o losie pakietu w kolejności:
celowanie → tryb LAN → blokada (firewall) → NAT → RST → flapping → MTU → SYN → utrata → uszkodzenie →
celowanie → tryb LAN / tylko internet → blokada (firewall) → NAT → RST → flapping → MTU → SYN → utrata → uszkodzenie →
opóźnienie/jitter/skok → limit przepustowości (token bucket z ograniczonym buforem, ew. z harmonogramu) → duplikacja.
Wątek przechwytujący czyta pakiety i wykonuje decyzję. Wątek re-injektujący wysyła je w
wyznaczonym momencie. Wszystkie losowania idą przez jeden generator (opcjonalnie seedowany).
Expand Down
Loading
Loading