IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Ports serveis i sockets

  • Socket designa un concepte abstracte pel qual dos programes (possiblement situats a ordinadors diferents) poden intercanviar qualsevol flux de dades, generalment de manera fiable i ordenada. Tot socket està definit per una adreça de socket. L'adreça de socket és una combinació de tres elements: una adreça IP, un protocol de transport i un número de port (per exemple: 84.88.125.15, TCP, 2300).
  • Servei

Nivell 4. Nivell de transport

Capa de transició que connecta les aplicacions i/o usuaris amb la xarxa

És una capa de transició entre els nivells orientats a la xarxa i els orientats a les aplicacions

Treballa en unitats de dades 4-PDU també anomenades TPDU o segments

Té funcions similars al nivell d'enllaç (salt a salt) però entre dues maquines que no estan connectades directament (extrem a extrem)

S'encarrega de preparar les dades de les aplicacions per a la xarxa i assegurar-se que arribaran correctament al nivell de transport del destinatari.

Protocols: TCP (Transport Control Protocol) i UDP (User Datagram Protocol).

Funcions del nivell de xarxa

Establiment de la connexió

  • Opcional. Només s'aplica als serveis orientats a la connexió.
  • S'estableix un camí virtual a través el qual es durà a terme la comunicació. Les dades s'envien de forma ordenada per aquest camí.

Reordenació de paquets

  • Opcional. Només s'aplica als serveis no orientats a connexió. No s'estableix cap camí i els paquets poden arribar desordenats.

Control d'errors

  • Les capçaleres (headers) del nivell 4 contenen dades redundants que permeten detectar errors en la transmissió.
  • Recuperació de caigudes de xarxa, reenviament de paquets, etc.


Control de flux:Implementació de buffers.

  • S'utilitzen memòries intermediàries (buffers o cache) que permeten controlar el flux.
  • Si un servidor està massa ocupat els paquets que arriben es guarden a una memòria o cua a l'espera que el servidor els pugui processar.

Qualitat de servei. QoS (Quality of Service)

  • Garanteix la fiabilitat i la qualitat del servei. Per exemple es pot reservar un ample de banda mínim per a una connexió concreta.

Multiplexació de connexions

  • Permet tenir més d'una connexió oberta a través d'un mateix medi físic. S'utilitzen ports i el concepte de sockets

Serveis OSI

Servei orientat a connexió

  • Abans d'intercanviar dades es necessita establir una connexió (Exemples: telèfon, accés a una pàgina web, protocol TCP)

Servei no orientat a connexió

  • Les dades s'envien directament sense establir cap connexió prèvia (enviar una carta, enviar un email, protocol UDP)

Servei confirmat o no confirmat

  • Servei confirmat: Trucada telefònica (pot ser confirmada (et despengen el telèfon) o no confirmada (no et despengen, et denegen la trucada o comunica))
  • Servei no confirmat: Per exemple al parlar per telèfon. És una comunicació full duplex i ni emissor ni receptor necessiten de confirmació per començar a parlar.

Serveis Orientats a connexió

Propietats

Requereixen el establiment inicial de una connexió i la ruptura o alliberament final de la mateixa.

Entre la connexió i l’alliberament es produeix l’intercanvi de dades d'usuari.

Els blocs de dades es reben en el destí en el mateix ordre en que s’emeten a l’origen.

Tots els paquets segueixen la mateixa ruta, aconseguida en l’establiment de la connexió

Com que la ruta es coneguda, els paquets de dades no precisen indicar l’adreça de destinació.

Exemple: Trucada telefònica

Protocols Orientats a connexió. TCP

Orientades a connexió(Connection-oriented)

Els dispositius de cada banda de la connexió (emissor i receptor) utilitzen un protocol preliminar a l'enviament de dades per establir una connexió punta a punta.

Sovint també s'anomenen serveis de xarxa fiables(reliable) per que es garanteix que les dades arribaren en l'ordre adequat.

La comunicació pot estar en diferents estats.

La comunicació es duu a terme en tres fases:

  • Fase1: Establiment de la connexió (handshake)
  • Fase2: Transmissió de dades
  • Fase3: Tancament de la connexió

Encaixada de mans TCP (handshake)

Jordiromerotcp01.png

Acabament de la connexió

Jordiromerotcp02.png

Estats de la connexió

Estats

En els protocols orientats a connexió, la connexió passa per diferents estats

Comanda netstat

$sudo netstat -nt | more
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign  Address         State      
tcp        0      0 192.168.204.115:48424    199.47.219.147:80       ESTABLISHED
tcp        1      0 192.168.204.115:37565    93.184.216.169:80       CLOSE_WAIT 
tcp        0      0 192.168.204.115:45648   173.194.70.125:5222     ESTABLISHED
tcp        1      0 192.168.204.115:37568    93.184.216.169:80       CLOSE_WAIT 
tcp        1      0 192.168.204.115:37552   93.184.216.169:80       CLOSE_WAIT 
tcp        1      0 192.168.204.115:43533   91.189.89.31:80         CLOSE_WAIT 
tcp        1      0 192.168.204.115:36524   91.189.94.25:80         CLOSE_WAIT 
tcp        1      0 192.168.204.115:37571   93.184.216.169:80       CLOSE_WAIT 
tcp        1      0 192.168.204.115:37567   93.184.216.169:80       CLOSE_WAIT
$ sudo netstat -tlpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign  Address         State       PID/Program name
tcp        0      0 0.0.0.0:22               0.0.0.0:*               LISTEN      1269/sshd       
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      961/cupsd       
tcp        0      0 0.0.0.0:17500           0.0.0.0:*               LISTEN      2539/dropbox    
tcp        0      0 0.0.0.0:445             0.0.0.0:*               LISTEN      908/smbd        
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1582/mysqld     
tcp        0      0 0.0.0.0:139             0.0.0.0:*               LISTEN      908/smbd        
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1735/apache2    
tcp6       0      0 :::22                   :::*                     LISTEN      1269/sshd       
tcp6       0      0 ::1:631                 :::*                     LISTEN      961/cupsd       
tcp6       0      0 :::445                  :::*                     LISTEN      908/smbd        
tcp6       0      0 :::139                  :::*                     LISTEN      908/smbd

Serveis sense connexió

Propietats

  • Ofereixen la capacitat de comunicació sense necessitat de realitzar una connexió amb el destinatari.
  • L’emissor envia paquets de dades al receptor confiant en que la xarxa tindrà prou intel·ligència com per a conduir les dades per rutes adequades.
  • Els paquets poden seguir rutes diferents durant la comunicació.
  • Els blocs de dades es poden rebrà desordenats.
  • Cada paquet ha de portar l’adreça de destinació i, en alguns casos, el receptor ha d’enviar un acusament de rebuda per confirmar l’èxit de la comunicació.
  • Exemple: Correu postal

Protocols no orientats a connexió. UDP

Datagrames S'envien directament paquets de l'emissor al receptor sense establir prèviament una connexió.

User Datagram Protocol (UDP) No és una connexió fiable, ja que els paquets poden arribar en qualsevol ordre, duplicats, es poden perdre...

Protocols: DNS, DHCP, VoIP, Videoconferència, jocs en xarxa.

Serveis sense connexió

Tipologies Servei de datagrama sense confirmació.

  • L’emissor no necessita confirmació per part del receptor de que els paquets de dades li arriben correctament (protocol IP)

Servei de datagrama amb confirmació. El receptor envia confirmacions a l’emissor. (correu electrònic)

Servei de petició i resposta.

  • És un servei propi de gestió interactiva basat en que a cada petició li segueix una resposta. (peticions a bases de dades).

Ports

Un port és una connexió virtual que pot ser utilitzada per les aplicacions per intercanviar dades.

Els ports més comuns són els dels protocols TCP i UDP

Notació: Decimal (22, 80) o Hexadecimal

El fitxer /etc/services manté una llista de ports i els seus serveis associats.

Cada port esta associat a un servei per la IANA

  • Els ports per defecte dels serveis es poden canviar
$ cat /etc/services | more
........
tcpmux		1/tcp				#  TCP port service multiplexer
echo		7/tcp
echo		7/udp
discard		9/tcp		sink null
discard		9/udp		sink null
systat		11/tcp		users
daytime		13/tcp
daytime		13/udp
netstat		15/tcp
qotd		17/tcp		quote
msp		18/tcp				#  message send protocol
msp		18/udp
chargen		19/tcp		ttytst  source
.......

sockets

Jordiromerosocket01.png

Sockets

  • Dispositius virtuals de comunicacions bidireccionals.

Hi han tantes famílies de sockets com protocols

  • Unix Domain Sockets
  • Internet Sockets (TCP, UDP i RAW)

Unix domain socket

Unix domain socket (UDS o IPC socket)

  • Són sockets virtuals, similars als sockets d'Internet que s'utilitzen en sistemes operatius POSIX per a la

comunicació entre processos (IPC)

  • També anomenats POSIX Local IPC Sockets.

Components

  • Tipus: Datagrama o Stream
  • Camí absolut del fitxe

Sockets d'Internet

Components d'un socket d'Internet

  • Protocol (TCP, UDP, RAW IP)
  • Adreça IP local
  • Número de port local
  • Adreça IP remota
  • Número de port remot

Jordiromerosocket02.png

Ports, serveis i sockets

Jordiromerosocket03.png

Jordiromerosocket04.png

Estat d'un socket

Jordiromerotcp03.png

Jordiromerotcp04.png

Exemple Socket

Servidor

Exemple

http://www.php.net/manual/en/sockets.examples.php

Aquest exemple mostra una resposta de servidor simple. Canvieu les variables address i port per ajustar la seva configuració i executeu-lo. Després connectar el servidor amb una ordre semblant a: telnet 192.168.1.53 10000 (on la direcció i el port han de coincidir amb el seva configuració). Qualsevol cosa que escrigui serà impresa al costat del servidor, i tornada a repetir (fet) per a vostè. Per desconnectar, introdueixi 'quit'.

#!/usr/bin/php5 -q
<?php
error_reporting(E_ALL);

/* Permitir al script esperar para conexiones. */
set_time_limit(0);

/* Activar el volcado de salida implícito, así veremos lo que estamo obteniendo
 * mientras llega. */
ob_implicit_flush();

$address = '0.0.0.0';
$port = 10000;

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
    echo "socket_create() falló: razón: " . socket_strerror(socket_last_error()) . "\n";
}

if (socket_bind($sock, $address, $port) === false) {
    echo "socket_bind() falló: razón: " . socket_strerror(socket_last_error($sock)) . "\n";
}

if (socket_listen($sock, 5) === false) {
    echo "socket_listen() falló: razón: " . socket_strerror(socket_last_error($sock)) . "\n";
}

do {
    if (($msgsock = socket_accept($sock)) === false) {
        echo "socket_accept() falló: razón: " . socket_strerror(socket_last_error($sock)) . "\n";
        break;
    }
    /* Enviar instrucciones. */
    $msg = "\nBienvenido al Servidor De Prueba de PHP. \n" .
        "Para salir, escriba 'quit'. Para cerrar el servidor escriba 'shutdown'.\n";
    socket_write($msgsock, $msg, strlen($msg));

    do {
        if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
            echo "socket_read() falló: razón: " . socket_strerror(socket_last_error($msgsock)) . "\n";
            break 2;
        }
        if (!$buf = trim($buf)) {
            continue;
        }
        if ($buf == 'quit') {
            break;
        }
        if ($buf == 'shutdown') {
            socket_close($msgsock);
            break 2;
        }
        $talkback = "PHP: Usted dijo '$buf'.\n";
        socket_write($msgsock, $talkback, strlen($talkback));
        echo "$buf\n";
    } while (true);
    socket_close($msgsock);
} while (true);

socket_close($sock);
?> -q
<?php
error_reporting(E_ALL);

/* Permitir al script esperar para conexiones. */
set_time_limit(0);

/* Activar el volcado de salida implícito, así veremos lo que estamo obteniendo
 * mientras llega. */
ob_implicit_flush();

$address = '192.168.1.53';
$port = 10000;

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
    echo "socket_create() falló: razón: " . socket_strerror(socket_last_error()) . "\n";
}

if (socket_bind($sock, $address, $port) === false) {
    echo "socket_bind() falló: razón: " . socket_strerror(socket_last_error($sock)) . "\n";
}

if (socket_listen($sock, 5) === false) {
    echo "socket_listen() falló: razón: " . socket_strerror(socket_last_error($sock)) . "\n";
}

do {
    if (($msgsock = socket_accept($sock)) === false) {
        echo "socket_accept() falló: razón: " . socket_strerror(socket_last_error($sock)) . "\n";
        break;
    }
    /* Enviar instrucciones. */
    $msg = "\nBienvenido al Servidor De Prueba de PHP. \n" .
        "Para salir, escriba 'quit'. Para cerrar el servidor escriba 'shutdown'.\n";
    socket_write($msgsock, $msg, strlen($msg));

    do {
        if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
            echo "socket_read() falló: razón: " . socket_strerror(socket_last_error($msgsock)) . "\n";
            break 2;
        }
        if (!$buf = trim($buf)) {
            continue;
        }
        if ($buf == 'quit') {
            break;
        }
        if ($buf == 'shutdown') {
            socket_close($msgsock);
            break 2;
        }
        $talkback = "PHP: Usted dijo '$buf'.\n";
        socket_write($msgsock, $talkback, strlen($talkback));
        echo "$buf\n";
    } while (true);
    socket_close($msgsock);
} while (true);

socket_close($sock);
?>

Exemple Client

Este exemple mostra un simple, únic client HTTP. Simplement es connecta a una pàgina, envia una petició HEAD, repeteix la replica, i el mostra.

<?php
error_reporting(E_ALL);

echo "<h2>TCP/IP Connection</h2>\n";

/* Obtener el puerto para el servicio WWW. */
$service_port = getservbyname('www', 'tcp');

/* Obtener la dirección IP para el host objetivo. */
$address = gethostbyname('www.twitter.com');

/* Crear un socket TCP/IP. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "socket_create() falló: razón: " . socket_strerror(socket_last_error()) . "\n";
} else {
    echo "OK.\n";
}

echo "Intentando conectar a '$address' en el puerto '$service_port'...";
$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
    echo "socket_connect() falló.\nRazón: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
    echo "OK.\n";
}

$in = "HEAD / HTTP/1.1\r\n";
$in .= "Host: www.twitter.com\r\n";
$in .= "Connection: Close\r\n\r\n";
$out = '';

echo "Enviando petición HTTP HEAD ...";
socket_write($socket, $in, strlen($in));
echo "OK.\n";

echo "Leyendo respuesta:\n\n";
while ($out = socket_read($socket, 2048)) {
    echo $out;
}

echo "Cerrando socket...";
socket_close($socket);
echo "OK.\n\n";
?>

Vegeu També

TCP