Om nätverksparadigm, protokoll och web-programmering
Komponentbaserad programmering
Ett enkelt exempel på komponentbaserad programmering är de enkla
terminalprogrammen i unix. Man kan skicka utskrifter av programmen
vidare till nästa program med pipe-tecknet |
Kommunikationen är ganska rudimentär med pipes, det går bara åt ett
håll.
Exempel, lista alla filer i katalogen, filterar på "txt" och räkna antal rader.
> ls | grep txt | wc
Fördelarna med komponentbaserad programmering är att det blir separata
testbara enheter. I en modulärt programmerad C/C++ kod blir det en
binär i runtime som körs. Samma kan sägas om java/python m.m.
Web Services
Web services är ett modernare sätt att programmera komponent baserat. kommunikationen sker via SOAP-protokollet som är definierat i XML.
Om labben
Det ni ska gör i labben är att skriva färdigt en enkel klient och
server som kommunicerar med varandra. Mycket i labben är inte
definierat, det är med flit så att det blir variationer i
lösningarna. Exempelvis är det inte tydligt definierat hur banken ska
komma ihåg saldo för kunderna.
Oavsett hur programmen beter sig så ska i princip er beskrivning av
kommunikationen mellan klienten och servern vara så bra så att en
annan kurskamrat ska kunna skriva en klient/server i C och ansluta sig
till er server/klient. Tänk på att förklara avskiljningstecken. I
exempelkoden skickas allt som strängar även siffror som
t.ex. kontokortsnr. För att tvinga protokollet att bli lite spännande
så finns en (krystad) 10-bytes gräns angiven.
Exempel på protokoll
För att beskriva protokollet behövs en beskrivning av datat och
dataflödet. Det finns inga formella krav på protokollet mer än
att det ska vara begripligt för en annan kursdeltagare. Ritade figurer
brukar vara lätta att förstå.
TCP/IP
Ett framgångsrikt protokoll är TCP/IP där olika data ligger i olika
lager. Traditionellt brukar man prata om fyra olika lager,
applikationslagret, transportlagret, nätverkslagret och länklagret.
Varje del i kommunikationen skalar av sin del, kontrollerar mot en
checksumma och skickar vidare resten till nästa lager. Ett lager kan vara implementerat med en struct i C. Gränssnittet för en nätverkskabel
är genial i sin enkelhet, man stoppar in kontakten och om det lyser
grönt så fungerar det.
TCP/IP protokollet från 1981 illustreras med ASII-figurer
TCP Header Format
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
TCP Header Format
Note that one tick mark represents one bit position.
Figure 3.
Source Port: 16 bits
The source port number.
Destination Port: 16 bits
The destination port number.
[Page 15]
September 1981
Transmission Control Protocol
Functional Specification
Sequence Number: 32 bits
The sequence number of the first data octet in this segment (except
when SYN is present). If SYN is present the sequence number is the
initial sequence number (ISN) and the first data octet is ISN+1.
Acknowledgment Number: 32 bits
If the ACK control bit is set this field contains the value of the
next sequence number the sender of the segment is expecting to
receive. Once a connection is established this is always sent.
Data Offset: 4 bits
The number of 32 bit words in the TCP Header. This indicates where
the data begins. The TCP header (even one including options) is an
integral number of 32 bits long.
Reserved: 6 bits
Reserved for future use. Must be zero.
...
TCP/IP protokollet och OSI bild
Ett tillståndsdiagram
September 1981
Transmission Control Protocol
Functional Specification
+---------+ ---------\ active OPEN
| CLOSED | \ -----------
+---------+<---------\ \ create TCB
| ^ \ \ snd SYN
passive OPEN | | CLOSE \ \
------------ | | ---------- \ \
create TCB | | delete TCB \ \
V | \ \
+---------+ CLOSE | \
| LISTEN | ---------- | |
+---------+ delete TCB | |
rcv SYN | | SEND | |
----------- | | ------- | V
+---------+ snd SYN,ACK / \ snd SYN +---------+
| |<----------------- ------------------>| |
| SYN | rcv SYN | SYN |
| RCVD |<-----------------------------------------------| SENT |
| | snd ACK | |
| |------------------ -------------------| |
+---------+ rcv ACK of SYN \ / rcv SYN,ACK +---------+
| -------------- | | -----------
| x | | snd ACK
| V V
| CLOSE +---------+
| ------- | ESTAB |
| snd FIN +---------+
| CLOSE | | rcv FIN
V ------- | | -------
+---------+ snd FIN / \ snd ACK +---------+
| FIN |<----------------- ------------------>| CLOSE |
| WAIT-1 |------------------ | WAIT |
+---------+ rcv FIN \ +---------+
| rcv ACK of FIN ------- | CLOSE |
| -------------- snd ACK | ------- |
V x V snd FIN V
+---------+ +---------+ +---------+
|FINWAIT-2| | CLOSING | | LAST-ACK|
+---------+ +---------+ +---------+
| rcv ACK of FIN | rcv ACK of FIN |
| rcv FIN -------------- | Timeout=2MSL -------------- |
| ------- x V ------------ x V
\ snd ACK +---------+delete TCB +---------+
------------------------>|TIME WAIT|------------------>| CLOSED |
+---------+ +---------+
TCP Connection State Diagram
Figure 6.
Exempel på ett flöde
TCP A TCP B
1. CLOSED LISTEN
2. SYN-SENT --> --> SYN-RECEIVED
3. ESTABLISHED <-- <-- SYN-RECEIVED
4. ESTABLISHED --> --> ESTABLISHED
5. ESTABLISHED --> --> ESTABLISHED
Basic 3-Way Handshake for Connection Synchronization
Figure 7.
Internetprogrammering historik
I början användes forms i html. Resultat parsas och visas av
klienten. Layout via tabeller.
HTML forms
data matas in i formulär med <FORM>-taggen.
CGI
HTML-forms är väldigt statiskt. För att kunna programmera server-svar
t.ex. generiska html-frågor så behövs ett program på servern. Detta gjordes
genom genom att på unix-vis lägga en SHABANG #! i början på filen som angav
vilket program som skulle köra filen.
#! /usr/bin/perl
print "<h1>Welcome to web quiz";
Programmet körs på servern och skriver ut htmlkod som skickas till klienten.
CSS
Cascading style sheets istället för eller tillsammans med tabeller avgör layout.
ASP, PHP
Progp.php innehåller kod, layout och data blandat. Körs på servern
skriver ut html-kod och skickas till klienten. Alla dessa lösningar
har nackdelen att de blandar användargränsnittet med logiken. Design
pattern Model-View-Controller (MVC) finns på vissa plattformar.
CORBA, WEB Services
Klienten gör funktionsanrop och får definierat data som svar. Corba
använde sig i början av binärt protokoll IIOP. Web Services skickar
objekt med SOAP som är objekt beskrivna i XML-format.
SOA
Service Oriented Applications bygger mycket på web services. Modernt
komponentbaserad programmering. För ett par år sedan mycket prat i
industrin. Programmeraren får ett API över nätet.
Om XML och XMLSchema
En av de viktiga fördelarna med XML är att man kan beskriva hur datat
ska se ut med ett XML-schema. Givet ett XML-dokument och ett
XML-schema så kan man verifiera att datat är rätt genom att validera
med ett vanligt förekommande standardverktyg. Ett sådant verktyg finns
inbyggt i t.ex. Internet Explorer.
XSLT, SAX och DOM
Man kan lätt transformera från ett XML-Schema till ett annat. Det
finns ett funktionellt språk XSLT som skrivs i XML. De flesta språk
har numera XML-stöd. Man kan antingen ladda upp dokumentet i en
trädstruktur i minnet, ett DOM-träd eller så kan man skriva en
SAX-parser - en händelseorienterad kod som triggar på olika taggar.
RESTful, JQuery, JSon, javascript
Ett lättviktsalternativ till det pratiga XML är JSon.
myObject = {
"first": "Alexander",
"last": "Baltatzis",
"sex": "M",
"registered": true
}
RESTful (Representational state transfer) begreppet definierades
i ett kapitel i Fieldings doktorsavhandling (2000). Det har växt
fram som ett alternativ till SOA. Istället för ett API får
programmeraren en resurs via en uri/url. Denna kan man läsa/manipulera
med anrop som
GET
POST
PUT
PATCH
DELETE
Javascript är det dominerande språket i webbläsare på klientsidan. Webbläsarnas
API var dock väldigt olika vilket ledde till ganska bökig programmering. Numera
stöder alla stora webbläsare JQuery (API). Där finns också stöd för REST och
web sockets vilket möjliggör input/output liknande labben fast över http.
Parallell programmering
Parallell programmering kan ske på lite olika sätt. Man kan använda
synkrona och asynkrona anrop med trådar eller processer. Man kan
använda message passing. Många tror att funktionell programmering är
bra för parallell programmering. Vissa språk har parallellism inbyggt
i språket t.ex. Go från google som har unix-pipe liknande syntax eller
Erlang från Ericsson som blivit allt populärare senare år.