Feldetektorn Theta

Ett väldigt centralt problem när man har datorer som pratar med varandra är att få dem att inse när någon av de andra har dött. Eller helt enkelt inte går att nå, eftersom någon del av internetlinan mellan egna datorn och den potentiellt döda datorn har gått sönder. Dessutom måste de förstå skillnaden på när de själva har fått en trasig uppkoppling, eller när någon annan har fått det.

En enkel lösning är då att alla datorer skickar små ”hur är läget”-paket till varandra. När de får svar, vet de att den de fått svar från fortfarande lever. Får de inget svar från en enstaka dator, är det förmodligen den som är trasig. Får de inga svar alls, är det de själva som har problem.

Det går ju enkelt att effektivisera det där, genom att istället bara skicka ”jag mår bra” till alla, med jämna mellanrum. Samma resultat, men med halva antalet nätverkspaket.

Sedan tar sommartiden slut, så det verkar som att man inte fått svar från någon annan på över en timme. Frågan i båda varianterna ovan är därmed hur länge man ska vänta. Ju kortare tid man väntar, desto snabbare upptäcker man problem, men desto oftare gissar man fel.

Om alla datorer skickar paket till alla andra med ungefär samma frekvens, kan man istället använda Theta-detektorn. Alla datorer har ju en lista med de andra datorer de kommunicerar med, och förutom deras IP-adress och vad man nu behöver, har man då även en räknare. Varje gång man får ett paket av någon, nollställer man den datorns räknare och räknar upp alla andras ett steg. Även datorer som kommunicerar lite mer sällan än de andra, kommer hålla sin räknare på en rimlig nivå. När en dator dör, kommer dess räknare istället öka och öka tills den slår i någon förbestämd gräns. Om det är 10 datorer som pratar med varandra, och någons räknare når 1000, när den i vanliga fall aldrig går över 100, mår den förmodligen inte så bra.

Om datorerna sitter i samma nät eller är utspridda över hela planeten, eller om någon dators klocka ändras lite, spelar nu ingen roll. En dator som kommunicerar mycket mer sällan än de andra, upptäcks med en gång ändå.

Problemet nu är vad ”i vanliga fall” betyder. En enkel lösning är att börja med 0, och sedan behålla typ 90% av det och lägga till 10% av varje nytt värde (eller 99 resp 1, det är bara en fråga om hur känslig man vill att den ska vara). Om värdena är någorlunda lika får man då till slut ett medelvärde som håller sig ganska stabilt. Tyvärr räcker det med några enstaka ovanligt höga värden för att skapa kaos.

Man får mer stabila värden från talseriens median, men att räkna ut den i en oändligt växande talserie är lite jobbigt. Då kan man använda Remedian istället (som jag använde i artikeln i april 2018). Den ger bara ett ungefärligt värde, men är lika effektiv på att filtrera bort undantag. Man får fortfarande vara lite noga när man väljer ”nu är datorn död”-gränsen, men det gör ju ingenting.

Sedan kan man låta bli att skicka flera ”jag mår bra”-paket i rad, utan vänta tills man fått ett sådan från andra sidan. Datorer som står nära varandra kommer då kunna skicka många sådana per tidsenhet, medan de som står längre bort (dvs högre ”ping”) pratar mer sällan. Då är det bara att jämföra medianerna för att de själva ska kunna upptäcka vilka av deras kompisar som står nära, och vilka som står längre bort.

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut /  Ändra )

Google-foto

Du kommenterar med ditt Google-konto. Logga ut /  Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut /  Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut /  Ändra )

Ansluter till %s