# Autonegotiatie

Autonegotiatie is een mechanisme om gemeenschappelijke transmissieparameters zoals snelheid, half/full-duplex en flow control te bepalen tussen twee apparaten die verbonden zijn via twisted pair-Ethernet. In dit proces delen de aangesloten apparaten eerst hun mogelijkheden met betrekking tot deze parameters en kiezen vervolgens de transmissiemodus met de hoogste prestaties die ze allebei ondersteunen.
Autonegotiatie wordt gedefinieerd in clausule 28 van IEEE 802.3 en was oorspronkelijk een optioneel onderdeel van de Fast Ethernet-standaard. Het is achterwaarts compatibel met de normal link pulses (NLP) die door 10BASE-T worden gebruikt. Het protocol is aanzienlijk uitgebreid in de Gigabit Ethernet-standaard en is verplicht voor 1000BASE-T gigabit Ethernet via twisted pair.
In het OSI-model bevindt autonegotiatie zich in de fysieke laag.

## Geschiedenis

In 1995 werd de Fast Ethernet-standaard uitgebracht. Omdat hierdoor een nieuwe snelheidsoptie voor dezelfde netwerkkabels werd geïntroduceerd, werd er een manier voorzien waarmee aangesloten netwerkadapters konden onderhandelen over de best mogelijke gedeelde werkingsmodus. Het autonegotiatie-protocol dat opgenomen is in IEEE 802.3 clausule 28 is ontwikkeld op basis van de gepatenteerde NWay-technologie van National Semiconductor. Het bedrijf gaf iedereen de toelating om hun systeem tegen een eenmalige licentievergoeding te gebruiken. Een ander bedrijf heeft inmiddels de rechten op dat patent gekocht.
De eerste versie van de autonegotiatie-specificatie, die gedefinieerd werd in de IEEE 802.3u Fast Ethernet-standaard uit 1995, werd door verschillende fabrikanten op verschillende manieren geïmplementeerd, wat tot interoperabiliteitsproblemen leidde. Deze problemen brachten veel netwerkbeheerders ertoe de snelheid en duplexmodus van elke netwerkinterface handmatig in te stellen. Het gebruik van handmatig ingestelde configuraties kan echter ook leiden tot duplex-problemen die moeilijk te analyseren zijn omdat het netwerk nominaal functioneert: eenvoudige programma's die gebruikt worden om het netwerk te testen, zoals ping, rapporteren een geldige verbinding. De netwerkprestaties worden echter aanzienlijk beïnvloed.
De autonegotiatie-specificatie werd verbeterd in de versie van IEEE 802.3 uit 1998. Vervolgens werd in 1999 de IEEE 802.3ab Gigabit Ethernet-standaard uitgebracht, die autonegotiatie verplicht maakte voor 1000BASE-T. Autonegotiatie is ook verplicht voor 1000BASE-TX- en 10GBASE-T-implementaties. Fabrikanten van netwerkapparatuur raden aan om autonegotiatie op alle netwerkpoorten te gebruiken en bieden het aan als standaard ingeschakelde fabrieksinstelling.

## Werking

Autonegotiatie kan gebruikt worden door apparaten die in staat zijn tot meer dan één transmissiesnelheid, verschillende duplexmodi (half-duplex en full-duplex) en verschillende transmissiestandaarden met dezelfde snelheid, hoewel in de praktijk slechts één standaard voor elke snelheid algemeen ondersteund wordt.
Tijdens het autonegotiatie-proces geeft elk apparaat zijn technologische mogelijkheden aan. Er wordt gekozen voor de beste algemene modus, waarbij een hogere snelheid de voorkeur geniet, en waarbij full-duplex boven half-duplex verkozen wordt bij dezelfde snelheid.
Wanneer een apparaat dat uitgerust is met autonegotiatie verbonden wordt met een apparaat dat niet over die mogelijkheid beschikt, wordt parallelle detectie gebruikt. Dit is ook het geval wanneer autonegotiatie uitgeschakeld werd op een van de apparaten. Bij parallelle detectie kan het apparaat dat in staat is tot autonegotiatie de snelheid bepalen en afstemmen op het andere apparaat. Deze procedure kan de duplexinstelling niet bepalen, dus wordt altijd uitgegaan van half-duplex.
Bij Gigabit Ethernet wordt autonegotiatie, naast het instellen van de snelheids- en duplexmodus, ook gebruikt om de master/slave-instellingen te bepalen.

## Duplex-problemen

Er treedt een duplex-probleem op (in het Engels spreekt men van een "duplex mismatch") wanneer twee aangesloten apparaten een verschillende duplex-instelling gebruiken. Dit kan bijvoorbeeld gebeuren als het ene apparaat geconfigureerd is voor autonegotiatie, terwijl op het andere apparaat de duplexmodus handmatig op full-duplex ingesteld werd. In dergelijke omstandigheden detecteert het ene apparaat correct de werkingssnelheid via autonegotiatie, maar is het niet in staat om de duplexmodus correct te detecteren. Als gevolg hiervan wordt wel de juiste snelheid ingesteld, maar wordt de half-duplexmodus aangenomen.
Bij een dergelijk duplex-probleem blijft communicatie over het netwerk mogelijk. Individuele netwerkpakketten worden nog steeds verzonden en bevestigd. Daarom zal een ping-opdracht geen problemen aan het licht brengen: de pakketten worden verstuurd en bevestigd met intervallen van één seconde. Een terminalsessie zal ook geen problemen ondervinden omdat de gegevens relatief langzaam verstuurd worden. Het is pas wanneer een van beide apparaten een grote hoeveelheid gegevens probeert te verzenden dat het netwerk sterk vertraagt.
De oorzaak van deze vertraging is omdat beide uiteinden van de verbinding tegelijkertijd gegevens proberen te versturen. Dit gebeurt zelfs bij een grote gegevensoverdracht via TCP wanneer het lijkt alsof de verbinding maar in één richting gebruikt wordt: de gegevens worden in meerdere pakketten verzonden, waarvan sommige een bevestigingspakket terug naar de afzender zullen activeren. Dit heeft tot gevolg dat pakketten tegelijkertijd in beide richtingen worden verzonden.
Voor het apparaat dat in full-duplexmode werkt is dat geen probleem, dat kan tegelijkertijd pakketten sturen en ontvangen. Het apparaat dat in half-duplexmode werkt kan echter geen pakketten ontvangen terwijl het gegevens aan het verzenden is en zal dus een "collision" (een botsing tussen binnenkomende en uitgaande pakketten) detecteren. Het apparaat stopt daardoor met verzenden en probeert het later opnieuw, conform CSMA/CD. Dit heeft als resultaat dat pakketten van het full-duplexapparaat weggegooid worden vanwege vermeende collisions en pakketten van het half-duplexapparaat vertraging oplopen of verloren gaan.
Het foutdetectie en -correctiemechanisme van TCP zal in werking treden, maar ook die pakketten zullen op exact dezelfde manier verloren gaan. Uiteindelijk zal TCP stoppen met het versturen van nieuwe gegevens tot er een bevestiging ontvangen wordt van eerder verstuurde pakketten. Omdat er op dat moment enkel nog hertransmissies en bevestigingen overblijven en omdat het interval voor hertransmissie steeds groter wordt tussen pogingen, zal er uiteindelijk een hertransmissie plaatsvinden wanneer er geen omgekeerd verkeer op de verbinding is, waardoor de bevestiging ontvangen wordt. Hierdoor wordt het TCP-verkeer opnieuw opgestart, wat op zijn beurt onmiddellijk weer tot collisions en verloren pakketten leidt.
Om duplex-problemen te vermijden moeten beide apparaten dus op dezelfde manier geconfigureerd worden, hetzij beide in autonegotiatiemode of beide handmatig. Wanneer er geen andere optie is dan de ene kant handmatig en de andere kant in autonegotiatie te configureren, dan moet half-duplex gebruikt worden.

## Prioriteit

Na ontvangst van de technologische mogelijkheden van het andere apparaat, beslissen beide apparaten over de best mogelijke werkingsmodus die ze beide ondersteunen. Van de modi die door beide apparaten worden ondersteund, kiest elk apparaat degene met de hoogste prioriteit. De prioriteit tussen de modi is als volgt:
* 40GBASE-T full duplex
* 25GBASE-T full duplex
* 10GBASE-T full duplex
* 5GBASE-T full duplex
* 2.5GBASE-T full duplex
* 1000BASE-T full duplex
* 1000BASE-T half duplex
* 100BASE-T2 full duplex
* 100BASE-TX full duplex
* 100BASE-T2 half duplex
* 100BASE-T4 half duplex
* 100BASE-TX half duplex
* 10BASE-T full duplex
* 10BASE-T half duplex
Vanwege zijn specifieke werking heeft Ethernet over een enkel draadpaar zijn eigen, optionele variant van autonegotiatie. Er wordt gebruik gemaakt van differentiële Manchester-encodering (DME) om transmissieparameters uit te wisselen op een half-duplex manier. De prioriteit tussen de modi is als volgt:
* 10GBASE-T1
* 5GBASE-T1
* 2.5GBASE-T1
* 1000BASE-T1
* 100BASE-T1
* 10BASE-T1S full duplex
* 10BASE-T1S half duplex
* 10BASE-T1L