X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=tcpsock.tex;h=0ffa69f85d2cc72ea04c209ba2a6f288f611bd26;hp=485f36f0be956b66ddef6942654ddce9b42dfc35;hb=b81723c64c1d63b89cd3cec12f2fcccc4a756967;hpb=e7010c3fbd41a2de44c7b513c5de6e2c6d7ab4b4 diff --git a/tcpsock.tex b/tcpsock.tex index 485f36f..0ffa69f 100644 --- a/tcpsock.tex +++ b/tcpsock.tex @@ -1,6 +1,6 @@ %% tcpsock.tex %% -%% Copyright (C) 2000-2007 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2010 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", @@ -42,7 +42,7 @@ significato di alcuni dei vari \textsl{stati} ad essa associati. \itindbeg{three~way~handshake} Il processo che porta a creare una connessione TCP è chiamato \textit{three way handshake}; la successione tipica degli eventi (e dei -\textsl{segmenti}\footnote{Si ricordi che il segmento è l'unità elementare di +\textsl{segmenti}\footnote{si ricordi che il segmento è l'unità elementare di dati trasmessa dal protocollo TCP al livello successivo; tutti i segmenti hanno un header che contiene le informazioni che servono allo \textit{stack TCP} (così viene di solito chiamata la parte del kernel che implementa il @@ -149,7 +149,7 @@ connessione. Normalmente vengono usate le seguenti opzioni: sez.~\ref{sec:tcp_protocol_xxx}) con la quale ciascun capo della comunicazione dichiara quanto spazio disponibile ha in memoria per i dati. Questo è un numero a 16 bit dell'header, che così può indicare un massimo di - 65535 byte;\footnote{Linux usa come massimo 32767 per evitare problemi con + 65535 byte;\footnote{in Linux il massimo è 32767 per evitare problemi con alcune implementazioni che usano l'aritmetica con segno per implementare lo stack TCP.} ma alcuni tipi di connessione come quelle ad alta velocità (sopra i 45Mbit/sec) e quelle che hanno grandi ritardi nel cammino dei @@ -165,12 +165,12 @@ connessione. Normalmente vengono usate le seguenti opzioni: spostare a sinistra il valore della finestra annunciata inserito nel pacchetto). Con Linux è possibile indicare al kernel di far negoziare il fattore di scala in fase di creazione di una connessione tramite la - \textit{sysctl} \texttt{tcp\_window\_scaling} (vedi - sez.~\ref{sec:sock_ipv4_sysctl}).\footnote{per poter usare questa + \textit{sysctl} \itindex{TCP~window~scaling} \texttt{tcp\_window\_scaling} + (vedi sez.~\ref{sec:sock_ipv4_sysctl}).\footnote{per poter usare questa funzionalità è comunque necessario ampliare le dimensioni dei buffer di ricezione e spedizione, cosa che può essere fatta sia a livello di sistema - con le opportune \textit{sysctl} (vedi sez.~\ref{sec:sock_ipv4_sysctl}) che - a livello di singoli socket con le relative opzioni (vedi + con le opportune \textit{sysctl} (vedi sez.~\ref{sec:sock_ipv4_sysctl}) + che a livello di singoli socket con le relative opzioni (vedi sez.~\ref{sec:sock_tcp_udp_options}).} \item \textit{timestamp option}, è anche questa una nuova opzione necessaria @@ -187,6 +187,7 @@ vengono anche dette \textit{long fat pipe options} dato che questo che viene dato alle connessioni caratterizzate da alta velocità o da ritardi elevati. In ogni caso Linux supporta pienamente entrambe le opzioni. + \subsection{La terminazione della connessione} \label{sec:TCP_conn_term} @@ -240,9 +241,9 @@ deve ancora eseguire la chiusura passiva a quello che sta eseguendo la chiusura attiva. Nella sequenza indicata i dati verrebbero persi, dato che si è chiuso il socket dal lato che esegue la chiusura attiva; esistono tuttavia situazioni in cui si vuole poter sfruttare questa possibilità, usando una -procedura che è chiamata \textit{half-close}; torneremo su questo aspetto e su -come utilizzarlo in sez.~\ref{sec:TCP_shutdown}, quando parleremo della -funzione \func{shutdown}. +procedura che è chiamata \itindex{half-close} \textit{half-close}; torneremo +su questo aspetto e su come utilizzarlo in sez.~\ref{sec:TCP_shutdown}, quando +parleremo della funzione \func{shutdown}. La emissione del FIN avviene quando il socket viene chiuso, questo però non avviene solo per la chiamata esplicita della funzione \func{close}, ma anche @@ -480,7 +481,7 @@ l'elenco delle porte assegnate dalla IANA (la \textit{Internet Assigned Number Authority}) ma l'elenco viene costantemente aggiornato e pubblicato su internet (una versione aggiornata si può trovare all'indirizzo \href{http://www.iana.org/assignments/port-numbers} -{\texttt{http://www.iana.org/assignments/port-numbers}}); inoltre in un +{\textsf{http://www.iana.org/assignments/port-numbers}}); inoltre in un sistema unix-like un analogo elenco viene mantenuto nel file \conffile{/etc/services}, con la corrispondenza fra i vari numeri di porta ed il nome simbolico del servizio. I numeri sono divisi in tre intervalli: @@ -684,7 +685,7 @@ ci si porr \item[\errcode{ENOTSOCK}] il file descriptor non è associato ad un socket. \item[\errcode{EACCES}] si è cercato di usare una porta riservata senza sufficienti privilegi. - \item[\errcode{EADDRNOTAVAIL}] Il tipo di indirizzo specificato non è + \item[\errcode{EADDRNOTAVAIL}] il tipo di indirizzo specificato non è disponibile. \item[\errcode{EADDRINUSE}] qualche altro socket sta già usando l'indirizzo. \end{errlist} @@ -965,12 +966,12 @@ kernel, compreso Linux 2.0, che mostrano le differenze fra diverse implementazioni. In Linux il significato di questo valore è cambiato a partire dal kernel 2.2 -per prevenire l'attacco chiamato \textit{syn flood}. Questo si basa -sull'emissione da parte dell'attaccante di un grande numero di pacchetti SYN -indirizzati verso una porta, forgiati con indirizzo IP fasullo\footnote{con la - tecnica che viene detta \textit{ip spoofing}.} così che i SYN$+$ACK vanno -perduti e la coda delle connessioni incomplete viene saturata, impedendo di -fatto ulteriori connessioni. +per prevenire l'attacco chiamato \index{SYN~flood} \textit{SYN flood}. Questo +si basa sull'emissione da parte dell'attaccante di un grande numero di +pacchetti SYN indirizzati verso una porta, forgiati con indirizzo IP +fasullo\footnote{con la tecnica che viene detta \textit{ip spoofing}.} così +che i SYN$+$ACK vanno perduti e la coda delle connessioni incomplete viene +saturata, impedendo di fatto ulteriori connessioni. Per ovviare a questo il significato del \param{backlog} è stato cambiato a indicare la lunghezza della coda delle connessioni complete. La lunghezza @@ -1044,11 +1045,11 @@ funzione \item[\errcode{EAGAIN} o \errcode{EWOULDBLOCK}] il socket è stato impostato come non bloccante (vedi sez.~\ref{sec:file_noblocking}), e non ci sono connessioni in attesa di essere accettate. - \item[\errcode{EPERM}] Le regole del firewall non consentono la connessione. + \item[\errcode{EPERM}] le regole del firewall non consentono la connessione. \item[\errcode{ENOBUFS}, \errcode{ENOMEM}] questo spesso significa che l'allocazione della memoria è limitata dai limiti sui buffer dei socket, non dalla memoria di sistema. - \item[\errcode{EINTR}] La funzione è stata interrotta da un segnale. + \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale. \end{errlist} Inoltre possono essere restituiti gli errori di rete relativi al nuovo socket, diversi a secondo del protocollo, come: \errval{EMFILE}, @@ -1979,7 +1980,7 @@ in sez.~\ref{sec:file_line_io} a proposito dell'I/O su terminale), solo allora \func{fgets} ritornerà ed il client scriverà quanto immesso sul socket, per poi passare a rileggere quanto gli viene inviato all'indietro dal server, che a sua volta sarà inviato sullo standard output, che nel caso ne provoca -l'immediatamente stampa a video. +l'immediata stampa a video. \subsection{La conclusione normale} @@ -3088,9 +3089,9 @@ valori: \item[\macro{SHUT\_WR}] chiude il lato in scrittura del socket, non sarà più possibile scrivere dati su di esso. Nel caso di socket TCP la chiamata causa l'emissione di un segmento FIN, secondo la procedura chiamata - \textit{half-close}. Tutti i dati presenti nel buffer di scrittura prima - della chiamata saranno inviati, seguiti dalla sequenza di chiusura - illustrata in sez.~\ref{sec:TCP_conn_term}. + \itindex{half-close} \textit{half-close}. Tutti i dati presenti nel buffer + di scrittura prima della chiamata saranno inviati, seguiti dalla sequenza di + chiusura illustrata in sez.~\ref{sec:TCP_conn_term}. \item[\macro{SHUT\_RDWR}] chiude sia il lato in lettura che quello in scrittura del socket. È equivalente alla chiamata in sequenza con \macro{SHUT\_RD} e \macro{SHUT\_WR}.