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

Bild på TCP/IP och OSI-modellen

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.
Name Value
Name
Sex Male
Female
Eye color
Check all that apply Över 1.80
Över 90 kg
Describe your athletic ability:

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.