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).
Establiment de la connexió
Reordenació de paquets
Control d'errors
Control de flux:Implementació de buffers.
Qualitat de servei. QoS (Quality of Service)
Multiplexació de connexions
Servei orientat a connexió
Servei no orientat a connexió
Servei confirmat o no confirmat
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
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:
Encaixada de mans TCP (handshake)
Acabament de la connexió
Estats
En els protocols orientats a connexió, la connexió passa per diferents estats
$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
Propietats
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.
Tipologies Servei de datagrama sense confirmació.
Servei de datagrama amb confirmació. El receptor envia confirmacions a l’emissor. (correu electrònic)
Servei de petició i resposta.
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
$ 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
Hi han tantes famílies de sockets com protocols
Unix domain socket (UDS o IPC socket)
comunicació entre processos (IPC)
Components
Components d'un socket d'Internet
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); ?>
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"; ?>