...

Opzioni - Dipartimento di Informatica

by user

on
Category: Documents
18

views

Report

Comments

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()
Fly UP