Comments
Description
Transcript
Opzioni - Dipartimento di Informatica
Opzioni del Socket I semestre 03/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 <sys/socket.h> 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()