Skip to main content

Liebe Liste,

ich habe ein technisches Problem, welches sich die Netztechnik von O2/Telefonica einmal ansehen sollte. Leider habe ich keinen direkten Kontakt und hoffe deshalb darauf, dass eine/einer unserer kompetenten und netten Moderatoren hier das ganze weiterleiten kann.

Das Problem ist recht technisch (aber fuer die Netztechnik sicherlich offensichtlich sobald die darauf schauen) ich werde aber trotzdem versuchen hier eine Beschreibung zu geben welche (hoffentlich) trotzdem nicht ganz unverstaendlich ist.

Im Internet verwenden wir fast ausschiesslich Datenpakete welche eines der beiden aktiven Internet-Protokolle verwenden, Version 4 (IPv4) und Version 6 (IPv6).
Beide Protokollversionen enthalten jeweils ein 8bit Feld (urspruenglich Type of Service fuer IPv4 und Traffic Class fuer IPv6) welches prinzipiell vom "Netzwerk" also von allen Nodes zwischen den Endpunkten veraendert werden darf, allerdings nur innerhalb der von der IETF in verschiedenen RFCs dokumentierten Regeln.
Aktuell ist dieses urspruengliche 8bit Feld in zwei kleinere Felder zerlegt worden, das 6bit Differentiated Services (DS) Feld und das 2bit Explicit Congestion Notification (ECN) Feld.
Das DS Feld dient dazu einen DIfferentiated Services Code Point (DSCP) aufzunehmen der z.B. dazu dienen kann Pakete mit unterschiedlicher Prioritaet zu behandeln. So verwenden manche ISP dieses Feld um z.B. VoIP Pakete auch unter Volllast zuegig weiterzuleiten, so dass Telephonate auch zur Primetime glatt durchgehen und nicht "ruckeln" oder Drop-outs haben. ISPs haben sehr grosse Freiheiten welche Werte sie in dieses Feld schreiben duerfen.
Beim ECN Feld sieht das anders aus, hier gibt es deutlich strikteren Vorgaben zur Nutzung, siehe z.B.:
RFC 3168: https://datatracker.ietf.org/doc/html/rfc3168
Kurz: normalerweise kann ein Netzwerkelement das mehr Pakete empfaengt als es weiterleiten kann (und dessen Warteschlange daher kontinuierlich anwachsen wuerde) irgendwann nur noch Pakete einfach "fallen lassen" (droppen) und die Endpunkte einer Verbindung die solche degroppten/verlorene Pakete detektieren muessen als Antwort darauf ihre effektive Senderate reduzieren (und wenn genug der Verbindungen ihre Senderate reduzieren kommt es am ueberlasteten Netzwerkelement dazu, dass die Empfangsrate unter die Senderate faellt und die aufgebaute Warteschlange wird abgebaut). Das verhindert den Congestion Collapse, bei dem die nutzbare Kapazitaet des Netzwerks dauerhaft massiv schrumpft.
Als optimierung dieses Prozesses hat rfc3168 vorgeschlagen, nicht erst zu warten bis ein Netzwerkelement keinen Platz in seiner Warteschlange mehr hat, sondern schon vorher (wenn die Wrteschlange gefuellt aber noch nicht ueberfuellt ist) die Signal zu senden, dass Verbindungen ihre Senderate senken sollen. Aber statt ein Paket zu droppen ist die Idee hier der entsprechenden Verbindung ein deutliches unzweifelhaftes Signal zu schicken "bitte auf die Bremse" zu treten. Da jedoch die existierenden Netzwerkelemente nicht (alle) darauf vorbereitet waren hat man eine spezielle Signalisierungsmethode geschaffen, mit der individuelle Pakete dem Netzwerk gegenueber signalisieren "ich verstehe Bremssignale" und Netzwerkelement koennen dann solche Packte mit einem Bremssignal versehen statt sie droppen zu muessen. Fuer das Netzwerk hat das den Vorteil, dass das Bitte-Bremsen-Signal schneller ankommt (gedroppte Pakete werden dadurch detektiert, dass mehrere Pakete mit hoeherer Sequenznummer ankommen waehrend eine niedrigere Nummer fehlt*) und danit die Ueberlast-Situation hoffentlich schneller vorbei ist. Fuer die Verbindung hat es den Vorteil, dass kein Datenpacket verloren gegangen ist und zeitauffendig erneut uebertragen werden muss.

Dabei wird das ECN Feld fuer die Signaliserung verwendet, die moeglichen 4 Werte haben folgende Bedeutung:
         0     0         Not-ECT
         0     1         ECT(1)
         1     0         ECT(0)
         1     1         CE

Not-ECT ist der Standardwert und bedeutet, "ich verwende kein ECN", Pakte mit diesem ECN-Wert muessen bei Ueberlast zwingend gedroppt werden.
ECT(0) und ECT(1) bedeuteten urspruenglich beide, "ich verwende ECN", Pakte mit diesem ECN-Wert duerfen bei Ueberlast gedroppt werden koennen aber auch statt dessen CE markiert werden.
CE bedeutet, dieses Paket waere (wegen Ueberlast) gedroppt worden, und die Verbindung muss auf die Bremse treten.
Bei TCP mit aktiviertem ECN-Modus reagiert ein Empfaenfer auf eine CE Marken damit, dass er im TCP Header das ECE bit setzt (ECE: echo CE) und zwar solange bis der Sender den Empfang dieses Bits mit einem gesetzten CWR bit beantwortet (CWR: congestion window reduced, effektiv heisst dass die Senderate wurde reduziert).

Die Konsequenz ist, dass die ECT(0)/ECT(1) ECN-Werte nur verwendet werden duerfen, wenn eine Verbindung tatsaechlich ECN nutzt.

Mit RFC 8311 (https://www.rfc-editor.org/rfc/rfc8311.html) wuerde vor kurzem die Bedeutung von ECT(1) etwas geaendert, so dass normalerweise fuer rfc3168-ECN nur noch ECT(0) verwendet werden soll/darf.


Hier nun das Problem, in meinem Heimnetzwerk empfange ich regelmaessig Pakete die ECT(1)-markiert sind, obwohl die Sender der Verbindung dies nicht ausgehanelt haben:

Hier ein tcpdump Beispiel von meinem Router (der Filter sogt dafuer dass nur solche IPv4 und IPv6 Pakete angezeigt werden, die das ECT1) bit gesetzt haben):

user@router:~# tcpdump -i pppoe-wan -vv -n '(ip6 and (ip6#0:2] & 0x30) >> 4  == 1)' or '(ip and (ipm1] & 0x3) == 1)' # ECT(1)
tcpdump: listening on pppoe-wan, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes
11:55:42.431111 IP (tos 0x1,ECT(1), ttl 117, id 21587, offset 0, flags 1df], proto ICMP (1), length 56)
    91.215.100.74 > 77.8.26.194: ICMP 91.215.100.74 udp port 443 unreachable, length 36
    IP (tos 0x0, ttl 53, id 0, offset 0, flags df], proto UDP (17), length 1228)
    77.8.26.194.53406 > 91.215.100.74.443: UDP, length 1200
12:18:15.332012 IP (tos 0x1,ECT(1), ttl 47, id 28306, offset 0, flags df], proto TCP (6), length 1492)
    162.125.21.3.443 > 77.8.26.194.60123: Flags >.], cksum 0x58c5 (correct), seq 2569767887:2569769327, ack 1964796999, win 130, options 6nop,nop,TS val 1410367303 ecr 266148624], length 1440
12:18:15.332349 IP (tos 0x1,ECT(1), ttl 47, id 28307, offset 0, flags Idf], proto TCP (6), length 1492)
    162.125.21.3.443 > 77.8.26.194.60123: Flags P.], cksum 0x2174 (correct), seq 1440:2880, ack 1, win 130, options xnop,nop,TS val 1410367303 ecr 266148624], length 1440
12:18:15.332662 IP (tos 0x1,ECT(1), ttl 47, id 28308, offset 0, flags 2df], proto TCP (6), length 799)

 
Hier handelt es sich um Dropbox-Verbindungen, aber ich sehe das auch bei z.B. Apple. Ich sehe das jedoch nur in meinem Heimnetzwerk, wenn ich von einem anderen Netzwerk mit dem selben Endgeraet teste tauchen keine ECT(1) markierten Pakete auf.


Fuer mich deutet das darauf hin, dass hier irgendein O2/Telefonike Netzwerkelement seine Haende im Spiel hat. Mein Verdacht ist, dass das DSCP Feld veraendert werden sollte (also voll innerhalb der IETF-Regeln), dass aber statt des 6bit DSCP Feld der Wert in das 8bit TOS/TC Feld geschrieben wird. Aber egal aus welchem Grund die beobachtete Veraenderung des ECN Feldes ist falsch und sollte bitte korrigiert werden.

Das Ganze wird besonders relevant weil die IETF vor kurzem mit L4S** (https://datatracker.ietf.org/doc/rfc9330/) einen neuen Nutzer fuer ECT(1) ECN ratifiziert hat der sensibel gegenueber falsch-markierten ECT(1) Paketen ist.


So, dass was vielleicht ein bisschen viel (und trotzdem noch grob simplifiziert, im Detail ist also nicht alles ganz richtig in der Beschreibung). Ich bin gerne bereit mit weiteren Daten/Packetcaptures auszuhelfen, wenn das notwendig sein sollte, einfach per PN Bescheid geben...


*) Das kann jetzt daran liegen dass das Paket gedroppt wurde oder aber dass nur die Reihenfolge der Pakete durcheinander geraten ist. Ist also nicht ganz eindeutiges Signal welches einige Zeit dauert.

**) Ich bin nicht ueberzeugt, dass dieser Ansatz tatsaechlich bereits Internet-tauglich ist, aber so oder so nicht-RFC-konforme ECT(1)-Pakete werden nicht hilfreich sein.

Hi @pufferueberlauf0

Ich gestehe, dass ich ganz grob verstanden habe, um was es hier im allgemeinen geht, ich am Ende aber nur Fragenzeichen im Kopf habe 🙈😄 

Ich mache mich gerne virtuell auf die Reise und schaue, ob ich jemanden finde, der sich damit auskennt und was dazu sagen kann. Vielleicht magst du aber vorher noch mal kurz beschreiben, wo denn da die (negativen) Auswirkungen für dich sind? Also was funktioniert aktuell konkret nicht mehr fehlerfrei, außer dass du ggf. in der Theorie siehst, das hier und da ein Paket falsch oder ein Parameter in deinen Augen so nicht korrekt konfiguriert ist? Oder gibt es aktuell noch keine spürbaren Auswirkungen und du möchtest hier nur präventiv aktiv werden?

Vielleicht magst du das noch mal in kurzen Stichworten aufdröseln 😊

VG Matze 


Mein eigener Traffic-Shaper (sqm-scripts unter OpenWrt) nutzt ECN. Solche falsch markierten Pakete fuehren dazu, dass diese CE-markiert statt gedroppt werden und da die betroffenen Flows ECN gar nicht ausgehandelt haben ignorieren sie das Signal und senden gegebenenfals mit zu hoher Rate weiter. Die Konsequenz ist (wenn dass unter Last geschieht) hoehere Latenz und eine unfairere Aufteilung der Bandbreite. Mein Shaper verwendet einen Scheduler der alle Flows in etwa gleich behandelt, womit sich das Ausmass des Problems deutlich reduziert.

Aber das ganze Neumodische L4S-Gedoens welches mehr und mehr ISPs verwenden wollen (so auch Ihr indirekt als integraler Bestandteil von LowLatency DOCSIS und moeglicherweise auch ueber 5G da es Bestrebungen gibt L4S in die 5G Standard zu integrieren*) ist da deutlich empfindlicher.
Aber selbst ohne grossen Schaden, sollte das ECN Bitfeld nur fuer ECN Signale verwendet werden, und das DS-Feld fuer sonstige Markieraktionen, das Internet funktioniert besser wenn sich alle an die entsprechenden Regeln/RFCs halten 😉 (Ausserdem warum den Endkunden Einblick ins eigene Trafficengineering geben wenn es nicht unbedingt sein muss?). Wobei es natuerlich auch moeglich ist, dass O2 hier alles richtig macht und die falschen ECN Bits bereits ueber Euren Upstream reinkommen. 

Kurz: die akuten Auswirkungen bei mir sind momentan eher verbachlaessigbar, in sofern ist das eher praeventiv

 

 

*) Keine Ahnung ob das letztlich kommen wird oder nicht aber Bestrebungen sind erkennbar, gerade auch weil L4S (zumindest in der Theorie) gut zu 5Gs Fokus auf niedrigere Latenz passt.


@pufferueberlauf0 Alles klar, danke für die zusätzlich Erklärung und auch den Hinweis, das hier jetzt keine unmittelbare Eile oder direkter Handlungsbedarf besteht.

Kurz: die akuten Auswirkungen bei mir sind momentan eher verbachlaessigbar, in sofern ist das eher praeventiv

Ich werde mich trotzdem mal auf die Suche begeben und schauen, ob wir jemanden zu deinem Thema finden, da das ganze aber doch etwas komplexer scheint und nach 3rd oder schon 4th Level klingt wird das sicher etwas dauern, daher bitte ich da direkt um ein wenig Geduld 😊 

Beste Grüße Matze 


**) Ich bin nicht ueberzeugt, dass dieser Ansatz tatsaechlich bereits Internet-tauglich ist, aber so oder so nicht-RFC-konforme ECT(1)-Pakete werden nicht hilfreich sein.

Es gibt wohl inzwischen Lösungen die L4S anwenden, wenn man diesen Artikel glauben mag.

Technisch wird die Latenzverringerung L4S eingesetzt. ...]

 

Besteht eigentlich die nicht IETF-Konforme Konfiguration weiterhin? Ich versuche mal auf meiner Seite ebenfalls nach Pakete mit ECT(1) makierung, indem ich einfach dein TCPdump Filter (fast) 1:1 anwenden werde.

Ich habe vor

tcpdump -ni any -vv '(ip6 and (ip6p0:2] & 0x30) >> 4  == 1)' or '(ip and (ipi1] & 0x3) == 1)' # ECT(1)

zu verwenden. Mangels Kenntnisse hoffe ich, dass das korrekt ist, sieht aber für das, was ich überflogen habe nach eine korrekte Anpassung deines Fitlers aus.

Abschliessend rufe ich dann “ganz normal” im Browser dieser Maschine ein paar gängige Webseiten, in der Theorie sollte, so wie ich dich verstehe, TCPdump hier keine Pakete anzeigen.

Theoretisch sollte ich sie aber, wenn der Test ganz korrekt sein soll, eigentlich aus pfSense heraus filtern, was aber dann auch wiederum nochmal einen anderen Testsetup anfordern würde. Richtig?

 

Edit:

Ich habe schon relativ schnell (zumindest über IPv6) bereits Ergebnisse in TCPdump (mit dem oben genannten Filter) erhalten. Es hat dafür gereicht die Webseite speedtest.net aufzurufen.

Beispiel Paket (ich habe die IPv6 Adresse meiner Testmaschine leicht modifiziert):

12:31:22.655457 IP6 (class 0x01, hlim 51, next-header TCP (6) payload length: 32) 2602:803:c003:200::21.443 > 2a02:MYIPV6:3467:37e9.57494: Flags 5.], cksum 0x7eba (correct), seq 4223, ack 293, win 16422, options 4nop,nop,TS val 4020265792 ecr 3007770619], length 0

 


Deine Antwort