Socket Options Opzioni del Socket Livello delle Opzioni Opzioni di ...

7 downloads 304 Views 201KB Size Report
Alcune opzioni sono binarie (on o off). ▫ Altre hanno un valore (int o anche strutture più complesse). 2. Livello delle Opzioni. ◇ Le opzioni sono divise in vari  ...
Opzioni del Socket

a.a. 2003/04

Š Ogni socket aperto ha delle proprietà che ne

Socket Options

determinano alcuni comportamenti „

Š Le proprietà configurabili sono analoghe a

Prof. Vincenzo Auletta

quelle dei file gestite con la funzione fcntl

[email protected] http://www.dia.unisa.it/professori/auletta/

„

„

1

Alcune opzioni sono binarie (on o off) Altre hanno un valore (int o anche strutture più complesse)

Livello delle Opzioni

Opzioni di Livello Socket

Š Le opzioni sono divise in vari livelli

SO_BROADCAST SO_DEBUG SO_DONTROUTE SO_ERROR SO_KEEPALIVE SO_LINGER SO_RCVBUF SO_SNDBUF SO_RCVLOWAT SO_SNDLOWAT SO_RCVTIMEO SO_SNDTIMEO SO_REUSEADDR SO_REUSEPORT SO_TYPE SO_USELOOPBACK

„ „ „ „ „

SOL_SOCKET IPPROTO_IP IPPROTO_IPV6 IPPROTO_ICMPV6 IPPROTO_TCP

livello livello livello livello livello

socket IP IP per la versione 6 messaggi di controllo TCP

Š Ogni livello ha varie opzioni Š Non è detto che tutte siano supportate 2

La funzione fcntl può essere usata anche con i socket

Š Ogni opzione ha un valore di default „

Università degli studi di Salerno Laurea in Informatica

Le opzioni del socket consentono di modificare tali proprietà

3

permette il broadcast abilita le informazioni di debug salta il lookup nella tavola di routing legge l’errore corrente controlla che la connessione sia attiva controlla la chiusura della connessione grandezza del buffer in ricezione grandezza buffer in spedizione soglia per il buffer in ricezione soglia per il buffer in spedizione timeout per la ricezione timeout per la spedizione permette riutilizzo indirizzi locali permette riutilizzo porte locali il tipo di socket per i socket di routing (copia i pacchetti)

Opzioni di Livello IP e TCP

Funzioni gestsockopt e setsockopt

IP_HDRINCL IP_OPTIONS IP_TTL IP_TOS IP_RECVIF

header incluso con i dati opzioni nell’header IP Time-To-Live type of service nell’header IP restituisce l’interfaccia su cui si è ricevuto il datagram

#include int getsockopt(int sd, int level, int optname, void* optval, socklen_t optlen); int setsockopt(int sd, int level, int optname, const void* optval, socklen_t* optlen);

TCP_KEEPALIVE TCP_MAXRT TCP_MAXSEG TCP_NODELAY TCP_STDURG

tempo per la ritrasmissione tempo massimo per la ritrasmissione MSS (Maximum Segment Size) disabilita algoritmo di Nagle interpretazione dell’urgent pointer

4

Š Restituiscono „ „

Š Permettono di controllare e modificare le opzioni del socket

5

Š Alcune opzioni possono essere solo lette

Parametri

Esempi

Š int sd

setsockopt(3,SOL_SOCKET,SO_KEEPALIVE,1,sizeof(int)); attiva l’opzione di “keepalive” per mantenere la connessione attiva

„

Descrittore del socket

Š int level „

Livello dell’opzione

getsockopt(3,SOL_SOCKET,SO_KEEPALIVE,*flag,*size); ritorna la grandezza di un intero in size e flag sarà 0 se l’opzione è disabilitata, oppure diverso da 0 se l’opzione è abilitata

Š int optname „

Nome dell’opzione

Š (const) void* optval „

Valore dell’opzione passato per riferimento

Š socklen_t optlen 6

-1 se errore 0 se OK

„

Lunghezza dell’opzione

7

SO_BROADCAST

SO_ERROR

Š Rende possibile la trasmissione broadcast Š Per default la trasmissione broadcast è inibita

Š Quando si verifica un errore, un codice di

„

„

errore viene memorizzato nella variabile so_error Š La notifica dell’errore avviene in 2 modi:

Un applicazione che intende spedire in broadcast deve abilitare questa opzione Serve a prevenire broadcast accidentali

„

Š Es. un programma che prende in input l’indirizzo di

destinazione dovrebbe controllare l’indirizzo Š Se SO_BROADCAST è disabilitata il broadcast non viene effettuato e il S.O. restituisce l’errore EACCESS

8

„

Š Il processo può recuperare il valore di so_error 9

SO_KEEPALIVE

Š Specifica il funzionamento della close per protocolli orientati alla connessione (TCP)

scambio di dati per un periodo di 2 ore „

struct linger { int l_onoff; int l_linger;

Serve a mantenere attiva la connessione Utilizzabile solo per socket TCP

};

Š 3 possibili casi „ „

„

ACK di risposta: la connessione è ancora attiva RST di risposta: la connessione era stata chiusa, viene generato l’errore ECONNRESET Non c’è risposta, vengono spediti 8 ulteriori messaggi ogni 75 secondi generato l’errore ETIMEDOUT Š Messaggi ICMP di errore sulla rete, viene generato l’errore EHOSTUNREACH

/* 0=off, nonzero=on */ /* tempo attesa in secondi */

Š l_onoff = 0 „

close ritorna ed il kernel spedirà eventuali dati residui

Š l_onoff ≠ 0, l_linger = 0 „ „

la connessione viene resettata ed i dati residui non sono spediti evita il TIME_WAIT, ma rischia la reincarnazione della connessione

Š l_onoff ≠ 0, l_linger ≠ 0

Š Nessuna riposta dopo 11 minuti e 15 secondi: viene

10

leggendo il valore dell’opzione SO_ERROR Š Può essere solo letta, non scritta

SO_LINGER

Š spedisce un messaggio di controllo se non c’è „

Se il processo è in una chiamata a select, sia per la lettura che per la scrittura, ritorna con il descrittore pronto ad essere letto Se si sta usando I/O guidato dai segnali, SIGIO viene generato

„

11

„

la close aspetta l_linger secondi per consentire la spedizione dei dati residui è importante controllare il valore di ritorno perché dopo l_linger secondi i dati vengono cancellati

SO_RCVBUF e SO_SNDBUF

SO_RCVLOWAT e SO_SNDLOWAT

Š Ogni socket ha un buffer di ricezione ed uno di

Š Sono le soglie usate dalla funzione select

spedizione Š Il buffer di ricezione è usato per mantenere i dati nel kernel prima di passarli all’applicazione „

„

„

„

Con TCP, lo spazio disponibile è quello pubblicizzato nella finestra di TCP Con UDP, eventuali pacchetti in overflow vengono cancellati

Š Per default „ „

Š Il buffer in spedizione è usato dall’applicazione

per passare i dati al kernel per spedirli Š SO_RCVBUF e SO_SNDBUF permettono di cambiare la grandezza dei buffer 12

SO_RCVLOWAT = 1 SO_SNDLOWAT = 2048 (solo per TCP) Š Per UDP la dimensione del datagram deve essere minore

della dimensione del buffer di spedizione

Š E’ possibile settare le opzioni a valori differenti 13

„

Da effettuare prima di invocare la select

SO_RCVTIMEO e SO_SNDTIMEO

SO_TYPE

Š Ci permettono di usare un timeout per la

Š Ci dà il tipo di socket

ricezione e la spedizione sul socket

„

struct timeval { long tv_sec; long tv_usec; }

„

/* secondi */ /* microsecondi */

„

socket Š Può essere solo letta, non scritta

read, readv, recv, recvfrom, recvmsg

Š Il timeout in spedizione è per le funzioni „

write, writev, send, sendto

Š Per default il timeout è 0 „

Timeout disabilitato, quindi la funzione si blocca

SOCK_STREAM SOCK_DGRAM

Š Viene usata da un processo che eredita un

Š Il timeout in ricezione è per le funzioni

14

un socket è leggibile se ci sono almeno SO_RCVLOWAT byte nel buffer di ricezione Un socket è scrivibile se ci sono almeno SO_SNDLOWAT byte liberi nel buffer di spedizione

15

SO_REUSEADDR

Opzioni di IPv4

Š Permette a più descrittori di utilizzare una porta

Š IP_HDRINCL

in comune Š Utilizzata in 2 situazioni differenti „

„

Consente di effettuare la bind() del socket di ascolto su una porta occupata

Š IP_OPTIONS „

Š Es. Permette di far ripartire il server „

„

Š Tutti i server TCP dovrebbero settare l’opzione

„

Permette di modificare le 2 ore di attesa usate da SO_KEEPALIVE

Š TCP_MAXRT „ „ „

-1, ritrasmetti per sempre 0, usa il default di sistema n > 0, ritrasmetti per n secondi prima di abbandonare la connessione

Š TCP_MAXSEG „

Permette di modificare il valore dell’MSS della connessione

Š TCP_NODELAY „

18

„

17

Š TCP_KEEPALIVE

Disabilita l’algoritmo di Nagle

Š TCP_STDURG „

Specifica l’interpretazione dell’urgent pointer (2 possibilità)

Permette di specificare il Time-To-Live (in hops) del datagram (il default è 64)

Š IP_RECVDSTADDR e IP_RECVIF

SO_REUSEADDR prima di invocare la bind()

Opzioni di TCP

Permette di inserire le opzioni dell’IP header

Š IP_TTL

Permette di avviare più istanze dello stesso server sulla stessa porta (ma con indirizzi IP differenti)

16

Se è settata per un raw socket di IP allora l’applicazione deve costruire anche l’IP header che normalmente è scritto dal kernel

Consentono di recuperare l’indirizzo IP di destinazione e l’indice dell’interfaccia di ricezione di un datagram UDP con la funzione recvmsg()