Implementation of SCTP in Go (FreeBSD) - Olivier Van Acker, EuroBSDcon 2012
Dankjewel voor het attenderen van m'n taak. M'n taak is om... Ik heb m'n maas en computercijns geïnteresseerd. En m'n licitatie-topiek was om te implementeren... of om de go-librariën, de netwerklibrariën... met het STTP-protocool. Dus dit is wat m'n taak is om. Een kort introductie. Ik leef in Londoen. Ik studeer per tijd... op de Berkbeek Universiteit. En ik heb me voor het broadkasten... de meeste van m'n werklibrariën werkt. En op het moment werkt ik voor een bedrijf... die voor kinderen ingebouwd is. Dus, waarom 3BSD? Dus, eerst eigenlijk een vraag. Who is familiar with the STTP-protocool? Oké, een beetje meer over het STTP-protocool. Het is een transportleerprotocool... in hetzelfde leer als TCP en UDP. En het is 10 jaar oud nu. En het begint te krijgen... wat traktieën in specifieke industrie's. Ik zal het een beetje meer overleven. Go, who is familiar with Go? Niet zo veel. Oké. So Go is a new computer language invented... of created by people in Google. Most notably, Ken Thompson en Rob Pike... are the main contributors to this language. Oké, het is een wide 3BSD. Eerst van All Go runs on 3BSD, dat is een goede ding. En de referentie implementatie van STTP... is mainly done on 3BSD. It's also done mainly on Mac OS X. En de demo we'll give at the end of this talk... will be on OS X. Dus eerst, we'll give an overview of STTP and Go. So everybody can get familiar with what it actually is. Oké, de eerste ding met STTP... het is een connectieprotocool. En het is bijzonder aan TCP... in dat je een socket kan openen, een connectie kan openen... zoals met clienten en server. Maar het is ook bijzonder aan UDP... waar je een message kan senden aan een server... en dat zal een connectie openen voor je. In STTP, je gaat niet echt over een socket. Je hebt sockets, maar als je over connecties... en connectie van een server naar een client... of van een client naar een server... je gaat eigenlijk over associatie. Dus wat is een associatie? Is het visibel? Niet echt. Oké. Dus, laten we zeggen dat dit de server is. En dit is een client. De eerste ding dat je ziet als je een STTP-applicatie creëert... is dat binnen een unieke connectie... je deze concept van streams kan hebben.  Dus wat betekent dat? Dus binnen STTP kan je eigenlijk een specifieke data... of al de data is message bound, zoals UDP... maar je kunt het over een specifieke stream senden. Dus als een stream van data loopt... van de pakketjes, er zijn er veel dingen die je hebt in het STTP. En dat probleem is de voordeur van een lineblokking. Dus met STTP kun je het met verschillende data streams hebben... en als je data niet vergelijkt met elkaar, senden je het over verschillende streams... en het zal elkaar niet blokken. Dus dat is een van de concepten van STTP. Een ander ding die je meteen ziet... is dat binnen een STTP-associatie... je kan meteen een verschillende netwerk routes hebben. Dit was eigenlijk de meeste... door een request van de telefoonindustrie... die niet echt heel blij was met de voordeur van de capaciteit van STTP. Dat was 10 jaar geleden, maar... Een ander leuk ding over STTP, of wat ik leuk vind... is dat, zoals UDP... je kunt een unieke server met een unieke associatie... leren op een unieke associatie... en verschillende klanten kunnen het connecten. Dus dat is een heel kort overvulling van wat het is. Dus ik heb dit al gemeld. Het is niet een byte stream protocol. In STTP heb je message-boundaries. Juste dezelfde geluid in UDP. Een ander ding... wat ik denk dat het belangrijk is... is hoe de connectie is opgezet. Als je het met STTP comparet... je krijgt een synch, een acknowledge... en als de red dot-resources getallocated. In STTP... je... eerst initialiseert... dan krijg je een acknowledge... waar de server wat informatie zet. De klant moet dat resend... en zeggen, ik ben echt... ik ben echt waar ik ben... en dan de red dot-resources getallocated... en dan krijgt de acknowledge... het red dot-resources getallocated. Dit mechanisme betekent... een synflute attack. Dus een kort compare met... met STTP... want ze zijn heel simpel. Als je kijkt naar het STTP socket-app. Je ziet hier over, socket, bind, listen... accept... het red dot-resources getallocated. Dit is voor de serverseid. En als je kijkt naar het STTP-seid... je ziet socket-bind, listen... en dan receive-message, send-message... en close. Het ding dat je ziet is dat... de zetting van een connectie in... STTP is implicit. Dus je hoeft niet te zorgen over dat. De andere ding dat je ziet is dat... STTP maakt gebruik van receive-message...  en send-message. Deze zijn... gedeelte systemkals. Ik denk dat ze in het BSD... in een van de eerste. En receive- en send-message... zijn ontwikkeld om... send-messages... samen met encilleriedate... zoals metadata over wat je sendt... naar de andere kant. STTP maakt gebruik van dat mechanisme... om STTP-speciele informatie... via die systemkals te senden. Oké, nu... de IFU van Go. Dit zal echt een brief zijn... over wat er mogelijk is in Go. Maar we zullen alleen... over dingen die relevant zijn... voor dit talk. Dus de eerste ding die je ziet... als je... variables hebt... is het de eerste ding dat je ziet... het heeft een seizoontaxco... maar de eerste ding die je altijd... meteen je je ziet... is dat... de type is na de naam. Dat is een van de dingen. Een ander ding is dat... Go heeft pointers... maar het doet geen pointer... arithmetisch... om het gewoon te houden. Om het gewoon te houden is eigenlijk... een van de ontwikkelde filosofies van de Go... ontwikkelde team. En dan heb je verschillende manieren... om je variables te creëren... te initialiseren. Als je het niet zegt... dan wordt het altijd geïnitialiseerd tot 0. Dus je hoeft niet te denken over het. En als je een specifieke waarde wil... kan je het zeggen zoals dat. Dus laten we eens kijken naar de functie. Een van de dingen met Go is dat... het is een normale functie. De type komt na de naam... zoals ik zei. Maar de andere ding is dit deel... is dat functies in Go... kan hebben verschillende return types. Dus wat je hier ziet... dus bijvoorbeeld als de count... equals 0... oh, dat zou een dubbele... equals signen, nee. Dan kan je zeggen... je kunt een error senden... of ooit een greeting... en dan de error... wordt 0. Dus als je deze functie hebt... dan kan je deze functie callen zoals dit. Dus een greeting... en dan de error. Dus de twee variables... en ze worden initialiseerd... en gecreëerd via dit symbol. En dan... je kunt zien, je kunt kijken voor de error... en of je kunt gewoon de greeting printen. Als je niet interesseert in de error... omdat je dat weet, dan zal het altijd correct gaan. Je kunt het in de score ignoreren. Dus... in Go, je kunt ook structuur hebben. Je hebt een type... struct en je hebt er wat variables in.  Dat is heel straks. Als je een method wilt aanstellen... op je structuur... dan bevind je het niet binnen... je structuur zelf... maar buiten... je zegt iets zoals dit. Je zegt... ik heb een functie... die is called Say Hello... en ik wil dat aanstellen... op mijn persoonlijke structuur. Dat heb ik gewoon gezegd. En de input van deze method is... een string. Go ook heeft interfaces. Dit is een extreme simpele implementatie... waar we een animal interface hebben. We hebben een cat object. Het heeft niets in het. En we add de implementatie van de tagmethod. Het is hier. Je kunt zien... de tagmethod is ademd... naar een cat object. En dan hebben we een kleine programma hier... die eigenlijk... initialisert een cat object. Dan de cat object tags. En in deze... creëren we een variable... van een animal type... met de cat object... die eigenlijk dan wordt gecast... naar een animal object. En dit is zoals een animal object... die tagstandig is. Dus er is veel meer... met de Go language. De dingen die ik eigenlijk niet opgemoet... zijn go-routines... en channels... die een... mechanisme om concurrentie te doen. Concurrentie is eigenlijk primitief... gebouwd in de language zelf. Het is een beetje zoals Erlang. De andere ding die ik heb gegeven... is dat... Go heeft kloosjes. En een andere interessant ding... die is wat... op te kijken is slices. De mensen zeggen dat het heel mooi implementeerd is. Op de Go website zelf... is er een interactieve tutorial. Het is 15 minuten om door te gaan. En dan heb je een heel goede idee... wat de language kan doen. Oké, dus nu een beetje... over de Go Network Library. Want... het probleem... dat ik in mijn citatie stelde... is... als ik de HTTP protocol heb... hoe goed zal het fit... in de existe... Go Network Library. En... want conceptief... HTTP is... heel verschillend... van TCP en UDP. Maar het is ook... heel simpel. Dus... deze bezoek was eigenlijk om te vinden... of het mogelijk was... om de existe library te gebruiken... en te extenden... zonder een nieuwe library te creëren. Dus... wat ik eerst ga doen is... eerst ga ik je laten zien... een heel typische... echo... wat is het? Een klient die een message... met TCP. Ik hoop dat mensen dit kunnen readen. Dit is zoals package import... voor de netlibrer...  en dan hebben we een function main. En hier in... zie je... we doen een dial... met de TCP protocol... op de lokale host. Dit is de klienter. Dit bewerkt een error... en een connectie object. Dus als het error... is nul... dan... oh, dit is een mooi feest... en de go is dat... we kunnen eigenlijk... eerst zeggen... dat we de connectie willen zetten... als het niet meer nodig is. Dit is heel belangrijk... als je er verschillende exitpoints hebt... in je function... je hebt alleen de state... de connectie... de close ones. Je kunt het doen met alle soorten... met alle... verschillende functies of methods. Oké, dus dat is de close statement. En dan, als de message is bewerkt... als we de connectie hebben... we schrijven een message... die is zoals een bijterrain in de hallo-wereld. Dus dit is de meest typische klient... die je kunt doen. Dus alle andere protocols... in de go-network-library... zoals Unisockets, UDP... dat... maar dat is het eigenlijk... en TCP... ik gebruik dezelfde mechanisme, het dial... voor de klientzijde. Dus nu een quick look... hoe een server... zou deze message... dus... wat we over hier zien... is dat we eerst een listen creëren. We doen een lesson... die een lesson object creëert. De lesson eigenlijk... doet de creatie van de socket... de binding aan het... en de lesson... al in één keer. Dus de drie systemkals... zijn eigenlijk rakt... in deze... deze. We checken voor een error... we creëren een buffer... om een message te houden... en dan hebben we een... een eindlijke loop... waar... we een accept... voor... een inkomende connectie. Als de connectie daar is... reed we van de buffer... en print het uit... en dan starten we weer. Dus... heel straks... niet zo veel code. Persoonlijk denk ik dat het heel reedbaar is... als je het ziet. Dus ik vind het wel zo. Dus... de volgende deel van deze talk is... om de go-network-librer met SETP te extenden. Dus als we dan kijken... hoe een server moet zien... we... we hebben... wat we... vorig jaar hebben we de net.lessen... die eigenlijk... implementeren... de lesson interface... in de go-network-librer... en de lesson interface... is een interface... voor stream-orienteerde protocols. Dus er is ook een listen-packet-interface... wat voor message-based protocols is... zoals UDP... en in dit geval SETP. Dus wat ik heb gedaan... ik heb dat interface... de listen-connectie...  van de listen-packet-interface... en het begint te implementeren... alle SETP-methoden. Dus... een typische client moet zo zien... listen-packet met SETP protocol... start to listen on localhost. Ook dezelfde defer... closed connection... en daar... we maken een byte-array... en dan we reed-from en dan printen dat. Ja? Dus je kan alweer zien dat het eigenlijk extreem is... het is een soort van dezelfde... maar het gebruikt dezelfde mechanism... als andere protocol en go-work-librer. En als we meer specifieke... SETP functionality willen gebruiken... bijvoorbeeld we willen weten wat de stream-idea is... zodat je weet welke stream de data komt uit... of je wilt kijken naar de associatie-idea... zodat je weet waar het eigenlijk komt uit... dan kun je een meer specifieke call doen... waarin ik het SETP-connectie-object adem... en wat dan een reed-from SETP doet. En dan... is het een soort extentie te reed-from... maar als je kijkt naar de return-valu's... dan heb je meer specifieke SETP-informatie terug. Dus bijvoorbeeld... de SID is dan de stream-idea... en de AID is dan de associatie-idea. Dus als je in dat interesse bent... gebruik je een meer specifieke call. Dus een typische server... die meer SETP specifieke is... en het gebruikt meer van de SETP-functionale... zou zo kijken. Eerst moeten we een SETP-adres-object hebben... waar we dit hebben gecreëerd... dan hebben we een connectie-object... en dit connectie-object is niet alleen een packet-connectie-object... het is een SETP-connectie-object. Dan zeggen we SETP... het is meer specifieke... we zeggen SETP-protocool... en dan zeggen we... we geven het de adres... oké, de verkocht... en dan gaan we naar de voorloop... voor de message... en hier zie je SETP-specific method... reed-from-SETP... en in dit geval... ik ben alleen interesseerd in de stream-idea... waarin we de message samen printen. Dus nu... hoe... ik zal het uitleggen hoe ik het implementeerde... en ik zal alleen kijken naar de server zichzelf... omdat van tijd-constraints. Dus we zullen... praten waar de systeem gaat... en dan allebei op. Dus... als je in de source-code gaat... als je allebei naar beneden gaat... en dan zie je... hoe de systeem gaat... dan zie je... op een certain punt zie je... een assembly-code... en dit is eigenlijk de laad tussen de go-language... en de kernel. Dus... deze zijn heel generische systeemcalls... waar je kunt eigenlijk zeggen... dit is de systeemcode-nummer die ik heb... en deze zijn de parameters... die ik wil passen op deze systeemcode...  en dan krijg je een return. Dus... ik heb een assembly... als je dan een beetje verder kijkt naar de go-librer... en specifiek in de syscall-librer... je ziet een hele host van perl-scripts. Deze perl-scripts zijn eigenlijk gebruikt... om de code te genereren... waar je eigenlijk de systeemcalls via... de assembly-code kan aansluiten. Als je begint te ontdekken... dat was eigenlijk deze... perl-scripts... ze kijken naar het headerfiles... en in het geval van FreeBSD naar de master-syscall file... of is het syscall master... om eigenlijk de systeemcalls... en de correspondeercodes te genereren. Dus wat ik deed was eigenlijk... de SETP headerfiles te ontdekken... en op het juiste richting... ik had om mijn FreeBSD-kernel... op de laatste versie te ontdekken... om de laatste SETP API te beperken... die eigenlijk 6 maanden geleden veranderd was... en dan begon het te genereren... van deze systeemcalls. Dus wat ik ook nodig had om de structuur te ontdekken... om de structuur te ontdekken voor installatie data... waarin het send- en receive-message nodig is... speciaal voor SETP... is in dezelfde manier gedaan. Er zijn ook specifieke perl-scripts... die op het juiste richting gaan. Je moet de handcode hier en daar... en dan krijg je alle informatie die je nodig hebt... om een low-level access naar de kernel te hebben. Dus dit is... het zou het beter zijn... als dit een sequence diagram was... maar als je kijkt naar dit... je ziet syscall... het is eigenlijk de syscall... naar het assembliescode dat ik je showed. En dan op het top van dat... je doet een syscall-listen. Dat is een... een rapper rond de... genaamd... van de rapper... ronduit de genaamdcode... die niet echt... niet echt mooi fit in de go-philosofie. Het werkt eigenlijk met ongevingpointeren... en niet altijd go-pointeren... casten rond. En dan... op het top van dat... je doet een internetsocket... een call... en dan... er zijn... de andere systemcalls... die zijn gedaan. Ik heb hem aan de kant... en op het top van dat... je ziet de list in SETP... die ik je showed in de andere example... en boven dat is dan de list in packet. En dan... op het top van dat... en alle die onderzoeken... je kunt ook gebruiken... als je echt specifiek dingen wilt doen. Ik denk dat dat een van de mooie dingen is met Go... en hoe de netwerklibrer is ontwikkeld... dat als je niet echt... interesseert...  in de nettegritty details van een specifiek protocol... je kunt gewoon... gebruiken... de echt simpel method... maar als je echt specifiek wilt gaan... je kunt... dieper en dieper en dieper gaan. Dus... oké, dus dit is dan... dezelfde... waar je de systemcalls... naar de recievenmessage... je ziet de recievenmessage... is... het nummer... die... ik denk dat de master-syscode nummer is... 3BSD... en dan gaat het allemaal op... en dan... een mooie, mooie wrapper... om het makkelijker te gebruiken. Oké, dus nu... ik ga een kleine demo-session doen... ik moet zeggen dat er al deze fouten... op mijn Bitbucket-account is... zodat ik een Go-CTP heb... die kan beklonken... en deze boot... dit werkt... op Mac OS X... en 3BSD... en het moet de laatste versie zijn... zodat de systemcalls niet correct zijn. Oké, de mooie ding met Go... is dat je... kan de compilatie en de executie... in één stap doen... om te zeggen Go-run... dus... de deel van de demo... dus... en de eerste ding die je ziet over hier... is dat de dial... het zegt dat het protocol niet supportt... want dit is intentieel... hallo... we moeten het... oké... dus... dit is intentieel... omdat ik de drive niet lood... of al... de drive compilate... en nu doen we... de run... de server... het is eigenlijk bijna dezelfde... als in de examples, er is alleen één verschil... dit is eigenlijk... leren voor een message... het is geen echo voor de client... dus we gaan een server... runnen hier over hier nu... dus we gaan hier... dus... we doen... dit is in een kleine... eigenlijk kan ik de code laten zien... het is een beetje meer code... dan op de... slides... wat je hier ziet over hier is... je ziet... is het readable? ik sende een message... oep... ik sende een message alle 1 seconde... en dan wachten voor de message... je kunt zien de... write2... en dan de read from... en dan is er een volle loop... dus... let's run dit... als de client... en als we kijken naar de server... we zien de server over hier... om dat message te bekijken... eigenlijk wil ik het een beetje verschillend doen... want ik wil zeggen... dit message is... de eerste... de eerste message is gegeven... door de server... en nu... om de associatie te demonstreren... soort dingen... we gaan beginnen... en... een tweede client... met... een tweede...  en let's have a look what the server says... and the server is receiving both messages... dus de server is eigenlijk... just listening on 1 socket... which is an association... en is receiving now messages from... 2 different clients... dus... dus dit implementatie ik heb gedaan... zo ver is eigenlijk een heel basic... implementatie... dit is de kind of the minimal implementation... needed to actually make STP... work and go... ik heb eigenlijk plans for future work... een van de dingen die ik wil doen... is dat... STP is niet available on all platforms... dus het is niet natively available... bijvoorbeeld on windows... on other bsd... ik weet het eigenlijk niet... maar er zijn implementatie... van STP... in userland op top of udp... dus een van de dingen die ik wil doen... in de volgende stap... is eigenlijk... implementatie STP op top of udp in go... en dan... de... wherever you... whatever platform you're using... je kunt altijd de STP protocol gebruiken... in dat manier... een ander ding wat ik wil doen... is dat... go heeft de go-outtains... die hebben channels... en... deze channels communiceren met light weight... functies... de erlang-model... van... concurrentie... waar mesjes past... van... background-proces naar een andere... en er used to be... een library in go... de net-gen library... waar deze channels kunnen... run over een netwerk... maar dat is... voordat version 1 of go... die library getoeld... met implementatie... nu... ik denk... ik ben niet zeker... want ik moet het eigenlijk implementeren... en verbinden... is dat... de concept van streams... is... een net-channel... dus een stream zou een net-channel zijn... en ik denk eigenlijk... om een alternatief... voor deze net-channel-librer... zodat... go-routines kunnen starten over een netwerk... dus dat is eigenlijk de toekomst... van wat ik wil doen met mijn research... dus... als mensen in mijn werk... er zijn... een wordpress, twitter... op de bitbuckets... ik gebruik... want de go... de official go repository... is gebruik... mercurio... die is ondersteund door bitbuckets... dus mijn implementatie... is ondersteund door bitbuckets... ik probeer... de laatste verandering... van... de official go repository... en... op mijn normale github-account... er zijn al de implementatie... die ik heb voor mijn citatie... alle exemplen die je ziet... in deze slides... en meer grote exemplen... zijn er op de github-account... en als je het wilt proberen... je kan altijd e-mail meenemen... en dit is mijn website... oké... zover... deze presentatie... 