 Oké, welkom. Egen eerder begon ik te schrijven een TCPRP-stak voor Minix. En dan was ik jong, dus ik dacht dat ik weet hoe ik alles beter zou doen. Dus ik deed veel verschillende dingen van de dan-current BSD-stak dat iedereen gebruikt. En wat ik nogal leuk vind en andere dingen die voelen dat het niet erg succesvol zou zijn. Dus dit talk gaat over veel verschillende topics en zie je dat er veel dingen zijn. Een soort van kaas van Minix en een van de dingen die ik met mezelf kwam in het stak. Dus, ik was af en toe met mijn master gedaan. Ik ging naar I&D Tannenbaum en zei dat ik een PSD-student zou willen zijn. En hij zei dat ik een volledig gedeelte zou gaan gaan. En dan gingen ze met andere mensen en zei dat ik echt willen zijn. En die PSD-student. Dus ik heb er wat te doen om hem te impressen. En een van de dingen die ik deed was een TCPRP-stak. En, wel, natuurlijk, Minix was gebruikt veel om te trainen. Dus er is een boek die beschrijft eigenlijk elke lijn van de source in Minix. En je kunt gewoon zeggen, oké, ik ben echt een volledig file-systeem. Om mevrouw te introduceren en dingen zoals dat. Dus het had moeten echt minimaal zijn. En dan, de makkelijkste manier om een netwerk in twee minuutjes te ontdekken, tijdens het minimaal te houden, was het eigenlijk te presenteren als een device-driver. En in Minix was er natuurlijk al een message-protocool om te praten met device-driveren die in de kernel waren. En dan, als je gewoon een separate task hebt, dan is dan de netwerking device-driver. Dat kan werken. En dus je krijgt, zonder de normaal socket-kouden, je krijgt open, closed, read, write en IO-control als basic primitives die je nodig hebt voor de accessing en de netwerking device. En dan, ik dacht, wel, zonder een volledig interne structuur waar allebei kouden, etc. Ik wil dezelfde structuur in dezelfde structuur houden, interne, zelfs, ik denk dat iedereen het zegt, je moet niet build, layered implementations, zelfs als de netwerkstak is layered. Ik had in de achterkant van mijn mind, misschien, als het echt succesvol is en je kunt een nieuw boek kunnen schrijven, en dan describeer deze sourcecode. En het probleem met IPS, is dat je moet werken echt hard om het te werken. Er zijn alle soorten zonnele layering violations. Dus in dat sens, het is een goede exercice om je te volgen om echt een TCP-layer te hebben dat het kouden open, closed, etc. op een IP-layer en dan proberen we te formaliseren alle andere interacties. Maar het probleem was dat het een echt complex koude-backstructuur leidt omdat Minix niet met vreemd is. Dus je moet het als een grote state-machine schrijven en dat werd een mesh. En dan, een van de dingen die eerder op, ik weet het niet, en dat, wel, voor een lange tijd, veel mensen het niet weten, is dat als de netwerk is voel, dan moet je niet buffer pakken. Ik denk dat deze dagen het buffer bloot, maar op een gegeven moment heb ik gelijk, nou, als het TCP generert pakken en een IP probeert te passen op de internet-devijs en de internet-devijs is slecht, dan buffer je ze, ongeveer, maar je kunt ook niet dat doen maar gewoon zeggen, wel, er is geen ruimte voor pakken, nu gaan we weg en dan kun je een mooie non-blocking senden, dat simplifieert de koude veel en je krijgt hetzelfde voor het receive dus zonder reed, dan krijg je een koude-back en dan moet je een nieuwe reed doen. Je kunt ook zeggen, wel, geef mij een pakket en gebruik deze koude-back. Dat geeft een veel betere structuur, dus dat werkt wel goed nu. Een ander ding, dat was definitief BSD-inspired, is dat, op de tijd hadden we veel sendboxen die meer dan één interface had, want eigenlijk waren de routers slecht, netwerken slecht, als je een file-server had, had je twee netwerken, je file-server had twee interfaces om te zorgen dat ze op beide netwerken waren. Vergeet dat dan, en omdat van de loose multi-homing, je een applicatie zou hebben die een pakket over één netwerker zou krijgen en dan het weer over de andere senden, want, wel, wie wil waar het in en uit gaat. Dus ik wilde een heel klere separatie van alle interfaces en minix, in mijn stack, pakketten niet van één interface naar een andere, wanneer je dat explicitisch als routering define. Maar er is één grote drawback, natuurlijk, omdat, voordat je om te bouwen om een star te bouwen en dan pakketten van welke interfaces je nu moet innumereren alle interfaces en dat doen, dat heeft een advantage dat je ook zo wilt, dat je deze service niet wil op die interface, omdat je dat niet doet. Maar dus, het is een mooie feature dat er ook in complicities is. Dan dit heeft mij echt in gevoel gekregen, omdat, omdat er niet een soort van multihoming was, je had de traditionele looppack-device kunnen niet hebben, maar pakketten zouden nooit daar gaan. Maar je moet nog steeds de looppack-IP-adress supporten. En voor IPv4, zeker in die dagen, was het niet echt belangrijk om multiple IP-adresses per interface te hebben, en het zou waarschijnlijk wel eens zijn. Dus ik kwam met een hek dat als je het pakketten probeert te senden en je het detecteert naar de looppack, dan schrijf je een source en een destination-adress en dan senden je het op de stack, want dan denk je dat ik met mijn lokale IP-adresses een remote is leuk, dat is looppack, maar wie wil dat? Het werkt wel, het is een soort van vergelijking. Hier was de vergelijking echt uit de hand en dit was wel als je een app die trafiek senden, dan senden je het op een default route of iets zoals dat. Dus je moet een simpel route voor dat, zeker als je multiple routes of directies of iets zoals dat hebt. En dan effectueel heb je 1 per interface, want al die interfaces zijn sterkte separaties. Maar als je het dan in een route maakt, dan heb je ook een route dat schrijft. Als een pakket komt uit interface A, dan waar zou je het gaan? In interface B, en ik maak dat sterkte separaties. Dat krijgt dan heel verkeerd, omdat het mogelijk is dat je een route is, maar dat jouw apparaat traft op een default route want deze eerste output van een route is een verschillende route dan jezelf. Dus zeker voor IPv6 probeer ik gewoon de RFC te volgen en niet meer te doen. Het andere, eigenlijk niemand begint het. Je geeft een route met minus i of minus o-optie en wat doet dat, niemand weet. Dit was een soort gecreëerd minix structuur. Als je een accept system maakt, dan doe je een listen en een file descriptor en dan doe je accept op datzelfde file descriptor, maar je krijgt een nieuwe file descriptor terug. En er is echt geen manier om dat concept in minix te expressen, want de enige manier om een file descriptor te krijgen is te openen. Je kan niet alleen andere maanden maken die ook file descriptor terug geven. Dus ik bedoel, misschien we moeten niet accepten. Ik heb gewoon een listen geleerd en dat blok en dat wacht voor een connectie te komen en dan terugkomt de connectie. En dan begint het te spelen. Dat werkt goed. Je hebt jouw server en je vertelt dat op en je hebt een soort i-netd die een nieuwe tcp een nieuwe tcp file ook listen en etc. En dan krijg je webbrowsers en webbrowsers in parallel, gewoon 6 requesten of wat niet op dezelfde tijd. En dan, alle van hem, except de eerste, krijgt een reset terug. Dus dan zijn webbrowsers helemaal geconfused en ze zeggen, dit doet geen sens. Dus dan een makkelijke manier om geconfusing van je webbrowser is om de reset te dropen. Als je detecteert dat er connecties ontwikkeld zijn van listen maar gewoon niet op de reset die dan creëert het probleem dat, omdat het nu een dropt pakket is je krijgt een tijdout, die ook heel snel maakt. Dus, eigenlijk op een gegeven moment om het op te geven en dan kreeg ik een listen cue en dan de listen file, de scripter krijgt een cue van open tcp connecties want ik kan nog niet echt implementeren, maar ik kan doen iets met cookies waar je naar de listen file, de scripter zegt, geef me cookie voor een connectie en dan ga je naar een nieuw file, de scripter je zegt, hier is een cookie, ik wil een connectie en dan kan ik direct de connectie van een file, de scripter naar een ander en je hebt dezelfde effect. Dus, soms met de framework require wat extra creativiteit om het op te werken. Dus, dit is ook een groter gegeven als je een message passen doet en dan zie je nu ik moet doen, non-blocking IO en select, dan dan wordt het gewoon een grote mess. Je moet zeggen, file system select dan moet het de operatie op de open file de scripters, en dan misschien 1 responsie. Maar als ze niet zijn, dan moeten alle van ze remember state dat als er op een moment iets gebeurt ze moeten terugkomen. Voor Minix 3 hebben we dat eigenlijk geïnplamend en ik denk dat het een volledig mess is. Maar als je A-sync in de IO dan wordt het rather easy want als je een normaal blocking is en je een message zet en in het geval van Minix moet je terugkomen, ik ben busy en dan later de device driver zegt, oké, ik heb iets gedaan. Met A-sync in de IO senden we de operatie en dan vertel je de applicatie oké, gewoon continu en dan alleen de file system moet remember a table, dit zijn alle operaties die ik begon en dan op een moment de applicatie kan blocken en zeggen, geef me de status om een reply te hebben oh ja, hier is de resultat dus het probleem is natuurlijk niemand schrijft een code zoals dat dus als je iets wilt porten is het non-blocking IO en select en het probleem met non-blocking IO is dat wanneer je de non-blocking IO doet er is geen buffer in gebruikerspaas dat is locken, waardoor met A-sync in de IO je immiddels een buffer lockt in sommige cases heb ik dat ik nog niet denk zodat ik een reed op een buffer die op de stack was en dan natuurlijk stack frames gaan maar de A-sync in de IO-operatie is nog in probleem, dus op een moment dat is de stack dus porting dan betekent ook een complete non-blocking IO library in gebruikerspaas, wat ik deed wat werkt of rewrijd de voortbouw zodat het A-sync is soms is het makkelijk te doen, soms is het heel hard te doen hier zijn 2 examples van je moet gewoon echt niet doen, maar dus de eerste was nou een basic IP op en rond op een moment wil je ping hebben en je hebt bsd ping code en dat is allemaal soorten complicele dingen dus dat zal echt een lange tijd te porten, maar het is heel makkelijk om een programma te schrijven dat een icmp dan gaat een icmp terug en het zegt god, iets dus, ping was geboren en dan soms later voor minix vmd ik ported de bsd ping en ze dachten niet meer maar in minix 2 mijn originele ping leefde op en niemand wist dat dit echt een groot probleem was dus op een moment de VU, mensen weren wat probleem met de lab waar er minix vmd waren en het was een collectiviteit, etc. en ze gebruikten de ping en de ping zei god iets wat was de destinatie van een reachable of host een reachable icmp het was helemaal geconfused want de ping zegt dat het werkt maar het werkt niet het was iets zoals ik zou dat nooit doen hetzelfde gaat voor de andere in ipv6 hebben je routeradvertisementen waar routers zeggen dat ze een default router zijn en je hebt iets simpelers in ipv4 maar het is eigenlijk nooit opgekomen omdat wanneer de internet is populair het was dhcp die de default router kan geven en vanaf iedereen had een soort hack om te luisteren om te vinden wat de default router was maar inderdaad Solaris had het supporten en het was een mooie clean icmp dat is heel simpel in ipv6 maar soms was ik op een netwerk waar de router niet opgekomen was dus ik heb een kleine programma die een RIP2 icmp opgekomen was en dan die routeradvertisementen het werkt heel goed maar dan je moet een compliment en je moet ook een root sollicitation senden en voor verschillende redenen in sommige cases was het erg aangenaam om die root sollicitations te senden dus wat ik deed ik haalde de timers het protocol was dat het een sollicit misschien 20 minuten en dan, als je een boot is, je vraagt voor 1 en dan zet de timers op 30 seconden en dan, want het werkt heel snel, je moet het niet doen het werkt goed er was een andere deel van het protocool en dat zei, wanneer is het het expirert 2 of 3 keer de tijd van het leven en dat was het advertising voor 30 seconden dus op een gegeven moment een van de minix-machine was op een netwerk met solaris-machine en dan was het duurzellig op voor de hele werkdag dus op een soort schik in de ochtend een hele bunch van solaris-machine lopen hun default root en omdat die ICPs voor minix zeiden, wat tijd is er een paar minuten dus na dat is het gegaan en dan was er ook 1 en dan 20 minuten maar ja, natuurlijk, dat kwam een tijdje voor dat kwam de mannen die hadden te ontdekken dat altijd, omdat hoe vind je uit waarom een hostie leeft in de default root het zal nooit zeggen dat het internale timers staat ik denk dat misschien een van de grote dingen in veel netwerkstacks is dat ze die details niet uitleggen dus, ja de soort meest horreble dingen die gebeuren een ding is het ding is omdat de IO-contraal was ik had een onlimmende flexibiliteit om nieuwe kolen te maken en al die kolen hebben gewoon de structuur als parameter dus voor TCP had ik een TCP structuur dat betekent voor TCP waarschijnlijk normaal sokken zijn heel hard te hebben dat is een heel sensabeel bouw voor TCP en UDP en je hebt verschillende dingen zoals ingewikkeld messages die voor alle protocols en dan als je geen generic kolen hebt watsever en je probeert een sokken emulation dan wordt het heel complex want je krijgt in een file descriptor dan moet je eerst proberen te figuren wanneer het TCP of UDP is en dan doe je de probleem actie en een van de zet dingen hier is dat laatste jaar de Minix 3 project decideed om iNet met lightweight IP want ze wilden een soort volledig netBSD compatibiliteit en decideed om dat te mapen tot iNet was eigenlijk impassable ik denk dat het niet zo hard was om de generic kolen te laten maar maar het maakt portingapplicaties een beetje harder en surprising het maakt het niet hard dat ze zei want ik weet dat het kan worden maar het lijkt altijd makkelijker te veranderen wat ik wil hebben om het echt te veranderen een ding dat ik vroeg eerst op je moet natuurlijk buferdatastructures voor veranderen en ik kwam op je hebt bufers die referentie kouden na de eerste port naar een andere systeem had ik ze van verschillende sizes dus toen begon je bufers van 512 bytes want dan drie van hem konden exaclij in de internet pakket maximaal veranderen in de internet pakket en in 16 minuten je wilt geen veranderen en later had ik groter bufers en dan had ik een kleine access data structure dat je kunt gebruiken om die bufers te linken maar ook te slijden ook referentie kouden en het werkte vooral sinds de begining dus het meeste dat ik dat heb gegeten in one go dan er soort dingen die een goede idee waren maar ook een goede idee maar ook een goede idee een ding dat ik dacht is als je je applicatie begint en er is nu IPv4 dan is het heel ongelooflijk als je vraagt voor de IPv4 en dan krijg je dat er geen IPv4 want wat doe je dan dus ik bedoel, als er geen IPv4 dan kan je gewoon alles blokken tot een IPv4 en het is helemaal transparant en het werkt bijzonder dat als je in je rc script iets doet en je geen IPv4 en het hele ding hangt het werkt bijzonder dat dus zeker niet meer dat voor IPv6 ik weet nog niet of het goed was of het niet goed was om het voor IPv4 te doen wat ik voor IPv6 deed was dat er is nu een concept dat je multiple upstream routers kan hebben en in IPv6 je kunt multiple prefixes op jouw netwerk maar het is mogelijk dat 1 upstream routers alleen een zet van source addresses dus dat is dat source desrouting en ik wilde met dat spelen dus ik maakte dat voor IPv6 alle internaal routing tabels ook een source prefix om dat te maken en dan wilde ik een routing protocol hebben gedaan maar de enige routing protocol die ik voelde was RIP eigenlijk is er geen manier om extend RIPv6 maar er waren wat sparen bits die je zou kunnen hacken dus ik kreeg voor mezelf een extension die ook die source prefixen want meestal in mijn huis ik heb alleen routers based onminix dat werkte goed tot op een moment wilde ik een wireless access point dat je ook op IPv6 doet en dan allemaal soorten weird things starten want wanneer ik het niet verstaat deze particular RIP en was het gewoon een pakket naar de wronge router en dan de router complainen maar het moet hier niet zijn dat moet een stupige router zijn en dus daar je kunt nonstandard extensies creëren maar ja, het kan terug terugbijten hetzelfde niet echt nonstandard maar er is een concept van een IPv6 called happy eyeballs en dat was eigenlijk veel mensen had IPv6 turned on maar omdat geen web server had een IPv6 address niemand houdt dat ze een broken IPv6 configuratie had dus Google en andere grote sites essentieel 4 stacks of browsers om de feature te implementeren om IPv4 ook te proberen of om een klein deel van de tijd en dan om IPv4 te proberen dat deze eror is opgemaakt en ze proberen het happy eyeballs en ik deciderde om uit te gaan en doen happy eyeballs in iNet dus iNet voor alle TCP-connecties continuus trekt maar de rondtrip tijd is 2 adressen en dan is er een extra call die je zegt ik heb de volgende 5 adresses kan je me zeggen wat de rondtrip is en dan ik deciderde ik heb niet echt een web browser maar ik heb een mail server dus ik heb dat opgemaakt maar dan gebruiken we soms v4, soms v6 en het is heel verkeerd over wat het decide dat het moet doen of het niet moet ja het leeft aan dingen waar je niet het systeem niet meer weet dus ik weet niet hoe lang dat ging niet zo lang maar zeker als ik een ppp voor het eerst wilde ik een tunneling device creëren en geïnspireerd door de Psydo TTW die we allemaal gebruiken voor terminals dat Psydo IP device en dan je kunt eigenlijk alles het is niet internet je kunt het gewoon in de gebruikerspaces dus toen ik had ISDN ik had gewoon ppp demon die op ISDN mault en mault voor serial en dan op een moment voor ADSL het eerste wat ik had moeten doen was pptp en dan pptp was gewoon een soort bekend filter op de ppp demon en later als dat became pppoe dan kan je dezelfde doen hetzelfde wat ik deed voor ipv6 met de tunneling en dan iemand ook op een gegeven moment een pppn implementatie met dezelfde interface ja, gewoon voor minuut dus er is veel wat je kunt doen in de gebruikerspaces en soms als ik op 3bsd dan is er allemaal tunneling, configuratie, opties et cetera en dan ja, waarom niet alleen in de gebruikerspaces en je hebt niet alle complexiteit in ijfconfig of iets dat lijkt me de einde van alle lezen ik ben echt dood om distributies te maken dus na het laatste jaar maakte ik zeker dat er wat behoorlijk image's van minuut vmd waren gegeven dus ze zijn er nog een jaar oud, ik denk niet er is echt veel veranderd dus als je dat wilt spelen dan ga je ernaar vragen of iets de vraag is over ip tables in linnex, toch? ja ik heb iets simpel ik heb de basis voor implementeren maar zoals ik heb gezegd om ppp te doen ik wil dat component basis doen dus ik heb een interface die zegt vertel me iets over de volgende pakket en dan kan je zoveel bytes zoals je krijgt voor de volgende pakket dan decideren, drop of rejecten of passen en iets zoals dat en dan de actuale netwerkstek niet moet weten de politie ik denk dat het helemaal in de gebruikerspaces is dus dat is mijn plan om te doen de andere ding daar die dat Rijntunnel VPN ook uitgezet in een verkeerde functie en toen ik begon te doen IPv6 dan was er wel niemand op IPv6 te doen dus we hebben nog geen verkeerde wold dus het is alleen in de laatste paar jaar dat het meer pressen is ik zou echt de verkeerde wold doen om te make sure dat IPv6 een verkeerde wold heeft en we hebben dat gebouwd in de VPN ja dus de vraag is hoe lang het gaat om te implementeren dus ik zag dat vorig jaar en het lijkt dat met een basic internet IPv6 en TCP op en rond en wat ik did voor TCP is het begonnen om de RFC te volgen het heeft een hint voor een staatmachine en dan later overigens ik het modificeerd om meer te maken er is wat weirde dingen daar en de andere ding ik deed was op een gegeven moment gehouden een echt populair content en dat zou mijn staat creëren of anders het misbehaal en dat is de soort van dingen die je moet echt de bugs uitkijken en dat kan een lang tijd nemen dus het eind van de ronde is niet zo hard maar de bugs uitkijken, dus dat is de vreemde geen meer vragen daar dit is een iNet voor NUXVMD soort van beide nu Minix 3 nog steeds ships met iNet maar ze hebben het nooit betaald dus het doet het niet op IPv6 hoeveel is je informatie met de informatie over Minix 3 bijvoorbeeld dat ze geen IPv6 hebben dat is ik weet niet wanneer ik het laatst werkte dus misschien was het 9 jaar geleden dat ik een paar werken op Minix had dus dat zou de laatste keer zijn en alles wat heeft gebeurd in de vorige 9 jaar is niet hier maar deze dagen heb ik zoveel andere dingen te doen dat ik niet veel spijt dus het meeste wat ik echt deed is IPv6 en ik deed de vervolking en misschien wat andere kleine dingen ja, bedankt