Sarabia Vargas - Repositorio Institucional de la Universidad

Anuncio
UNIVERSIDAD VERACRUZANA
Facultad de Contaduría y Administración
“Redes Inalámbricas en Linux”
MONOGRAFÍA
Qué para obtener el Título de:
Licenciado en Sistemas
Computacionales Administrativos
Presenta:
Arturo Sarabia Vargas
Asesor:
M.C. Rubén Álvaro González Benítez
Coasesor:
M.E. Patricia Arieta Melgarejo
Cuerpo Académico:
Tecnologías de la Información y
Organizaciones Inteligentes en la Sociedad
del Conocimiento
Xalapa-Enríquez, Veracruz
Septiembre 2007
I
UNIVERSIDAD VERACRUZANA
Facultad de Contaduría y Administración
“Redes Inalámbricas en Linux”
MONOGRAFÍA
Qué para obtener el Título de:
Licenciado en Sistemas
Computacionales Administrativos
Presenta:
Arturo Sarabia Vargas
Asesor:
M.C. Rubén Álvaro González Benítez
Cuerpo Académico:
Tecnologías de la Información y
Organizaciones Inteligentes en la Sociedad
del Conocimiento
Xalapa-Enríquez, Veracruz
Septiembre 2007
II
III
AGRADECIMIENTOS
QUIERO AGRADECER PRINCIPALMENTE A MI
MADRE POR HABERME DADO LA VIDA,
BRINDARME TODO SU AMOR Y ESFUERZO PARA
QUE YO LOGRARA CONCLUIR MIS SUEÑOS, POR
BUSCAR SIEMPRE MI BIENESTAR, SALUD Y
FELICIDAD A COSTA DE SACRIFICIOS, TE
QUIERO CON TODO MI CORAZÓN MAMITA,
GRACIAS.
A MI NOVIA, POR SER MI ARNÉS EN EL
MOMENTO ADECUADO, DARME UNA INMENSA
FELICIDAD DIA TRAS DIA Y POR SER LA
PERSONA MAS NOBLE QUE CONOZCO; TE AMO
CON TODO MI CORAZÓN, GRACIAS MI AMOR.
IV
ÍNDICE
Capítulo 1 LINUX
…………………………………………………………………...
5
1.1
ETIMOLOGÍA
……………………………………………………………
6
1.2
HISTORIA
……………………………………………………………
7
1.3
DISTRIBUCIONES LINUX
1.3.1
……………………………………………
Comparativa de algunas distribuciones Linux
9
……………. 11
1.4
COMO SE INSTALAN
…………………………………………………… 17
1.5
APLICACIONES DE LOS SISTEMAS LINUX ……………………………. 18
1.6
LA ESCALA DEL DESARROLLO DE "LINUX" ……………………………. 19
1.7
EN LINUX EL MERCADO ……………………………………………………. 20
1.8
GNU/LINUX COMO SISTEMA DE PROGRAMACIÓN
1.9
LINUX EN LA ADMINISTRACIÓN PÚBLICA
…………….. 21
……………………………. 22
1.10 COMO USAR UN MÓDULO PROGRAMADO PARA LINUX ……………. 23
Capítulo 2
2.1
TCP/IP EN LINUX …………………………………………………… 33
TCP/IP
…………………………………………………………………… 34
2.1.1 Niveles en la pila TCP/IP …………………………………………… 34
V
2.1.2 Familia de protocolos de Internet …………………………………… 37
2.2
TCP/IP LINUX
…………………………………………………………… 38
2.2.1 IPv4 …………………………………………………………………… 41
2.2.2 Desperdicio de direcciones
2.3
……………………………………. 41
EL SISTEMA OPERATIVO Y LA COMUNICACIÓN …………………… 42
2.3.1 Envío TCP/IP
…………………………………………………… 43
2.3.2 Recepción TCP/IP …………………………………………………… 44
2.3.3 Sockets sobre TCP/IP en Linux: Fuentes y Estructuras de Datos. 46
2.3.4 Creación de un Socket
……………………………………………. 47
2.3.5 Ubicación de las Funciones ejecutadas para enviar un mensaje a
través de Sockets en Linux
…………………………………… 73
2.3.6 Convenientes e Inconvenientes de la comunicación con TCP/IP en
Linux …………………………………………………………………... 74
Capítulo 3
3.1
LAS WIRELESS LAN EN LINUX …………..…………..………….... 75
LAS WIRELESS LAN
…………..…………..…………..…………..……. 76
VI
3.1.1 Principios de las redes WLAN
3.2
3.1.1.1
Cómo trabajan
3.1.1.2
Configuraciones de red para radiofrecuencia …….. 78
3.1.1.3
Chipset
…………..…………..……………. 77
…………..…………..…………..………… 79
LAS WIRELESS LAN EN LINUX …………..…………..…………..………… 79
3.2.1 Chipset Prism
3.2.1.1
3.3
…………..…………..……………. 77
…………..…………..…………..………………… 79
Funcionamiento
…………..…………..…………….. 80
3.2.2 Chipset Hermes
…………..…………..…………..………………… 81
3.2.3 Chipset Atheros
…………..…………..…………..………………... 81
EJEMPLO DE LA INSTALACIÓN DE UNA TARJETA INALAMBRICA EN
LINUX
…………..…………..…………..…………..…………..………………. 82
Capítulo 4
MODIFICACIONES A UN DRIVER PARA CALIDAD DE SERVICIO.
…………..…………..…………..…………..…………..…………..…………..……… 85
4.1
STATELESS WIRELESS AD HOC NETWORKS
4.1.1 Resumen
4.1.2 Introducción
…………………… 86
…………..…………..…………..……………….. 86
…………..…………..…………..…………… 87
4.1.3 ¿Qué son las redes Ad Hoc?
…………..………………... 87
4.1.4 Retos a superar en Ad Hoc.
…………..………………… 88
4.1.5 QoS en Redes Ad Hoc.
…………..…………..……………. 89
4.1.6 Características de los enlaces con QoS para esquemas de
tiempo real …………..…………..…………..…………..…………………… 90
4.1.7 Servicios diferenciados (DiffServ)
…………..………… 91
VII
4.1.8 Modelo SWAN: Service Differentiation in Stateless Wireless Ad
Hoc Networks …………..…………..…………..…………..….. 92
4.1.9 Hardware and Software requirement
4.1.10 Metodología
…………..………… 92
…………..…………..…………..…………… 93
4.1.11 Resultados y conclusiones
…………..…………..…….. 94
VIII
ÍNDICE DE IMÁGENES
Fig. 1 Linus Torvalds, creador del kernel
…………..…………..…………... 7
Fig. 2 Sharp Zaurus, un computador de bolsillo con Linux. …………..………. 10
Fig. 3 Escritorio KDE 3.4.2 corriendo sobre Gentoo Linux (2.6.13-r9) corriendo un
cliente IRC Konversation, un cliente p2p aMule y un reproductor musical Amarok.
…………..…………..…………..…………..…………..…………..…………..……… 18
Fig. 4 Richard Stallman, creador del proyecto GNU
…………..…………..….... 20
Fig. 5 Procedimientos del núcleo que interaccionan …………..……………….. 31
Fig. 6 Procedimientos del núcleo que interaccionan …………..…………..….... 32
Fig. 7 Varios algoritmos de control de congestión seleccionables al compilar Linux
(versión 2.6.17.4)
…………..…………..…………..…………..…………………... 39
Fig. 8 Pilas de protocolos …………..…………..…………..…………..…………... 42
Fig. 9 Pila de protocolos y la forma en que interactúan al enviar paquetes ….. 43
Fig. 10 Pila de protocolos y la forma en que interactúan al recibir paquetes … 44
Fig. 11 Pila de protocolos y módulos que los componen
…………………… 45
Fig. 12 Bibliotecas que se utilizan en Linux para manejar sockets …………… 46
Fig .13 Creación de estructura de datos ………………………………………….. 47
Fig. 14 Creación de un socket
………………………………………………….. 48
Fig. 15 Creación de un socket 2 ………………………………………………….. 48
Fig. 16 Estructura de un socket ………………………………………………….. 48
Fig. 17 Estructura del protocolo de transmisión …………………………………. 49
Fig. 18 Estructura de un socket ………………………………………………….. 50
Fig. 19 Estructura compuesta por una serie de operaciones para implementar los
protocolos TCP y UDP
…………………………………………………………… 51
Fig. 20 Escritura del sistema de archivos en Linux
………………………….... 52
Fig. 21 Diagrama explicativo de la interacción entre el socket, protocolo y el
sistema de archivos
…………………………………………………………… 53
Fig. 22 Uso de la memoria del sistema …………………………………………… 54
Fig. 23 Estructura de envió
…………………………………………………… 54
Fig. 24 Almacenamiento de punteros a funciones en un vector
Fig. 25 Definición de la estructura de archivos a utilizar
…………… 55
…………………… 56
IX
Fig. 26 Asociación del socket con el fichero
Fig. 27 Estructuras creadas a partir del socket
…………………………………… 56
…………………………… 57
Fig. 28 Forma de interacción entre las estructuras creadas …………………… 55
Fig. 29 Protocolo enviado con las características del paquete
……………. 58
Fig. 30 Estructura del buffer
…………..…………..…………..………………. 59
Fig. 31 Estructura del buffer.
…………..…………..…………..………………. 60
Fig. 32 Secuencia de envío
…………..…………..…………..………………. 61
Fig. 33 Estructura del proceso de envió del mensaje …………..………………. 61
Fig. 34 Rectángulo no. 5 tcp_transmit_skb
…………………………………... 62
Fig. 35 Se procede a enviar el mensaje mediante un socket
…………… 63
Fig. 36 Estructura del envió del mensaje mediante un socket
…………… 64
Fig. 37 Continuación de la figura 36
…………..…………..…………..………. 65
Fig. 38 Estructura en donde se toma la decisión de enviar o encolar el o los
paquetes…………..…………..…………..…………..…………..…………..……… 66
Fig. 39 Diagrama del proceso de salida del paquete …………..…………..…… 67
Fig. 40 ip_queue_xmit()
…………………………………………………………... 68
Fig. 41 estructura de código en la que ip_queue_xmit() construye la cabecera IP
…………..…………..…………..…………..…………..…………..…………..……... 69
Fig. 42 La rutina dev_queue_xmit() se encarga de la transmisión del sk_buff
correspondiente a cada paquete, a través de la tarjeta de red (a través de una
llamada a su controlador …………..…………..…………..…………..………….. 70
Fig. 43 La rutina dev_queue_xmit() se encarga de la transmisión del sk_buff
correspondiente a cada paquete, a través de la tarjeta de red (a través de una
llamada a su controlador …………..…………..…………..…………..………….. 71
Fig. 44 Diagrama explicativo de la interacción
…………..………………. 72
Fig. 45 Ubicación de las funciones ejecutadas para enviar un mensaje a través de
sockets en Linux
…………..…………..…………..…………..…………..……… 73
Fig. 46 Metodología del modelo aplicado
…………..…………..…………… 94
Fig. 47 Resultados obtenidos con el modulo admission control
…………… 95
Fig. 48 Resultados obtenidos con el modulo admission control
…………… 96
Fig. 49 resultados con un tráfico mayoritariamente de tiempo real …………… 96
Fig. 50 resultados con un tráfico mayoritariamente de tiempo real …………… 97
X
ÍNDICE DE TABLAS
Tabla 1. Linux
…………..…………..…………..…………..…………..……… 9
Tabla 2. Comparación general de las distribuciones de Linux
…………… 11
Tabla 3. Comparación técnica de las distribuciones de Linux.
…………… 13
Tabla 4. Datos extras de las distribuciones de Linux.
…………..……….. 15
Tabla 5. Comandos necesarios para el manejo de módulos.
……………
23
Tabla 6. Pila de protocolos modelo OSI …………………………………………...
34
Tabla 7 Una interpretación simplificada de la pila
…………………………… 35
XI
INTRODUCCION
1
Existen distintos estándares que definen distintos tipos de redes
inalámbricas. Esta variedad produce confusión en el mercado y descoordinación
en los fabricantes. Para resolver este problema, los principales vendedores de
soluciones inalámbricas (3com, Airones, Intersil, Lucent Technologies, Nokia y
Symbol Technologies) crearon en 1999 una asociación conocida como WECA
(Wireless Ethernet Compability Aliance, Alianza de Compatibilidad Ethernet
Inalámbrica) . El objetivo de esta asociación fue crear una marca que permitiese
fomentar más fácilmente la tecnología inalámbrica y asegurase la compatibilidad
de equipos.
De esta forma en abril de 2000 WECA certifica la interoperatibilidad de equipos
según la norma IEEE 802.11b bajo la marca Wi-Fi (Wíreless Fidelity, Fidelidad
Inalámbrica). Esto quiere decir que el usuario tiene la garantía de que todos los
equipos que tenga el sello Wi-Fi pueden trabajar juntos sin problemas
independientemente del fabricante de cada uno de ellos. Se puede obtener un
listado completo de equipos que tienen la cetificación Wi-Fi en Alliance - Certified
Products.
En el año 2002 eran casi 150 miembros de la asociación WECA. Como la norma
802.11b ofrece una velocidad máxima de transferencia de 11 Mbps ya existen
estándares que permiten velocidades superiores, WECA no se ha querido quedar
atrás. Por ese motivo, WECA anunció que empezaría a certificar también los
equipos IEEE 802.11a de la banda de 5 Ghz mediante la marca Wi-Fi5.
La norma IEEE.802.11 fue diseñada para sustituir a las capas físicas y MAC de la
norma 802.3 (Ethernet). Esto quiere decir que en lo único que se diferencia una
red Wi-Fi de una red Ethernet, es en la forma como los ordenadores y terminales
en general acceden a la red; el resto es idéntico. Por tanto una red local
inalámbrica 802.11 es completamente compatible con todos los servicios de las
redes locales de cable 802.3 (Ethernet).
Las Redes Inalámbricas facilitan la operación en lugares donde la computadora no
puede permanecer en un solo lugar, como en almacenes o en oficinas que se
encuentren en varios pisos.
2
No se espera que las redes inalámbricas lleguen a remplazar a las redes
cableadas. Estas ofrecen velocidades de transmisión mayores que las logradas
con la tecnología inalámbrica. Mientras que las redes inalámbricas actuales
ofrecen velocidades de 54 Mbps, las redes cableadas ofrecen velocidades de 100
Mbps y se espera que alcancen velocidades de hasta 1000 Mbps. Los sistemas de
Cable de Fibra Optica logran velocidades aún mayores.
Sin embargo se pueden mezclar las redes cableadas y las inalámbricas, y de esta
manera generar una "Red Híbrida" y poder resolver los últimos metros hacia la
estación. Se puede considerar que el sistema cableado sea la parte principal y la
inalámbrica le proporcione movilidad adicional al equipo y el operador se pueda
desplazar con facilidad dentro de un almacén o una oficina.
Las redes inalámbricas en Linux son un problema; la culpa no es Linux, si no los
fabricantes que no se preocupan por lanzar drivers para este sistema. Los
empaques de los routers, y otros dispositivos inalámbricos, no especifican el chip
que utilizan, pequeño detalle que ayudaría a los usuarios Linux, pues así pueden
adquirir fácilmente un modelo con chip compatible con Linux.
Por lo tanto la finalidad de esta monografía es proporcionar la documentación
necesaria para instalar una tarjeta de red inalámbrica en Linux, que se pueda
utilizar para su análisis, posibles mejoras mediante la implementación de código
propio y poder hacer una comparación con la propuesta de calidad de servicio
proporcionada por SWAN (Stateless Wireless Ad hoc Networks) el cual es un
proyecto encaminado a las redes inalámbricas móviles proporcionando servicios
con calidad (QoS) en redes Ad Hoc o punto a punto.
Los sistemas inalámbricos se han convertido en el segmento de mayor y más
rápido crecimiento en las telecomunicaciones, donde su principal consecuencia
han sido dotar de movilidad a los nodos de la red al liberarlos de sus conexiones
físicas, además también están empezando a ofrecer múltiples servicios con
calidad (QoS) como una conversación telefónica, la transferencia de ficheros,
acceso a la web o la realización de videoconferencia, sin restricciones de lugar y
de tiempo. Estos ejemplos de comunicación inalámbrica espontánea entre
dispositivos se denomina redes Ad Hoc, permitiendo a los dispositivos establecer
3
la comunicación, en cualquier momento y en cualquier lugar. En realidad, la
formación de redes Ad Hoc como tal no es nueva, sino lo es nuevo es la forma de
configuración y uso de sus elementos. Una aproximación para otorgar calidad de
servicio es la de diferenciar entre el conjunto de paquetes que circulan por la red
clasificando los paquetes en un número pequeño de tipos de servicios y utiliza
mecanismos de prioridad para proporcionar una calidad de servicio adecuada al
tráfico. Este estudio preliminar se realizo aplicando servicios diferenciados con el
modelo SWAN en el entorno del simulador ns2. SWAN es un modelo de red “sin
estados”, el cual usa algoritmos de control distribuidos para entregar servicios
diferenciados en MANET de una manera escalable y robusta. Estos algoritmos
aplican controles basados en retroalimentaciones para soportar servicios de
tiempo real “soft” y servicios diferenciados en redes inalámbricas Ad Hoc. El
modelo usa el rate control (rc) para trafico UDP y TCP best effort, y un admission
control (ac) para trafico UDP de tiempo real. SWAN aplica la notificación explicita
de congestionamiento (ECN) para regular dinámicamente trafico de tiempo real
admitido. El novedoso aspecto de este modelo es que no requiere de QoS en la
capa MAC.
4
CAPITULO I
LINUX
5
1.1 Etimología
Linux se refiere estrictamente al núcleo Linux, pero es comúnmente
utilizado para describir al sistema operativo tipo Unix (que implementa el estándar
POSIX), que utiliza primordialmente filosofía y metodologías libres (también
conocido como GNU/Linux) y que está formado mediante la combinación del
núcleo Linux con las bibliotecas y herramientas del proyecto GNU y de muchos
otros proyectos/grupos de software (libre o no libre). El software que suelen incluir
consta de una enorme variedad de aplicaciones, como: entornos gráficos, suites
ofimáticas, servidores web, servidores de correo, servidores FTP, etcétera.
Coloquialmente se aplica el término "Linux" a éstas. Algunas personas opinan que
es incorrecto denominarlas distribuciones Linux, y proponen llamarlas sistema
GNU/Linux. Otras personas opinan que los programas incluidos proceden de
fuentes tan variadas que proponen simplificarlo denominándolo simplemente a
"Linux".
Linux (pronunciación IPA: /lɪnʊks/) es la denominación de un sistema operativo
tipo-Unix y el nombre de un núcleo. Es uno de los paradigmas más prominentes
del software libre y del desarrollo del código abierto, cuyo código fuente está
disponible públicamente y cualquier persona puede libremente usarlo, estudiarlo,
redistribuirlo y, con los conocimientos informáticos adecuados, modificarlo.
Los primeros sistemas Linux se originaron en 1992, al combinar utilidades de
sistema y bibliotecas del proyecto GNU con el núcleo Linux, completando un
sistema también conocido como GNU/Linux. Desde fines de 1990 Linux ha
obtenido el apoyo de diversas empresas multinacionales del mundo de la
informática, tales como IBM, Sun Microsystems, Hewlett-Packard y Novell.
Linux es usado como sistema operativo en una amplia variedad de plataformas de
hardware y computadores, incluyendo los computadores de escritorio (PCs x86 y
x86-64, y Macintosh y PowerPC), servidores, supercomputadores, mainframes, y
dispositivos empotrados así como teléfonos celulares.
La marca Linux (Número de serie: 1916230) pertenece a Linus Torvalds y se
define como "un sistema operativo para computadoras que facilita su uso y
6
operación". Existen grupos de usuarios del sistema Linux en casi todas las áreas
del planeta
La pronunciación correcta (para cualquier idioma) es muy cercana a como se
pronuncia en español: /lí.nux/ o /lnəks/ (Alfabeto Fonético Internacional).
1.2 Historia
Fig. 1 Linus Torvalds, creador del kernel
La historia de Linux está fuertemente vinculada a la del proyecto GNU. El
proyecto GNU, iniciado en 1983, tiene como objetivo el desarrollo de un sistema
Unix completo compuesto enteramente de software libre. Hacia 1991, cuando la
primera versión del núcleo Linux fue liberada, el proyecto GNU había producido
varios de los componentes del sistema operativo, incluyendo un intérprete de
comandos, una biblioteca C y un compilador, pero aún no contaba con el núcleo
que permitiera completar el sistema operativo.
El núcleo creado por Linus Torvalds, quien se encontraba entonces estudiando en
la Universidad de Helsinki, llenó el hueco final que el sistema operativo GNU
exigía. Subsecuentemente, miles de programadores voluntarios alrededor del
mundo han participado en el proyecto, mejorándolo continuamente. Torvalds y
otros desarrolladores de los primeros días de Linux adaptaron los componentes de
7
GNU y de BSD, así como de otros muchos proyectos como Perl, Apache, Python,
etc. para trabajar con el núcleo Linux, creando un sistema operativo
completamente funcional procedente de muchísimas fuentes diferentes, la
mayoría libres.
8
1.3 Distribuciones Linux
Tabla 1 Linux
El logotipo oficial del núcleo Linux es el pingüino Tux
Desarrollador
Varios
Familia de S.O.
Unix-like
Modelo de desarrollo
Open source
Núcleo
Linux
Tipo de núcleo
Monolítico
Licencia
GPL/LGPL/BSD/Otras
Estado actual
En desarrollo
9
Fig. 2 Sharp Zaurus, un computador de bolsillo con Linux.
Una distribución es un conjunto de aplicaciones reunidas por un grupo, empresa o
persona para permitir instalar fácilmente un sistema Linux. Es un sabor de Linux.
En general se destacan por las herramientas para configuración y sistemas de
paquetes de software a instalar.
Existen numerosas distribuciones Linux (también conocidas como "distros"),
ensambladas por individuos, empresas y otros organismos. Cada distribución
puede incluir cualquier número de software adicional, incluyendo software que
facilite la instalación del sistema. La base del software incluido con cada
distribución incluye el núcleo Linux y las herramientas GNU, al que suelen
adicionarse también varios paquetes de software.
Las herramientas que suelen incluirse en la distribución de este sistema operativo
se obtienen de diversas fuentes, incluyendo de manera importante proyectos de
código abierto o libre, como el GNU y el BSD o el KDE. Debido a que las
herramientas de software libre que en primera instancia volvieron funcional al
núcleo de Linux provienen del proyecto GNU que desde 1983 había liberado
software que pudo ser usado en el proyecto de Linux de 1991, Richard Stallman
(fundador del proyecto GNU) pide a los usuarios que se refieran a dicho sistema
como GNU/Linux. A pesar de esto, la mayoría de los usuarios continúan llamando
al sistema simplemente "Linux" y las razones expuestas por Richard Stallman son
10
eterno motivo de controversia. La mayoría de los sistemas "Linux" incluyen
también herramientas procedentes de BSD y de muchos otros proyectos como
Mozilla, Perl, Ruby, Python, PostgreSQL, MySQL, Xorg, casi todas con licencia
GPL o compatibles con ésta (LGPL, MPL) otro aporte fundamental del proyecto
GNU.
Usualmente se utiliza la plataforma XFree86 o la X.Org para sostener interfaces
gráficas.
1.3.1 Comparativa de algunas distribuciones Linux
Existen numerosas distribuciones Linux. Cada una de ellas puede incluir
cualquier cantidad de software adicional (libre o no), como algunos que facilitan
la instalación del sistema y una enorme variedad de aplicaciones, entre ellos,
entornos gráficos, suites ofimáticas, servidores web, servidores de correo,
servidores FTP, etcétera.
La base de cada distribución incluye el núcleo Linux, con las bibliotecas y
herramientas del proyecto GNU y de muchos otros proyectos/grupos de
software, como BSD.
Tabla 2 Comparación general de las distribuciones de Linux.
Fecha de
Empresa
la
primera
Última
Predecesor
GNU/Linux
Fedora
Core
Precio (€)
Licencia
Público
País
estable
P.R.
Debian
versión
Proyecto
agosto de
Debian
1993
Proyecto
noviembre
Fedora Linux,
Fedora
de 2003
Red Hat Linux
N/A
4.0
(Etch)
Gratis
cualquier
DFSG
Ver. 7 /
Junio
2007
Desktop,
Workstation,
Server
Workstation,
Gratis
GPL
Server,
Mun
dial
EEU
U
Público
11
Gentoo
Mandriva
Linux
Fundación
marzo de
Gentoo
2002
Mandriva
julio de
1998
Enoch
Mandrake
Linux/Conectiva
y Lycoris Xls
rxart, rxart
de 2001
Linux
Pixart
Slackware
Patrick
julio de
Volkerding
1993
2006.1
Gratis
GPL
Server,
Gratis
2007.1
(edición
Spring
para
Desktop,
GPL
3.0
€16
Workstation,
Server
descargar)
GPL
11.0
Gratis
GPL
Mun
dial
Workstation,
Arge
Server
ntina
Workstation,
SLS
Mun
dial
Público
octubre
Rxart
Linux
Workstation,
Server,
EEU
U
Público
Descarga
gratuita
SUSE
Novell,
marzo de
Linux
OpenSUSE
1994
Jurix
10.3
disponible
Ed.
Workstation,
GPL
Profesional:
Server,
Mun
Desktop,
dial
Público
51,95
Ubuntu
Canonical
octubre
Ltd.
de 2004
7.04
Debian
(Feisty
Fawn)
Gratis
LiveCD
Desktop,
GPL
Workstation,
Server
Tabla 2. Comparación general de las distribuciones de Linux (continuación).
12
Mun
dial
Tabla 3. Comparación técnica de las distribuciones de Linux.
API
Sistem
Kernel
a de
fichero
s
Sistemas
de
ficheros
compatib
principal
Herramie
Arquitect
ura
les
nta de
Administra
actualizac
dor de
ión de
Paquetes
paquetes
y
lenguaje
para
Aplicacio
nes
Gráficas
API
principal
y
lenguaje
para
Aplicacio
nes CLI
x86, x8664, IA64,
Debian
GNU/Lin
ux
Linux
2.6.18
ext3
ext2, JFS,
PowerPC,
XFS,
SPARC,
FAT,
SPARC64
dpkg,
NTFS,
, Alpha,
Synaptic,
ISO 9660,
MIPS,
UDF,
ARM, PA-
NFS,
RISC,
ReiserFS
Mac/VME
APT
Adept, APT
pre-LSB
con C,
Varias
otros
(estándar
y Aptitude
POSIX)
68k,
S/390
ext2,
Linux
Fedora
Core
ReiserFS,
2.6.18
Fed.C
ext3
ore
FAT, ISO
9660,
UDF,
Verid 9
pre-LSB
x86, x86-
up2date,
64, i386,
yum, APT
PowerPC
(limitado)
con C,
RPM, yum
Varias
(estándar
POSIX)
NFS
ext2,
ReiserFS,
Rxart
Linux
2.6.34
ext3
FAT, ISO
9660,
UDF,
pre-LSB
x86, x86-
up2date,
64, i386,
net, APT
PowerPC
(limitado)
con C,
DEB, ASK
Varias
Linux
a Linux
2.6.17
ext3
otros
(estándar
POSIX)
NFS
Mandriv
otros
ext2, JFS,
x86
XFS,
(i586),
urpmi
RpmDrake
Varias
pre-LSB
con C,
13
FAT,
x86-64,
otros
NTFS,
PPC
(estándar
ISO 9660,
POSIX)
UDF,
NFS,
ReiserFS
JFS,
Linux
Reiser
Slackwa
2.4.33
FS,
re Linux
/
ext3/ex
2.6.18
t2
XFS,
FAT,
NTFS,
ISO 9660,
pre-LSB
Swaret,
x86, IA64,
Slapt-get,
installpkg y
S/390
otros no
upgradepkg
con C,
Varias
(estándar
oficiales
UDF,
otros
POSIX)
NFS
ext2,
ext3, JFS,
XFS,
openSU
SE
Linux
2.6.18.
ext3
8
YaST2
pre-LSB
con C,
FAT,
x86, IA64,
(Misma
NTFS,
x86-64,
Versión de
ISO 9660,
PowerPC
YaST
(estándar
Avanzada)
POSIX)
UDF,
RPM, YaST
Varias
otros
NFS,
Reiser4
JFS,
Ubuntu
Linux
2.6.20
XFS,
ext3
NTFS,
ISO 9660,
ReiserFS
pre-LSB
dpkg,
x86, x8664
APT
Synaptic,
APT y
Aptitude
con C,
Varias
otros
(estándar
POSIX)
Tabla 3. Comparación técnica de las distribuciones de Linux (continuación).
14
Tabla 4. Datos extras de las distribuciones de Linux.
Paquetes
Debian
GNU/Linux
18000
Instalación
Administrador de
Navegador
gráfica
archivos
web
Sí (a partir de la
4.0 "Etch")
Nautilus, Konqueror
Iceweasel,
Konqueror
Entorno
Gestor de
Tema
gráfico
ventanas
visual de
principal
principal
escritorio
GNOME
Metacity,
KWin
a elegir
Suite ofimática
OpenOffice.org,
KOffice, GNOME Office
ClearLook
Fedora
Core
Mozilla
5000
Sí
Nautilus, Konqueror
Firefox,
Epiphany
GNOME,
Metacity,
KDE
Kwin
s
(GNOME)
Bluecurve
OpenOffice.org,
KOffice, GNOME Office
(KDE)
Mandriva
Linux
Rxart
Linux
Slackware
Linux
Konqueror,
4000
Sí
Konqueror
Mozilla
KDE
KWin
la Ora
OpenOffice.org
KDE
KWin
Rxart
OpenOffice.org
varios
a elegir
a elegir
KOffice
Firefox
Konqueror,
2000
Sí
Konqueror
Mozilla
Firefox
muchos
No
Konqueror
Mozilla
Firefox,
Seamonkey
Mozilla
Firefox,
SUSE
Linux
Konqueror
12500
Sí
Nautilus
(en KDE),
Epiphany
Gnome,
KDE
Metacity
ClearLook
OpenOffice.org,
s
KOffice, GNOME Office
(en
GNOME)
Ubuntu
menos de
18000
Sí
Nautilus
Tabla 4. Datos extras de las distribuciones de Linux (continuación).
Mozilla
Firefox
GNOME
Metacity
Human
OpenOffice.org,
GNOME Office
1.4 Cómo se instala Linux
Linux en la actualidad es un sistema operativo fácil de instalar, tan solo
basta con descargar la imagen iso de una distribución como Debian, SuSE,
Ubuntu o Yellow Dog (la mayoría son gratuitas) y grabarla en un CD o DVD.
Existen versiones linux para máquinas x86 (abarca desde computadoras 386,
pentium I, celeron, hasta pentium IV), también para 64 bits (los nuevos
procesadores, aunque también trabajan con linux para x86), y para procesadores
PowerPc (ppc) de las computadoras Apple Macintosh.
El resto es tan fácil como instalar Windows, incluso algunas distribuciones
permiten entrar al escritorio linux sin necesidad de instalar el sistema operativo
(desde el CD), para luego usarlo o instalarlo desde el escritorio. Este es el caso de
Ubuntu y Kubuntu y las versiones más actualizadas, insertas el cd/dvd dentro de la
computadora, reinicias y en uno o dos minutos estás en el escritorio del sistema
operativo Linux. Estas versiones son también llamadas Live, del inglés "en vivo".
Actualmente Linux es un sistema fácil de usar. Cada distribución trae programas
seleccionados por los autores de la distribución incluidos en el cd o en el dvd, y se
pueden instalar tanto al comienzo de la instalación como luego de haber instalado
el sistema. Se puede instalar en computadoras que se consideren "obsoletas",
pero esto puede resultarle complicado a un usuario novato.
17
1.5 Aplicaciones de los sistemas Linux
Fig. 3 Escritorio KDE 3.4.2 corriendo sobre Gentoo Linux (2.6.13-r9) corriendo un cliente IRC
Konversation, un cliente p2p aMule y un reproductor musical Amarok.
Con la adopción por numerosas empresas fabricantes de PCs, muchas
computadoras son vendidas con distribuciones GNU/Linux pre-instaladas, y
"GNU/Linux" ha comenzado a tomar su lugar en el vasto mercado de las
computadoras de escritorio.
Con entornos de escritorio, "GNU/Linux" ofrece una interfaz gráfica alternativa a la
tradicional interfaz de línea de comandos de Unix. Existen en la actualidad
18
numerosas aplicaciones gráficas, ya sean libres o no, que ofrecen funcionalidad
que está permitiendo que GNU/Linux se adapte como herramienta de escritorio.
Algunas distribuciones permiten el arranque de Linux directamente desde un disco
compacto (llamados LiveCDs) sin modificar en absoluto el disco duro de la
computadora en la que se ejecuta Linux. Para este tipo de distribuciones, en
general, los archivos de imagen (archivos ISO) están disponibles en Internet para
su descarga.
Otras posibilidades incluyen iniciar el arranque desde una red (ideal para sistemas
con requerimientos mínimos) o desde un disco flexible o disquete o de unidades
de almacenamiento USB.
1.6 La escala del desarrollo de "Linux"
Un estudio sobre la distribución Red Hat 7.1 reveló que ésta en particular
posee más de 30 millones de líneas de código real. Utilizando el modelo de
cálculo de costos COCOMO, puede estimarse que esta distribución requeriría
8.000 programadores por año para su desarrollo. De haber sido desarrollado por
medios convencionales de código cerrado, hubiera costado más de mil millones de
dólares en los Estados Unidos.
La mayor parte de su código (71%) pertenecía al lenguaje C, pero fueron
utilizados muchos otros lenguajes para su desarrollo, incluyendo C++, Bash, Lisp,
Ensamblador, Perl, Fortran y Python.
Alrededor de la mitad de su código total (contado en líneas de código) fue liberado
bajo la licencia GPL en su versión 2.
El núcleo Linux contenía entonces 2,4 millones de líneas de código,
correspondiente al 8% del total, demostrando que la vasta mayoría del sistema
operativo no pertenece al núcleo del mismo.
En un estudio posterior, Counting potatoes: the size of Debian 2.2, el mismo
análisis fue hecho para Debian GNU/Linux versión 2.2. Esta distribución contiene
más de 55 millones de líneas de código fuente, y habría costado 1.900 millones de
19
dólares (año 2000) el desarrollo por medios convencionales (no libres); y el núcleo
Linux continua siendo de unas 2,5 millones de líneas.
1.7 En Linux el mercado
Fig. 4 Richard Stallman, creador del proyecto GNU
La creciente popularidad de Linux se debe a las ventajas que presenta ante
otros tipos de software. Entre otras razones se debe a su estabilidad, al acceso a
las fuentes (lo que permite personalizar el funcionamiento y auditar la seguridad y
privacidad de los datos tratados), a la independencia de proveedor, a la seguridad,
a la rapidez con que incorpora los nuevos adelantos tecnológicos (IPv6,
microprocesadores de 64 bits), a la escalabilidad (se pueden crear clusters de
cientos de computadoras), a la activa comunidad de desarrollo que hay a su
alrededor, a su interoperatibilidad y a la abundancia de documentación relativa a
los procedimientos.
Hay varias empresas que comercializan soluciones basadas en Linux: IBM, Novell,
Red Hat, Rxart, Cannonical (Ubuntu), Rxart, así como miles de PYMES que
ofrecen productos o servicios basados en esta tecnología.
Dentro del segmento de supercomputadoras, la 5ª más grande de Europa,
denominada MareNostrum, fue desarrollada por IBM y está basada en un cluster
20
Linux ([1]). Ella se encuentra alojada en Barcelona y es gestionada por la
"Universitat Politécnica de Catalunya" (UPC). A fines de 2006, de acuerdo al
TOP500.org, encargado de monitorear las 500 principales supercomputadoras del
mundo: 371 usaban una distribución basada en GNU/Linux, 81 Unix, 32 SLES
(una variante de Unix), 13 Únicos con Linux y 3 Mac. Ninguna usaba Windows.
Linux, además de tener una amplia cuota en el mercado de servidores de internet,
debido entre otras cosas a la gran cantidad de soluciones que tiene para este
segmento, tiene un creciente campo en computadoras de escritorio y portátiles.
Prueba de ello es que es el sistema base que se ha elegido para el proyecto
OLTPC, que tiene como objetivo llevar una LapTop a cada niño de países como
China, Brasil, Argentina y Uruguay y está patrocinado por la iniciativa del MIT y
firmas como AMD, Google y Sun Microsystems.
1.8 GNU/Linux como sistema de programación
La colección de utilidades para la programación de GNU es con diferencia
la familia de compiladores más utilizada en Linux. Tiene capacidad para compilar
C, C++, Java, Ada, entre otros muchos lenguajes. Además soporta diversas
arquitecturas mediante la compilación cruzada, lo que hace que sea un entorno
adecuado para desarrollos heterogéneos.
Hay varios IDEs disponibles para Linux incluyendo, Anjuta, KDevelop, NetBeans
IDE y Eclipse. Además existen editores extensibles como pueda ser Emacs que
hoy en día siguen siendo ampliamente utilizados. GNU/Linux también dispone de
capacidades para lenguajes de guión (script), aparte de los clásicos lenguajes de
programación de shell, la mayoría de las distribuciones tienen instalado Python,
Perl, PHP y Ruby.
21
1.9 Linux en la Administración Pública
Hay una serie de administraciones públicas que han mostrado su apoyo al
software libre, sea migrando total o parcialmente sus servidores y sistemas de
escritorio, sea subvencionándolo. Como ejemplos se tiene a:
Alemania pagando por el desarrollo del Kroupware. Además ciudades como
Múnich, que migró sus sistemas a SuSE Linux, una distribución alemana
especialmente orientada a KDE.
Cuba donde el gobierno ha establecido una indicación oficial para introducir de
manera progresiva el software libre y en particular GNU/Linux y en el que la red de
Salud Pública, Infomed, fue pionera en su uso.
China, con su acuerdo con Sun Microsystems para distribuir millones de Java
Desktop (una distribución de GNU/Linux basada en GNOME y especialmente bien
integrada con java)
Brasil, con una actitud generalmente positiva, y, por ejemplo, con el desarrollo de
los telecentros
En España, algunos gobiernos autonómicos están desarrollando sus propias
distribuciones no sólo para uso administrativo sino también académico. Así
tenemos LinEx en Extremadura, Augustux en Aragón, GuadaLinex en Andalucía,
LliureX en La Comunidad Valenciana, Molinux en Castilla-La Mancha, MAX en La
Comunidad de Madrid, Linkat en Cataluña y Trisquel en la Comunidad de Galicia,
por el momento. Todas estas distribuciones tienen en común el hecho de estar
basadas en Debian, o alguno de sus derivados, como Ubuntu.
Venezuela donde por decreto, se estableció el uso preferencial del software libre y
GNU/Linux en toda la administración pública, incluyendo ministerios y oficinas
gubernamentales y se está fomentando la investigación y el desarrollo de software
libre.
Chile, donde el Ministerio de Educación y la Universidad de la Frontera (ubicada
en Temuco) crearon EduLinux, una distribución que hoy está en más de 1500
escuelas chilenas y funcionando en más de un 90% de las bibliotecas chilenas.
Actualmente las Fuerzas Armadas chilenas están planificando la creación de una
22
distribución militar que interconecte a las ramas de la defensa chilena. El gobierno
de ese país aprobó el uso del software libre en la administración pública, anulando
así un contrato previo con Microsoft para el mantenimiento de las redes y de los
equipos en escuelas y bibliotecas chilenas.
República Dominicana, promociona el uso y proliferación del Software libre en el
campo educativo y científico. Dispone de dos fundaciones, una en la capital de
Santo Domingo y la otra en la ciudad de Santiago. Codigolibre.org
México el Gobierno del Distrito Federal dentro de sus políticas y lineamientos en
materia de Informática da preferencia al uso del Software Libre. La Delegación
Tlalpan crea la distribución Gobierno GDF/Linux.
1.10 Como usar un módulo programado para Linux
Después de haber leído la reseña completa sobre Linux, Supongamos que
ya he programado mi driver, ahora ¿cómo lo uso?
Para empezar diremos que sólo el superusuario puede insertar y quitar módulos
del kernel, las razones para esto son evidentes, se podria hacer un driver que se
dedicase a borrar todos los ficheros del disco duro, como este código se ejecuta
en el kernel, podemos saltarnos todas las comprobaciones de permisos de
escritura y borrar todo lo que queramos, aunque esté protegido contra escritura.
En la tabla 5 aparecen los nombres de los comandos necesarios para el manejo
de módulos (que sólo puede ejecutar root).
Tabla 5. Comandos necesarios para el manejo de módulos.
Insmod mi_modulo Inserta el módulo mi_modulo en el kernel
rmmod mi_modulo Saca del kernel el módulo mi_modulo
modinfo
Muestra información sobre el módulo.
modprobe
Automatiza/facilita la gestión de módulos.
23
depmod
Determina las dependencias entre módulos.
Muestra los módulos que están actualmente insertados en
Lsmod
el kernel, junto con algunos datos adicionales sobre el
estado de los mismos.
24
CARGAR MÓDULOS
1.
Compilar el núcleo con los parámetros de configuración que permiten trabajar
con módulos.
*
* Loadable module support
*
Enable loadable module support (CONFIG_MODULES) [Y/n/?] Y
2.
Diseñar e implementar un manejador como módulo cargable.
2.1 Definir número mayor y menor para el dispositivo:
#define manejador_MAYOR nn
#define manejador_MINOR xx
2.2 Definir operaciones de entrada salida para el dispositivo:
static int manejador_fs_read (struct inode *inode, struct file *file,
char *buf, int nbytes );
2.3 Definir la estructura: file_operations
static struct file_operations manejador_fops =
{
NULL,
manejador_fs_read,
NULL,
NULL,
NULL,
NULL,
25
NULL,
NULL,
NULL,
NULL
};
2.4 Diseñar la función de inicialización del modulo y descarga:
int manejador_init (void)
{
.....
}
#ifdef MODULE
/* función de inicio del modulo */
int init_module (void)
{
return manejador_init ();
}
/* Función de descarga del módulo */
void cleanup_module (void)
{
unregister_chardev (mayor device, “manejador”);
printk (“manejador modulo no se puede descargar \n”);
}
#endif
2.5 Diseñar la función de lectura del manejador:
static int manejador_fs_read (struct inode *inode, struct file *file, char *buf, int
26
nbytes)
{
...
}
3.
Compilar el modulo con las directivas: D__KERNEL__ y DMODULE
4.
Crear el archivo especial para este manejador:
#mknod /dev/manejador
5.
c mayor_device menor_device
Insertarlo en el núcleo:
#insmod manejador
6.
Ver lista de módulos cargados:
#lsmod
7.
Utilizarlo:
#modprobe
8.
Quitarlo del núcleo:
#rmmod manejador
MÓDULOS DEL NÚCLEO
Hay componentes del núcleo que siempre tienen que estar en memoria como el
planificador de la CPU.
Sin embargo otros componentes solo tienen que estar en memoria cuando se
necesitan, como el manejador de un CDWriter; un sistema de ficheros Minix, NFS;
27
un manejador de protocolo PPP.
Estas partes del núcleo que pueden cargarse o descargarse dinámicamente en
memoria, mientras el núcleo se esta ejecutando se llaman MÓDULOS.
Ventajas de los módulos:
1. La incorporación de nuevos manejadores al núcleo es mas fácil, se pueden
compilar, cargar, probar, o quitar como módulos antes de integrarlos en le
núcleo.
2. Si el manejador está integrado en el núcleo, cada vez que hagamos
modificaciones en el manejador hay que recompilar todo el núcleo y
reiniciar.
3. El núcleo no ocupa tanta memoria principal, quedando libre para las
aplicaciones.
Desventajas:
1. Cada vez que se requiere o ya no se necesita un módulo hay que pagar el
coste de leer o escribir en disco.
2. El código del núcleo se incrementa con el sistema de manejo de módulos.
La opción que activa que el núcleo maneje los módulos es:
Enable loadable module suport (CONFIG_MODULES) [Y/n/?]
Si se desea instalar un componente como módulo, hay que declararlo en la
configuración del núcleo, ejemplo instalar el sistema de ficheros MSDOS.
28
DOS FAT fs support (CONFIG_FAT_FS) [M/n/y/?] M
MSDOS fs support (CONFIG_MSDOS_FS) [M/n/y/?] M
VFAT (Windows-98) fs support (CONFIG_VFAT_FS) [m/n/y/?] M
Una vez compilado el núcleo se compilan los módulos, la secuencia puede ser:
make config
make dep
make clean
make zImage
make modules
make modules_install
Finalizado este proceso, los módulos se encuentran el /lib/modules.
Los módulos se compilan como cualquier programa pero son enlazados como
imágenes recargables, esto es no están asociadas a ninguna dirección.
Podemos ver los símbolos exportados por el núcleo en /proc/ksyms o utilizando el
comando ksyms.
Cada módulo debe contener unos procedimientos que los manejan, incluyendo
uno de inicialización cuando se carga el módulo y otro de borrado cuando se quita
del núcleo.
Los comandos del súper usuario para manejar manualmente los módulos son:
•
insmod – instalar un módulo
•
lsmod – lee el contenido de /proc/modules y muestra los módulos cargados
en memoria, (nombre, número de páginas del módulo y procesos que los
utilizan).
29
ejemplo de listado al ejecutar lsmod
Module:
•
#pages:
Used by:
msdos
2
1 (autoclean)
vfat
4
1 (autoclean)
fat
6
[vfat msdos] 2 (autoclean)
rmmod – quitar un módulo
Carga automática de módulos por demanda del núcleo
Cuando se monta un sistema de ficheros que no está integrado en el núcleo, el
núcleo solicita al programa kerneld que cargue los módulos necesarios para este
sistema de ficheros montado.
La carga dinámica y automática de módulos precisa que se compile el núcleo con
la opción CONFIG_KERNELD y los IPC System V.
Se precisa al arrancar el sistema lanzar el programa demonio kerneld, que lee las
peticiones del núcleo y realiza la carga o descarga de los módulos necesarios. Se
ejecuta como un proceso de usuario y establece un canal de comunicación
basado en mensajes (IPC) con el núcleo, por el cual el núcleo solicita mediante
mensajes un modulo al programa modprobe. Se utilizan los programas depmod y
modprobe.
DEPMOD, genera un archivo de dependencias de los símbolos encontrados en los
módulos.
MODPROBE, es el programa para manejo de módulos, requiere privilegios de
root.
30
Los procedimientos del núcleo que interaccionan con modprobe y la estructura de
datos principal, (se encuentran en include/linux/module.h y kernel/module.c) son:
•
request_module
Es la función llamada por el núcleo cuando este percibe, por la solicitud de
un proceso, la necesidad de cargar un módulo.
•
exec_modprobe
Es el programa que añade el módulo solicitado al núcleo, es llamado por
kerneld.
•
struct module
module
module_list
module
next
next
ref
ref
symtab
symtab
name
name
size
size
symbol_table
symbol_table
size
size
n_symbols
n_symbols
n_refs
n_refs
Fig. 5 Procedimientos del núcleo que interaccionan
31
módulo
Núcleo
Núcleo
request_module (módulo)
kerneld
disco
modprobe (módulo)
módulo
Fig. 6 Procedimientos del núcleo que interaccionan
Los ficheros que tratan con los módulos son:
incluye/linux/module.h
kernel/module.c
contienen la estructura struc module
y las llamadas al sistema utilizadas por modprobe y los comandos insmod, lsmod
y rmmod son:
sys_create_module
sys_init_module
sys_delete_module
sys_get_kernel_syms
32
CAPITULO II
TCP/IP EN LINUX
33
2.1 TCP/IP
2.1.1 Niveles en la pila TCP/IP
Hay algunas discusiones sobre como encaja el modelo TCP/IP dentro del
modelo OSI. Como TCP/IP y modelo OSI no están delimitados con precisión no
hay una respuesta que sea la correcta.
El modelo OSI no está lo suficientemente dotado en los niveles inferiores como
para detallar la auténtica estratificación en niveles: necesitaría tener una capa
extra (el nivel de Interred) entre los niveles de transporte y red. Protocolos
específicos de un tipo concreto de red, que se sitúan por encima del marco de
hardware básico, pertenecen al nivel de red, pero sin serlo. Ejemplos de estos
protocolos son el ARP (Protocolo de resolución de direcciones) y el STP
(Spanning Tree Protocol). De todas formas, estos son protocolos locales, y
trabajan por debajo de las capas de Interred. Cierto es que situar ambos grupos
(sin mencionar los protocolos que forman parte del nivel de Interred pero se sitúan
por encima de los protocolos de Interred, como ICMP) todos en la misma capa
puede producir confusión, pero el modelo OSI no llega a ese nivel de complejidad
para ser más útil como modelo de referencia.
La siguiente Tabla intenta mostrar la pila TCP/IP y otros protocolos relacionados
con el modelo OSI original:
Tabla 6. Pila de protocolos modelo OSI
7 Aplicación
ej. HTTP, DNS, SMTP, SNMP, FTP, Telnet, SSH y SCP, NFS,
RTSP, Feed, Webcal
6 Presentación
ej. XDR, ASN.1, SMB, AFP
5 Sesión
ej. TLS, SSH, ISO 8327 / CCITT X.225, RPC, NetBIOS
4 Transporte
ej. TCP, UDP, RTP, SCTP, SPX
3 Red
ej. IP, ICMP, IGMP, X.25, CLNP, ARP, RARP, BGP, OSPF
34
2
Enlace
de ej. Ethernet, Token Ring, PPP, HDLC, Frame Relay, RDSI,
datos
ATM, IEEE 802.11, FDDI
1 Físico
Normalmente,
ej. cable, radio, fibra óptica
los
tres
niveles
superiores
del
modelo
OSI
(Aplicación,
Presentación y Sesión) son considerados simplemente como el nivel de aplicación
en el conjunto TCP/IP. Como TCP/IP no tiene un nivel de sesión unificado sobre el
que los niveles superiores se sostengan, estas funciones son típicamente
desempeñadas (o ignoradas) por las aplicaciones de usuario. La diferencia más
notable entre los modelos de TCP/IP y OSI es el nivel de Aplicación, en TCP/IP se
integran algunos niveles del modelo OSI en su nivel de Aplicación. Una
interpretación simplificada de la pila se muestra debajo:
Tabla 7 Una interpretación simplificada de la pila
ej.
5 Aplicación
HTTP,
FTP,
DNS
(protocolos de enrutamiento como BGP y RIP, que por varias
razones funcionen sobre TCP y UDP respectivamente, son
considerados parte del nivel de red)
ej.
TCP,
UDP,
RTP,
SCTP
4 Transporte (protocolos de enrutamiento como OSPF, que funcionen sobre IP,
son considerados parte del nivel de red)
Para
3 Interred
TCP/IP
este
es
el
Protocolo
de
Internet
(IP)
(protocolos requeridos como ICMP e IGMP funcionan sobre IP,
pero todavía se pueden considerar parte del nivel de red; ARP no
funciona sobre IP
2 Enlace
ej. Ethernet, Token Ring, etc.
1 Físico
ej. medio físico, y técnicas de codificación, T1, E1
35
Linux implementa todo lo necesario para trabajar en red con TCP/IP. Desde
administradores para las tarjetas de red más populares hasta SLIP/PPP, que
permiten acceder a una red TCP/IP por el puerto serie. También se implementan
PLIP (para comunicarse por el puerto de la impresora) y NFS (para acceso remoto
a ficheros). Y también se han portado los clientes de TCP/IP, como FTP, telnet,
NNTP y SMTP.
Linux dispone de los dos principales protocolos de red para sistemas UNIX:
TCP/IP y UUCP. TCP/IP (para los aficionados a los acrónimos, Transmission
Control Protocol/Internet Protocol) es un conjunto de protocolos de red que
permite a sistemas de todo el mundo comunicarse en una única red conocida
como Internet. Con Linux, TCP/IP y una conexión a la red, puede comunicarse con
usuarios y máquinas por toda Internet mediante correo electrónico, noticias
(USENET news), transferencias de ficheros con FTP y mucho más. Actualmente
hay muchos sistemas Linux conectados a Internet.
La mayoría de las redes TCP/IP usan Ethernet como tipo de red física de
transporte. Linux da soporte a muchas tarjetas de red Ethernet e interfaces para
ordenadores personales, incluyendo el adaptador Ethernet D-Link de bolsillo para
ordenadores portátiles.
Pero dado que no todo el mundo tiene una conexión Ethernet en casa, Linux
también proporciona SLIP (Serial Line Internet Protocol), el cual permite
conectarse a Internet a través de un módem. Para poder usar SLIP, necesitará
tener acceso a un servidor de SLIP, una máquina conectada a la red que permite
acceso de entrada por teléfono. Muchas empresas y universidades tienen
servidores SLIP disponibles. De hecho, si su sistema Linux dispone de conexión
Ethernet y de módem, puede configurarlo como servidor de SLIP para otros
usuarios.
NFS (Network File System) permite fácilmente compartir ficheros con otras
máquinas de la red. FTP (File Transfer Protocol) permite la transferencia de
ficheros entre máquinas.
Si tiene experiencia con aplicaciones TCP/IP en otros sistemas UNIX, Linux le
será muy familiar. El sistema proporciona la interface estándar de programación
por "sockets", lo que virtualmente permite que cualquier programa que use TCP/IP
36
pueda ser llevado a Linux. El servidor Linux de X también soporta TCP/IP,
permitiendo ver aplicaciones que están corriendo en otros sistemas sobre su
pantalla.
UUCP (UNIX-to-UNIX Copy) es un viejo mecanismo usado para transferir ficheros,
correo electrónico y noticias entre máquinas UNIX. Clásicamente las máquinas
UUCP conectan entre ellas mediante líneas telefónicas y módem, pero UUCP es
capaz de funcionar también sobre una red TCP/IP. Si no tiene acceso a una red
TCP/IP o a un servidor SLIP, puede configurar su sistema para enviar y recibir
ficheros y correo electrónico usando UUCP.
2.1.2 Familia de protocolos de Internet
La familia de protocolos de Internet es un conjunto de protocolos de red que
implementa la pila de protocolos en la que se basa Internet y que permiten la
transmisión de datos entre redes de computadoras. En ocasiones se la denomina
conjunto de protocolos TCP/IP, en referencia a los dos protocolos más importantes
que la componen: Protocolo de Control de Transmisión (TCP) y Protocolo de
Internet (IP), que fueron los dos primeros en definirse, y que son los más utilizados
de la familia. Existen tantos protocolos en este conjunto que llegan a ser más de
100 diferentes, entre ellos se encuentra el popular HTTP (HyperText Transfer
Protocol), que es el que se utiliza para acceder a las páginas web, además de
otros como el ARP (Address Resolution Protocol) para la resolución de
direcciones, el FTP (File Transfer Protocol) para transferencia de archivos, y el
SMTP (Simple Mail Transfer Protocol) y el POP (Post Office Protocol) para correo
electrónico, TELNET para acceder a equipos remotos, entre otros.
El TCP/IP es la base de Internet, y sirve para enlazar computadoras que utilizan
diferentes sistemas operativos, incluyendo PC, minicomputadoras y computadoras
centrales sobre redes de área local (LAN) y área extensa (WAN). TCP/IP fue
desarrollado y demostrado por primera vez en 1972 por el departamento de
defensa de los Estados Unidos, ejecutándolo en ARPANET, una red de área
extensa del departamento de defensa.
37
La familia de protocolos de internet puede describirse por analogía con el modelo
OSI, que describe los niveles o capas de la pila de protocolos, aunque en la
práctica no corresponde exactamente con el modelo en Internet. En una pila de
protocolos, cada nivel soluciona una serie de problemas relacionados con la
transmisión de datos, y proporciona un servicio bien definido a los niveles más
altos. Los niveles superiores son los más cercanos al usuario y tratan con datos
más abstractos, dejando a los niveles más bajos la labor de traducir los datos de
forma que sean físicamente manipulables.
El modelo de Internet fue diseñado como la solución a un problema práctico de
ingeniería. El modelo OSI, en cambio, fue propuesto como una aproximación
teórica y también como una primera fase en la evolución de las redes de
ordenadores. Por lo tanto, el modelo OSI es más fácil de entender, pero el modelo
TCP/IP es el que realmente se usa. Sirve de ayuda entender el modelo OSI antes
de conocer TCP/IP, ya que se aplican los mismos principios, pero son más fáciles
de entender en el modelo OSI.
2.2 TCP/IP Linux
El código de TCP en Linux se escribió de forma independiente al resto de
implementaciones. Hay que tener en cuenta que, al estar bajo licencia GPL, no
podría haber usado el código de los sistemas BSD, ya que éstos usaban la
licencia BSD original (con la cláusula de publicidad), incompatible con la GPL.
Esta cláusula se quitó mucho más tarde, en 1999.
Todos los detalles de implementación de TCP en Linux están visibles y explicados
en su código fuente. La parte relacionada con TCP en IPv4 está en el directorio
net/ipv4/. Aquí se encuentran ficheros importantes, como:
tcp_ipv4.c
tcp_input.c
tcp_output.c
En net/ipv6/ está el código para implementar TCP sobre IPv6. Es una adaptación
del código para IPv4.
38
En un sistema en ejecución, varios parámetros de TCP se pueden ver y
modificar
mediante
los
ficheros
del
directorio
/proc,
por
ejemplo
/proc/sys/net/ipv4/
Existen varios libros que explican los detalles de implementación de TCP/IP en
el núcleo Linux y analizan su código. Uno de ellos, que describe hasta la
versión 2.4, es:
Wehrle, Klaus; Pahlke, Frank; Ritter, Hartmut; Muller, Daniel; Bechler,
Marc (2004), Linux Network Architecture, Prentice Hall. ISBN 0131777203.
Fig. 7 Varios algoritmos de control de congestión seleccionables al compilar Linux
(versión 2.6.17.4)
Como entrar al menú descrito en la figura 7 (at make menuconfig</menu>):
Asegúrese
que
usted
tiene
"
Prompt
para
desarrollo
y/o
código/controladores incompleto " activo
Activar:
"Networking"
->
"Networking
options"
->
"TCP:
advanced
congestion control"
Entonces entre "TCP congestion control"
The default settings are: BIC-TCP with new Reno as a fallback
39
Linux implementa muchos algoritmos de control de congestión. Por ejemplo, está
SACK, Westwood+, Reno, NewReno, FACK (forward acknowledgement), ECK, HTCP, y varios más. Desde la version 2.6.19 se usa por defecto CUBIC con
NewReno como salvaguarda.
Se puede cambiar el algoritmo usado por defecto ajustando las opciones de
compilación, tal como se ve en la imagen adjunta. Aunque al ser modular, tambien
puede
ser
cambiado
en
caliente
modificando
/proc/sys/net/ipv4/tcp_congestion_control.
Linux 2.4 usando el algoritmo SACK (acuse de recibo selectivo) consigue un
rendimiento mayor que otros sistemas que también usan SACK (como OpenBSD y
FreeBSD), según Comparando las implementaciones modernas (2004/2005), se
ve que han evolucionado por caminos distintos, pero que todas aguantan bien la
congestión de red (a diferencia de la implementación original de BSD). Según las
pruebas, Linux 2.6 el que mejor rendimiento da (de entre FreeBSD 5.3, OpenBSD
3.5, y Windows XP Service Pack 2).
Como el desarrollo de Linux es un proceso abierto al público, en Internet se
encuentran páginas que explican los problemas que daba su implementación de
TCP, y cómo se han solucionado. Por ejemplo: mejora de rendimiento en la
versión 2.0.36 (marzo 1999), problemas de TCP detectados al hacer una
comparativa (1999), ajustes para 2.4 y 2.6 (febrero 2006), problemas en los
algoritmos de TCP en Linux 2.6.16.3 (junio 2006), entre otros. Es habitual que
estos fallos se detecten cuando alguien está escribiendo un documento técnico o
comparativa. En caso de comportamiento extraño, un estudio del código fuente
sirve para confirmar las sospechas y poder corregir el error en Linux.
40
2.2.1 IPv4
IPv4 es la versión 4 del Protocolo IP (Internet Protocol). Esta fue la
primera versión del protocolo que se implementó extensamente, y forma la
base de Internet.
IPv4 usa direcciones de 32 bits, limitándola a 232 = 4.294.967.296 direcciones
únicas, muchas de las cuales están dedicadas a redes locales (LANs). Por el
crecimiento enorme que ha tenido del Internet (mucho más de lo que esperaba,
cuando se diseñó IPv4), combinado con el hecho de que hay desperdicio de
direcciones en muchos casos, ya hace varios años se vio que escaseaban las
direcciones IPv4.
Esta li|mitación ayudó a estimular el impulso hacia IPv6, que esta actualmente
en las primeras fases de implementación, y se espera que termine
reemplazando a IPv4.
2.2.2 Desperdicio de direcciones
¿El desperdicio de direcciones IPv4 se debe a varios factores. Uno de
los principales es que inicialmente no se consideró el enorme crecimiento que
iba a tener Internet; se asignaron bloques de direcciones grandes (de 16,7
millones de direcciones) a países, e incluso a empresas.
Otro motivo de desperdicio es que en la mayoría de las redes, exceptuando las
más pequeñas, resulta conveniente dividir la red en subredes. Dentro de cada
subred, la primera y la última dirección no son utilizables; de todos modos no
siempre se utilizan todas las direcciones restantes. Por ejemplo, si en una
subred se quieren acomodar 80 hosts, se necesita una subred de 128
direcciones (se tiene que redondear a la siguiente potencia de 2); en este
ejemplo, las 48 direcciones restantes ya no se utilizan.
41
2.3 El Sistema Operativo y la Comunicación
La diferencia entre los requisitos de las aplicaciones y las características
(y necesidades) del hardware de comunicación hacen necesaria la existencia
de una interfaz a través de la que las aplicaciones accedan a los servicios de
comunicación entre computadores a través de la red (network communication).
En el sistema operativo suelen incluirse los servicios que permiten la
comunicación entre computadores.
Esta comunicación se encuentra en la base de servicios de red como WWW,
ftp, rlogin, NFS, e-mail,.... y el tipo de red utilizada es irrelevante para el
usuario.
En Linux los protocolos más frecuentemente utilizados para la comunicación
son los TCP/IP. Otros:
En la figura 8 vemos que en la Capa de enlace se muestran los protocolas que
se utilizan con mayor frecuencia en Linux. SLIP (Serial Line Interface Protocol),
PLIP (Parallel Line Interface Protocol), PPP (Point to Point Protocol), AX.25
(Comunicación por radio), IPX (Protocolo desarrollado por Novell).
Fig. 8 Pilas de protocolos.
42
Linux implementa los protocolos del conjunto TCP/IP.
El acceso a los servicios de red se suele realizare a través de los sockets.
Los Sockets BSD son una interfaz de programación abstracta que se implementa
sobre la capa de sockets INET, y ésta, a su vez, sobre la capa de transporte
TCP/UDP.
2.3.1 Envío TCP/IP
Fig. 9 Pila de protocolos y la forma en que interactúan al enviar paquetes
La figura 9 ilustra el proceso que se realiza capa por capa para hacer el envío de
un paquete, desde la escritura del socket hasta que el paquete sale al medio.
43
2.3.2 Recepción TCP/IP
Fig. 10 Pila de protocolos y la forma en que interactúan al recibir paquetes
La figura 10 ilustra el proceso que se realiza capa por capa para hacer la
recepción de un paquete, desde que el paquete llega del medio, hasta que la
aplicación dispone de los datos para su uso.
44
Fig. 11 Pila de protocolos y módulos que los componen
El acceso a los servicios de red se suele realizare a través de los sockets. La
figura 11 muestra la capa de sockets y Los Sockets BSD que son una interfaz de
programación abstracta que se implementa sobre la capa de sockets INET, y ésta,
a su vez, sobre la capa de transporte TCP/UDP.
45
2.3.3 Sockets sobre TCP/IP en Linux: Fuentes y Estructuras de Datos
Fig. 12 Bibliotecas que se utilizan en Linux para manejar sockets.
La figura 12 muestra las bibliotecas empleadas en Linux para utilizar lo sockets
necesarios para el envío y recepción de paquetes necesitados por las aplicaciones
del usuario.
46
Fig .13 Creacion de estructura de datos
Tarjeta de red o NIC (Network Interface Controller, Controlador de Interfaz de Red
en español) mostrada en la figura 13, es una tarjeta de expansión que permite a
una DTE (Data Terminal Equipment) ordenador o impresora acceder a una red y
compartir recursos entre dos o más equipos (discos duros, cdrom, etc). Hay
diversos tipos de adaptadores en función del tipo de cableado o arquitectura que
se utilice en la red (coaxial fino, coaxial grueso, etc.), pero, actualmente el más
común es del tipo Ethernet utilizando un interfaz o conector RJ45.
2.3.4 Creación de un Socket
Proceso ilustrado en la figura 14:
1. Llamada a la función socket() de la biblioteca BSD
2. Se origina la llamada al sistema, sys_socket() (en net/socket.c)
3. Esta función utiliza la función sock_create() (en net/socket.c)
47
Fig. 14 Creacion de un socket
Mediante inet_create(struct socket *sock, int protocol), como se muestra en la
figura 15 (net/ipv4/af_inet.c)
•
Se asigna memoria a la estructura sock
•
Se inicializan los valores correspondientes a TCP o UDP para la estructura
proto
•
Se inicializan los valores correspondientes a familia, protocolo, etc. en la
estructura sock
Fig. 15 Creacion de un socket 2
48
Fig. 16 Estructura de un socket
En la figura 16 se muestra el bloque de código que contiene la información del
estado del socket y las estructuras hacia las que apunta.
49
Fig. 17 Estructura del protocolo de transmisión
En la figura 17 está el bloque de código para elaborar la estructura del protocolo
de transmisión, declarado proto_ops.
Fig. 18 Estructura de un socket
50
La figura 18 muestra el código correspondiente a la estructura de un socket en la
que se utilizan apuntadores que se dirigen hacia estructuras como: proto,
sk_buff_head_recive_queue, sk_buff_head_write_queue.
Fig. 19 Estructura compuesta por una serie de operaciones para implementar los protocolos TCP y
UDP
En la figura 19 se muestra el código de la estructura compuesta por apuntadores
que van a ser utilizados en los protocolos tcp y udp.
51
Fig. 20 Escritura del sistema de archivos en Linux
En informática, un inodo, nodo-i (figura 20), nodo índice o i-node en inglés
es una estructura de datos propia de los sistemas de archivos tradicionalmente
empleados en los sistemas operativos tipo UNIX como es el caso de Linux. Un
inodo contiene las características (permisos, fechas, ubicación, pero NO el
nombre) de un archivo regular, directorio, o cualquier otro objeto que pueda
contener el sistema de ficheros.
52
Fig. 21 Diagrama explicativo de la interacción entre el socket, protocolo y el sistema de archivos.
En la figura 21 se presenta la interacción existente entre las estructuras antes
creadas.
1,2 (figura 22): write(socket,data, length) llama a sys_write() componente del
VFS, que comprueba características del socket, sock_write() transfiere los
parámetros de la escritura a la estructura de mensaje y llama a sock_sendmsg()
obtiene la dirección del socket a partir de su identificador, como se muestra en la
figura 22 y 23.
53
Fig. 22 Uso de la memoria del sistema
Fig. 23 Estructura de envio
54
Fig. 24 Almacenamiento de punteros a funciones en un vector.
El descriptor de un socket es similar a un descriptor de fichero: se pueden utilizar
llamadas estándar al sistema para operar con ficheros. Los punteros utilizados
para las distintas operaciones de fichero se almacenan en un vector como se
muestra en la figura 24.
55
Fig. 25 Definición de la estructura de archivos a utilizar
En la figura 25 se muestran el código de la estructura archivo (struct file)
declarando las variables a utilizar y las estructuras con las que se va a conectar.
Fig. 26 Asociación del socket con el fichero
56
Después de crear las estructuras, file y files_struct, se busca la estructura socket
asociada con el fichero a través de la función scki_lookup(), se convierten los
parámetros a la estructura del mensaje completando la correspondiente cabecera
(msghdr) y se llama a la función sock_sendmsg() situada en la biblioteca
/net/socket.c, como se muestra en el código de la figura 26.
Fig. 27 Estructuras creadas a partir del socket
En el cuadro numero 3 de la figura 27 se utiliza inet_sendmsg() (figura 28): utiliza
sock para llamar a la función de envío según el protocolo (proto tiene un puntero a
la función de envío)
En el cuadro numero 4 de la figura 27 se utiliza tcp_sendmsg(): reserva memoria
para los paquetes, trocea en MTU, crea la estructura sk_buff, y comprueba
disponibilidad en receptor.
Al crear un socket se crean, entre otras, las estructuras de datos socket, sock,
inode, proto_ops y proto, como se muestra en la figura 27.
57
Fig. 28 Forma de interacción entre las estructuras creadas
Fig. 29 Protocolo enviado con las características del paquete
Extrae de socket el puntero que apunta a una estructura sock (socket INET)
A través de la estructura sock se llama a la función de envío de protocolo: El
campo prot de la estructura sock tiene los punteros de función para TCP (o UDP).
Es decir sk->prot->sendmsg(sk,msg,size) se traduce a tcp_sendmsg (figura 29).
58
struct sk_buff {
/* These two members must be first. */
struct sk_buff * next;
/* Next buffer in list
struct sk_buff * prev;
/* Previous buffer in list
struct sk_buff_head * list;
/* List we are on
struct sock
*sk;
/* Socket we are owned by
struct timeval stamp;
/* Time we arrived
struct net_device *dev;
/* Device we arrived on/are leaving by
/* Transport layer header */
union
{
struct tcphdr *th;
struct udphdr *uh;
struct icmphdr *icmph;
struct igmphdr *igmph;
struct iphdr *ipiph;
struct spxhdr *spxh;
unsigned char *raw;
} h;
/* Network layer header */
union
{
struct iphdr *iph;
struct ipv6hdr *ipv6h;
struct arphdr *arph;
struct ipxhdr *ipxh;
unsigned char *raw;
} nh;
*/
*/
*/
*/
*/
*/
/* Link layer header */
union
{
struct ethhdr *ethernet;
unsigned char *raw;
} mac;
struct dst_entry *dst;
/*
/*
* This is the control buffer. It is free to use for every
* layer. Please put your private variables there. If you
* want to keep them across layers you have to do a skb_clone()
* first. This is owned by whoever has the skb queued ATM.
*/
char
cb[48];
unsigned int len;
/* Length of actual data
*/
unsigned int data_len;
unsigned int csum;
/* Checksum
*/
unsigned char __unused,
/* Dead field, may be reused
*/
cloned,
/* head may be cloned (check refcnt to be sure). */
pkt_type,
/* Packet class
*/
ip_summed; /* Driver fed us an IP checksum
*/
__u32
priority;
/* Packet queueing priority
*/
atomic_t
users;
/* User count - see datagram.c,tcp.c
*/
unsigned short protocol;
/* Packet protocol from driver.
*/
unsigned short security;
/* Security level of packet
*/
unsigned int truesize;
/* Buffer size
unsigned char *head;
* Head of buffer
unsigned char *data;
/* Data head pointer
unsigned char *tail;
/* Tail pointer
unsigned char *end;
* End pointer
void
(*destructor)(struct sk_buff *);/* Destruct function
……………………………………………
*/
*/
*/
*/
*/
*/
};
Fig. 30 Estructura del buffer
59
En la figura 30 se muestra el código para crear struct sk_buff, que es la
estructura del buffer utilizado para almacenar momentáneamente los datos que
llegan y se utiliza la biblioteca /include/linux/skbuff.h.
Todos los protocolos utilizan el mismo sk_buff. Los protocolos de transporte y los
drivers crean estructuras de paquete para los datos que les llegan. Éstos se
gestionan a través de los buffers que se muestran en la figura 31.
Fig. 31 Estructura del buffer.
60
Fig. 32 Secuencia de envío
int tcp_sendmsg(struct sock *sk, struct msghdr *msg, int size)
{
struct iovec *iov;
struct tcp_opt *tp;
struct sk_buff *skb;
int iovlen, flags;
int mss_now;
int err, copied;
long timeo;
tp = &(sk->tp_pinfo.af_tcp);
lock_sock(sk);
TCP_CHECK_TIMER(sk);
flags = msg->msg_flags;
timeo = sock_sndtimeo(sk, flags&MSG_DONTWAIT);
/* Wait for a connection to finish. */
if ((1 << sk->state) & ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT))
if((err = wait_for_tcp_connect(sk, flags, &timeo)) != 0) goto out_err;
/* This should be in poll */
clear_bit(SOCK_ASYNC_NOSPACE, &sk->socket->flags);
Fig. 33 Estructura del proceso de envio del mensaje
61
El
método
tcp_sendmsg()
mostrado
en
la
figura
32
y
visualizado
estructuralmente en la figura 33 ubicado en la biblioteca /net/ipv4/tpc.c realiza las
siguientes acciones:
•
Reserva memoria de sistema para los paquetes llamando a la la función
tcp_alloc_pskb()
•
Trocea los datos en unidades MTU y crea una estructura sk_buff para
almacenar cada MTU. Se copian los datos desde la memoria de usuario a
las estructuras sk_buff. Mediante csum_and_copy_from_user() se realiza
la copia y el cálculo del código de eror. Las estructuras sk_buff para un
mismo mensaje están enlazadas.
•
Llama a tcp_write_xmit() para controlar que el receptor tiene disponible
una ventana de recepción (según el algoritmo de control de flujo de ventana
deslizante) y cuando se tiene el visto bueno (se utiliza un timer) se llama a
tcp_transmit_skb()
Fig. 34 cuadro no. 5 tcp_transmit_skb
62
El cuadro 5 de la figura 34, corresponde a tcp_transmit_skb() que es el compone
de la cabecera TCP para cada sk_buf y contiene la información del sock (se llama
según el número de paquetes). Decide si se encolan o se envían (figura 35).
Fig. 35 Se procede a enviar el mensaje mediante un socket
63
int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb)
{
if(skb != NULL) {
struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp);
struct tcp_skb_cb *tcb = TCP_SKB_CB(skb);
int tcp_header_size = tp->tcp_header_len;
struct tcphdr *th;
int sysctl_flags;
int err;
#define SYSCTL_FLAG_TSTAMPS
#define SYSCTL_FLAG_WSCALE
#define SYSCTL_FLAG_SACK
0x1
0x2
0x4
sysctl_flags = 0;
if (tcb->flags & TCPCB_FLAG_SYN) {
tcp_header_size = sizeof(struct tcphdr) + TCPOLEN_MSS;
if(sysctl_tcp_timestamps) {
tcp_header_size += TCPOLEN_TSTAMP_ALIGNED;
sysctl_flags |= SYSCTL_FLAG_TSTAMPS;
}
if(sysctl_tcp_window_scaling) {
tcp_header_size += TCPOLEN_WSCALE_ALIGNED;
sysctl_flags |= SYSCTL_FLAG_WSCALE;
}
if(sysctl_tcp_sack) {
sysctl_flags |= SYSCTL_FLAG_SACK;
if(!(sysctl_flags & SYSCTL_FLAG_TSTAMPS))
tcp_header_size += TCPOLEN_SACKPERM_ALIGNED;
}
} else if (tp->eff_sacks) {
/* A SACK is 2 pad bytes, a 2 byte header, plus
* 2 32-bit sequence numbers for each SACK block.
*/
tcp_header_size += (TCPOLEN_SACK_BASE_ALIGNED +
(tp->eff_sacks * TCPOLEN_SACK_PERBLOCK));
}
th = (struct tcphdr *) skb_push(skb, tcp_header_size);
skb->h.th = th;
skb_set_owner_w(skb, sk);
Fig. 36 Estructura del envio del mensaje mediante un socket
64
/* Build TCP header and checksum it. */
th->source
= sk->sport;
th->dest
= sk->dport;
th->seq
= htonl(tcb->seq);
th->ack_seq
= htonl(tp->rcv_nxt);
*(((__u16 *)th) + 6)
= htons(((tcp_header_size >> 2) << 12) | tcb->flags);
if (tcb->flags & TCPCB_FLAG_SYN) {
/* RFC1323: The window in SYN & SYN/ACK segments
* is never scaled.
*/
th->window = htons(tp->rcv_wnd);
} else {
th->window = htons(tcp_select_window(sk));
}
th->check
= 0;
th->urg_ptr
= 0;
if (tp->urg_mode &&
between(tp->snd_up, tcb->seq+1, tcb->seq+0xFFFF)) {
th->urg_ptr
= htons(tp->snd_up-tcb->seq);
th->urg
= 1;
}
if (tcb->flags & TCPCB_FLAG_SYN) {
tcp_syn_build_options((__u32 *)(th + 1),
tcp_advertise_mss(sk),
(sysctl_flags & SYSCTL_FLAG_TSTAMPS),
(sysctl_flags & SYSCTL_FLAG_SACK),
(sysctl_flags & SYSCTL_FLAG_WSCALE),
tp->rcv_wscale,
tcb->when,
tp->ts_recent);
} else {
tcp_build_and_update_options((__u32 *)(th + 1),
tp, tcb->when);
TCP_ECN_send(sk, tp, skb, tcp_header_size);
}
tp->af_specific->send_check(sk, th, skb->len, skb);
Fig. 37 Continuación de la figura 36
En las figuras 36 y 37 se muestra el código de la función tcp_transmit_skb(), el
cual se encuentra en la biblioteca /net(ipv4/tcp_output.c y Construye la cabecera
TCP y calcula el código de error (checksum) para cada sk_buff con la información
disponible en sock. Se llama a esta función tantas veces como paquetes existan.
65
Fig. 38 Estructura en donde se toma la decisión de enviar o encolar el o los paquetes
Función
tcp_transmit_skb()
que
se
encuentra
en
la
biblioteca
/net(ipv4/tcp_output.c, este llama a tcp_send_skb() (fig. 38) que decide si envía o
encola los paquetes añadiendo la correspondiente estructura sk_buff a la lista
enlazada (en los dos sentidos) con los paquetes pendientes de envío.
La función tcp_send_skb() también se encarga de actualizar el número de
secuencia de los paquetes (con la información disponible en sock)
Finalmente, tcp_transmit_skb() llama a ip_queue_xmit()
66
Fig. 39 Diagrama del proceso de salida del paquete
En el cuadro 6 de la figura 39 que corresponde a la función ip_queue_xmit() la
cual se encarga de poner la cabecera IP y llamar a dev_queue_xmit() para que
vaya transmitiendo cada paquete (figura 40).
En el cuadro 7 de la figura 39 que corresponde a la función dev_queue_xmit()
actúa sobre la estructuras sk_buff de los paquetes pendientes.
La rutina socket() de la biblioteca de C devuelve un descriptor de fichero, las
llamadas a las funciones del sistema de E/S read() y write() pueden utilizarse.
Cuando un proceso se comunica a través de la red utiliza las funciones que
proporciona la capa de sockets BSD. Esta capa se encarga de tareas similares a
las del sistema de ficheros virtuales y permite administrar una estructura de datos
general para los sockets.
Debajo está la capa de sockets INET que gestiona los extremos de comunicación
para los protocolos TCP y UDP. Estos se manejan a través de estructuras de
datos sock (sockets INET). Según el tipo de socket, la capa que hay debajo es la
capa TCP, UDP, o directamente la capa IP. Debajo de la capa IP están los
dispositivos, a los que la capa IP pasa los paquetes finales. Se asume que los
67
procesos que se comunican han creado sus sockets y se encuentran conectados
unos con otros a través de connect() o accept().
Fig. 40 ip_queue_xmit()
68
int ip_queue_xmit(struct sk_buff *skb)
{
struct sock *sk = skb->sk;
struct ip_options *opt = sk->protinfo.af_inet.opt;
struct rtable *rt;
struct iphdr *iph;
/* Make sure we can route this packet. */
rt = (struct rtable *)__sk_dst_check(sk, 0);
if (rt == NULL) {
u32 daddr;
/* Use correct destination address if we have options. */
daddr = sk->daddr;
if(opt && opt->srr)
daddr = opt->faddr;
/* If this fails, retransmit mechanism of transport layer will
* keep trying until route appears or the connection times itself
* out.
*/
if (ip_route_output(&rt, daddr, sk->saddr,
RT_TOS(sk->protinfo.af_inet.tos) | RTO_CONN | sk->localroute,
sk->bound_dev_if))
goto no_route;
__sk_dst_set(sk, &rt->u.dst);
sk->route_caps = rt->u.dst.dev->features;
}
skb->dst = dst_clone(&rt->u.dst);
if (opt && opt->is_strictroute && rt->rt_dst != rt->rt_gateway)
goto no_route;
/* OK, we know where to send it, allocate and build IP header. */
iph = (struct iphdr *) skb_push(skb, sizeof(struct iphdr) + (opt ? opt->optlen : 0));
*((__u16 *)iph)
= htons((4 << 12) | (5 << 8) | (sk->protinfo.af_inet.tos & 0xff));
iph->tot_len = htons(skb->len);
iph->frag_off = 0;
iph->ttl
= sk->protinfo.af_inet.ttl;
iph->protocol = sk->protocol;
iph->saddr = rt->rt_src;
iph->daddr = rt->rt_dst;
skb->nh.iph = iph;
/* Transport layer set skb->h.foo itself. */
if(opt && opt->optlen) {
iph->ihl += opt->optlen >> 2;
ip_options_build(skb, opt, sk->daddr, rt, 0);
}
return NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, rt->u.dst.dev,
ip_queue_xmit2);
no_route:
IP_INC_STATS(IpOutNoRoutes);
kfree_skb(skb);
return -EHOSTUNREACH;
}
Fig. 41 estructua de código en la que ip_queue_xmit() contruye la cabecera IP
69
En la figura 41 se enuncia el código de la función ip_queue_xmit() que se
encuentra en la biblioteca /net/ipv4/ip_output.c y construye la cabecera IP, busca
la ruta, añade el código de error (checksum), fragmenta y llama a
dev_queue_xmit() (fig. 42).
Fig. 42 La rutina dev_queue_xmit() se encarga de la transmisión del sk_buff correspondiente a
cada paquete, a través de la tarjeta de red (a través de una llamada a su controlador
70
int dev_queue_xmit(struct sk_buff *skb)
{
struct net_device *dev = skb->dev;
struct Qdisc *q;
if (skb_shinfo(skb)->frag_list &&
!(dev->features&NETIF_F_FRAGLIST) &&
skb_linearize(skb, GFP_ATOMIC) != 0) {
kfree_skb(skb);
return -ENOMEM;
}
/* Fragmented skb is linearized if device does not support SG,
* or if at least one of fragments is in highmem and device
* does not support DMA from it.
*/
if (skb_shinfo(skb)->nr_frags &&
(!(dev->features&NETIF_F_SG) || illegal_highdma(dev, skb)) &&
skb_linearize(skb, GFP_ATOMIC) != 0) {
kfree_skb(skb);
return -ENOMEM;
}
/* If packet is not checksummed and device does not support
* checksumming for this protocol, complete checksumming here.
*/
if (skb->ip_summed == CHECKSUM_HW &&
(!(dev->features&(NETIF_F_HW_CSUM|NETIF_F_NO_CSUM)) &&
(!(dev->features&NETIF_F_IP_CSUM) ||
skb->protocol != htons(ETH_P_IP)))) {
if ((skb = skb_checksum_help(skb)) == NULL)
return -ENOMEM;
}
/* Grab device queue */
spin_lock_bh(&dev->queue_lock);
q = dev->qdisc;
if (q->enqueue) {
int ret = q->enqueue(skb, q);
qdisc_run(dev);
spin_unlock_bh(&dev->queue_lock);
return ret == NET_XMIT_BYPASS ? NET_XMIT_SUCCESS : ret;
}
/* The device has no queue. Common case for software devices:
loopback, all the sorts of tunnels...
Really, it is unlikely that xmit_lock protection is necessary here.
(f.e. loopback and IP tunnels are clean ignoring statistics counters.)
However, it is possible, that they rely on protection
made by us here.
Check this and shot the lock. It is not prone from deadlocks.
Either shot noqueue qdisc, it is even simpler 8)
*/
if (dev->flags&IFF_UP) {
int cpu = smp_processor_id();
if (dev->xmit_lock_owner != cpu) {
spin_unlock(&dev->queue_lock);
spin_lock(&dev->xmit_lock);
dev->xmit_lock_owner = cpu;
Fig. 43 La rutina dev_queue_xmit() se encarga de la transmisión del sk_buff correspondiente a cada
paquete, a través de la tarjeta de red (a través de una llamada a su controlador)
71
En la figura 43 se encuentra el código de la función dev_queue_xmit() la cual se
encuentra en la biblioteca /net/core/dev.c y se encarga de:
•
La rutina dev_queue_xmit() se encarga de la transmisión del sk_buff
correspondiente a cada paquete, a través de la tarjeta de red (a través de
una llamada a su controlador.
•
La función actúa sobre las estructuras sk_buff de todos los paquetes
pendientes de envío de todas las aplicaciones que necesitan enviar a través
del mismo dispositivo.
•
Las estructuras sk_buff se encuentran enlazadas a través de una lista (en
una sola dirección) (Fig. 44).
Fig. 44 Diagrama explicativo de la interacción
72
2.3.5 Ubicación de las Funciones ejecutadas para enviar un mensaje a
través de Sockets en Linux
Fig. 45 Ubicación de las funciones ejecutadas para enviar un mensaje a través de sockets en Linux
Otras estructuras o punteros que se incluyen en esta estructura de la figura 45
son:
-
Cabecera de la cola de recibidos
-
Cabecera de la cola de enviados
-
Dirección fuente para el socket
-
Colas extras para paquetes de respaldo, erróneos, etc.
-
Opciones TCP para el socket
73
2.3.6 Convenientes e Inconvenientes de la comunicación con TCP/IP
en Linux.
Para culminar el capítulo 2 de esta monografía, voy a enlistar de las
ventajas y desventajas de la transmisión de datos mediante TCP/IP en Linux:
Ventajas:
• Ofrece interfaz de programación (API): Sockets BSD
• Transporte fiable
• Protección entre aplicaciones
• Control de flujo
• Gestión de multitarea y multiusuario
Desventajas:
• Cambios de contexto
• Transferencias de datos entre el espacio de usuario y las estructuras
utilizadas por el sistema operativo
• Tiempo que consume la ejecución de las rutinas que implementan los
protocolos.
74
CAPITULO III
LAS WIRELESS LAN EN LINUX
75
3.1 LAS WIRELESS LAN
En los últimos años se ha producido un crecimiento espectacular en lo
referente al desarrollo y aceptación de las comunicaciones móviles y en concreto
de las redes de área local (Wireless LANs). La función principal de este tipo de
redes es la proporcionar conectividad y acceso a las tradicionales redes cableadas
(Ethernet, Token Ring...), como si de una extensión de éstas últimas se tratara,
pero con la flexibilidad y movilidad que ofrecen las comunicaciones inalámbricas.
El momento decisivo para la consolidación de estos sistemas fue la conclusión del
estándar IEEE 802.11 el mes de junio de 1997. En este estándar se encuentran
las especificaciones tanto físicas como a nivel MAC que hay que tener en cuenta a
la hora de implementar una red de área local inalámbrica. Otro de los estándares
definidos y que trabajan en este mismo sentido es el ETSI HIPERLAN.
WLAN (inglés < Wireless Local Area Network) es un sistema de comunicación de
datos inalámbrico flexible muy utilizado como alternativa a las redes LAN
cableadas o como extensión de éstas. Utiliza tecnología de radiofrecuencia que
permite mayor movilidad a los usuarios al minimizar las conexiones cableadas.
Las WLAN van adquiriendo importancia en muchos campos, como almacenes o
para manufactura, en los que se transmite la información en tiempo real a una
terminal central. También son muy populares en los hogares para compartir el
acceso a Internet entre varias computadoras.
La norma 802.11 ha sufrido diferentes extensiones sobre la norma para obtener
modificaciones
y
mejoras.
De
esta
manera,
tenemos
las
siguientes
especificaciones:
802.11 Especificación para 1-2 Mbps en la banda de los 2.4 GHz, usando salto de
frecuencias( FHSS) o secuencia directa (DSSS).
802.11b Extensión de 802.11 para proporcionar 11Mbps usando DSSS.
76
Wi-Fi (Wireless Fidelity) Promulgado por el WECA para certificar productos
802.11b capaces de interoperar con los de otros fabricantes.
802.11a Extensión de 802.11 para proporcionar 54Mbps usando OFDM.
802.11g Extensión de 802.11 para proporcionar 20-54Mbps usando DSSS y
OFDM. Es compatible hacia atrás con 802.11b. Tiene mayor alcance y menor
consumo de potencia que 802.11a.
3.1.1 Principios de las redes WLAN
3.1.1.1
Cómo trabajan
Se utilizan ondas de radio para llevar la información de un punto a otro
sin necesidad de un medio físico guiado. Al hablar de ondas de radio nos
referimos normalmente a portadoras de radio, sobre las que va la información,
ya que realizan la función de llevar la energía a un receptor remoto. Los datos
a transmitir se superponen a la portadora de radio y de este modo pueden ser
extraídos exactamente en el receptor final.
A este proceso se le llama modulación de la portadora por la información que
está siendo transmitida. Si las ondas son transmitidas a distintas frecuencias
de radio, varias portadoras pueden existir en igual tiempo y espacio sin
interferir entre ellas. Para extraer los datos el receptor se sitúa en una
determinada frecuencia, frecuencia portadora, ignorando el resto. En una
configuración típica de LAN sin cable los puntos de acceso (transceiver)
conectan la red cableada de un lugar fijo mediante cableado normalizado. El
punto de acceso recibe la información, la almacena y la transmite entre la
WLAN y la LAN cableada. Un único punto de acceso puede soportar un
pequeño grupo de usuarios y puede funcionar en un rango de al menos treinta
metros y hasta varios cientos. El punto de acceso (o la antena conectada al
punto de acceso) es normalmente colocado en alto pero podría colocarse en
cualquier lugar en que se obtenga la cobertura de radio deseada. El usuario
final accede a la red WLAN a través de adaptadores. Estos proporcionan una
77
interfaz entre el sistema de operación de red del cliente (NOS: Network
Operating System) y las ondas, mediante una antena.
3.1.1.2
Configuraciones de red para radiofrecuencia
Pueden ser de muy diversos tipos y tan simples o complejas como sea
necesario. La más básica se da entre dos ordenadores equipados con tarjetas
adaptadoras para WLAN, de modo que pueden poner en funcionamiento una red
independiente siempre que estén dentro del área que cubre cada uno. Esto es
llamado red de igual a igual (peer to peer). Cada cliente tendría únicamente
acceso a los recursos del otro cliente pero no a un servidor central. Este tipo de
redes no requiere administración o preconfiguración.
Instalando un Punto de Acceso se puede doblar la distancia a la cuál los
dispositivos pueden comunicarse, ya que estos actúan como repetidores. Desde
que el punto de acceso se conecta a la red cableada cualquier cliente tiene acceso
a los recursos del servidor y además gestionan el tráfico de la red entre los
terminales más próximos. Cada punto de acceso puede servir a varias máquinas,
según el tipo y el número de transmisiones que tienen lugar. Existen muchas
aplicaciones en el mundo real con un rango de 15 a 50 dispositivos cliente con un
solo punto de acceso.
Los puntos de acceso tienen un alcance finito, del orden de 150 m en lugares u
zonas abiertas. En zonas grandes como por ejemplo un campus universitario o un
edificio es probablemente necesario más de un punto de acceso. La meta es
cubrir el área con células que solapen sus áreas de modo que los clientes puedan
moverse sin cortes entre un grupo de puntos de acceso. Esto es llamado roaming.
iuparticulares de topologías, el diseñador de la red puede elegir usar un Punto de
Extensión (EPs) para aumentar el número de puntos de acceso a la red, de modo
que funcionan como tales pero no están enganchados a la red cableada como los
puntos de acceso. Los puntos de extensión funcionan como su nombre indica:
extienden el alcance de la red retransmitiendo las señales de un cliente a un punto
78
de acceso o a otro punto de extensión. Los puntos de extensión pueden
encadenarse para pasar mensajes entre un punto de acceso y clientes lejanos de
modo que se construye un puente entre ambos.
Uno de los últimos componentes a considerar en el equipo de una WLAN es la
antena direccional. Por ejemplo: si se quiere una Lan sin cable a otro edificio a 1
km de distancia. Una solución puede ser instalar una antena en cada edificio con
línea de visión directa. La antena del primer edificio está conectada a la red
cableada mediante un punto de acceso. Igualmente en el segundo edificio se
conecta un punto de acceso, lo cual permite una conexión sin cable en esta
aplicación.
3.1.1.3
Chipset
El Circuito Integrado Auxiliar o Chipset es un conjunto de circuitos integrados que
se encarga de realizar las funciones que el microprocesador delega en ellos.
Chipset traducido literalmente del inglés significa conjunto de circuitos integrados.
Se designa circuito integrado auxiliar al circuito integrado que es periférico a un
sistema pero necesario para el funcionamiento del mismo. La mayoría de los
sistemas necesitan más de un circuito integrado auxiliar.
Contiene todas las instrucciones necesarias para operar la tarjeta inalámbrica.
3.2 LAS WIRELESS LAN EN LINUX
3.2.1 Chipset Prism
El chipset Prism es un circuito auxiliar integrado de los más antiguos en el
mercado, desde que en el año 1998 la empresa Intersil lo creó ha ido
evolucionando hasta convertirse en uno de los más potentes chipsets en el medio.
El chipset Prism es uno de los más usados por usuarios de GNU/Linux así como
BSD gracias a la integración a la que goza este chipset ya que todos los
documentos del comité de evaluación; notas, diseños de referencia, informes y
79
resúmenes técnicos sobre el chipset se pueden conseguir de forma gratuita en la
página web de Intersil
3.2.1.1
Funcionamiento
Tomemos el esquema de la primera versión del Chipset Prism para explicar su
funcionamiento:
La controladora MAC(situada a la derecha en el esquema) ya que realiza la mayor
parte de las operaciones básicas del protocolo 802,11 es la encargada de
determinar si se puede utilizar la tarjeta en modo monitor (RFMON) y de la
inserción y manipulación de marcos en los paquetes así como indicar si la tarjeta
puede cumplir la función de punto de acceso
La controladora MAC de los chipsets Prism 2,0 o superior posee un motor WEP
que agiliza el trabajo con este tipo de criptografía ahorrando ciclos de CPU al
ordenador.
Prism I
---- 802,11 original
Prism II ---- 802,11b
Prism III ---- 802,11a/b
Prism Indigo - 802,11ª
Prism GT ---- 802,11b/g
Prism Duette - 802,11a/b
Prism Nitro -- red IEEE 802.11g mejorada
Prism World Radio --802,11a, b, d, g, h, i y j
80
3.2.2 Chipset Hermes
El Chipset Hermes está desarrollado por Lucent. Es un chipset de código cerrado,
no obstante Lucent publicó una parte del código fuente necesario para controlar
las funciones básicas de las tarjetas ORiNOCO, a partir del cual se creó el
controlador wvlan_cs. Actualmente el controlador wvlan_cs ha sido reemplazado
por el orinoco_cs.
Gran parte de las tarjetas con chipset Hermes poseen un conector de antena
superior a los MMCX de los chipset Prism o Aironet lo que hace que los problemas
de conexión antena/tarjeta sean casi nulos.
ORiNOCO® 11a/b/g ComboCard
ORiNOCO® 11a/b/g PCI Card
3.2.3 Chipset Atheros
Atheros WLAN chipsets destaca tecnologías de punta para ampliar la gama y
reducir el consumo de electricidad de redes inalámbricas 802.11. Cuando son
incorporados en dispositivos WLAN, los chipsets Atheros ofrecen a los usuarios
finales una amplia gama, una mayor duración de la pila, e instrumentos de
dirección de red que la ayudan a reducir el costo, funcionamiento y posesión de
redes inalámbricas.
81
3.3 EJEMPLO DE LA INSTALACIÓN DE UNA TARJETA
INALAMBRICA EN LINUX
Hardware
Tarjeta SMC2335W, EZ Connect 2.4Ghz/5Ghz Universal Wireless Cardbus
Adapter
Software
Módulo MadWifi para el núcleo Linux para la tarjeta con chipset Atheros
Situandote en el directorio /usr/src, crea un directorio para el módulo madwifi y
situate dentro de él:
$md madwifi
$cd madwifi
Para obtener el módulo de madwifi, como no hay en este momento una versión
publicada fuera del cvs, hay que utilizar este repositorio para obtener la versión en
curso, con el comando:
cvs -z3 -d:pserver:[email protected]:/cvsroot/madwifi co madwifi
Preparando los fuentes del núcleo antes de compilar madwifi. Para compilar un
módulo necesitas los ficheros de cabeceras del nucleo instalados en tu equipo.
Supón que tienes instalado el núcleo 2.4.25 para Intel Pentium II, III y superiores
en Debian del paquete que viene ya listo para instalar, verás que tienes instalado
el paquete:
kernel-image-2.4.25-1-686
Baja el paquete con las fuentes de esa versión del nucleo y descomprimelo:
$cd /usr/src
$apt-get install kernel-source-2.4.25
$tar jxvf kernel-source-2.4.25.tar.bz2
Además, deja el fichero de opciones de compilación con el que se esta trabajando
en el directorio del nucleo descomprimido, como si lo hubieras usado realmente
para compilar el nucleo... esto te deja este directorio del nucleo practicamente
igual que si hubieras hecho una compilación del nucleo (pero sin los ficheros
temporales y sin el resultado final de la compilación, claro):
82
cp /boot/config-2.4.25-1-686 /usr/src/kernel-image-2.4.25/.config
modificar /etc/kernel-pkg.conf e incluir en el "do_clean := No"
recompilar el nucleo: make-kpkg --revision=custom.1.0 kernel_image
Enlaza ahora el directorio donde está el nucleo con el directorio build del directorio
de modulos que están en uso en tu actual nucleo:
ln -s /usr/src/kernel-source-2.4.25 /lib/modules/2.4.25-1-586tsc/build
Compilando el módulo madwifi
Ponte en el directorio donde lo descomprimiste antes, y ejecuta make:
cd /usr/src/madwifi
make
make install
Ya está listo el módulo.
Asegurate de que está conectada la tarjeta (conectala y si usas pcmcia_cs verás
algo como lo siguiente en tu syslog):
May 14 00:32:10 gordon kernel: cs: cb_alloc(bus 1): vendor 0x168c, device
0x0012
May 14 00:32:10 gordon kernel: PCI: Enabling device 01:00.0 (0000 -> 0002)
May 14 00:32:10 gordon cardmgr [419] : socket 0: ?CardBus hotplug device
Ya que pcmcia_cs no conoce nada sobre tu tarjeta, no carga el modulo, así que lo
cargas a mano:
modprobe ath_pci
y el syslog reflejará algo como esto:
May 14 00:32:33 gordon kernel: ath_hal: 0.9.8.6
May 14 00:32:34 gordon kernel: wlan: 0.7.3.1 BETA
May 14 00:32:34 gordon kernel: ath_pci: 0.8.5.4 BETA
May 14 00:32:34 gordon kernel: ath_pci: cache line size not set; forcing 8
May 14 00:32:34 gordon kernel: Setup queue (0) for WME_AC_BK
May 14 00:32:34 gordon kernel: Setup queue (1) for WME_AC_BE
May 14 00:32:34 gordon kernel: Setup queue (2) for WME_AC_VI
May 14 00:32:34 gordon kernel: Setup queue (3) for WME_AC_VO
May 14 00:32:34 gordon kernel: ath0: mac 4.2 phy 3.0 5ghz radio 1.7 2ghz radio
2.3
83
May 14 00:32:34 gordon kernel: ath0: 11a rates: 6Mbps 9Mbps 12Mbps 18Mbps
24Mbps 36Mbps 48Mbps 54Mbps
May 14 00:32:34 gordon kernel: ath0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
May 14 00:32:34 gordon kernel: ath0: turbo rates: 6Mbps 9Mbps 12Mbps 18Mbps
24Mbps 36Mbps 48Mbps 54Mbps
May 14 00:32:34 gordon kernel: ath0: 802.11 address: 00:01:24:60:0d:6d
May 14 00:32:34 gordon kernel: ath0: Atheros 5211: mem=0x10400000, irq=11
Si quieres que el módulo se cargue siempre al arrancar (por simplificar, no podrás
quitar y poner la tarjeta como lo haces habitualmente con una pcmcia que si esté
contemplada por pcmcia_cs), añade este módulo en /etc/modules:
ath_pci
Configurar la interface ath0 (ojo, no eth con e, si no con a)
Manualmente:
iwconfig ath0 essid redlibre mode managed rate auto
pump -i ath0
(necesitas tener instalado pump, claro, para obtener una direccion ip
automaticamente de tu servidor dhcp), o bien:
ifconfig ath0 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255
En el fichero /etc/network/interfaces:
auto ath0
iface ath0 inet static
address 10.0.0.1
network 10.0.0.0
netmask 255.255.255.0
broadcast 10.0.0.255
#mode 3 para 802.11g, 2 para 802.11b y 1 para 802.11a
#mode no es necesario, la tarjeta chequea en buscando un ap por todos los
canales
#up /sbin/iwpriv ath0 mode 3
up /sbin/iwconfig ath0 essid "redlibre" mode managed rate auto
84
CAPITULO 4
MODIFICACIONES A UN DRIVER
PARA CALIDAD DE SERVICIO.
SWAN
(Stateless Wireless Ad hoc Networks)
85
4.1 Stateless Wireless Ad hoc Networks
4.1.1 Resumen
Los sistemas inalámbricos se han convertido en el segmento de mayor y
más rápido
crecimiento
en
las
telecomunicaciones,
donde
su
principal
consecuencia han sido dotar de movilidad a los nodos de la red al liberarlos de sus
conexiones físicas, además también están empezando a ofrecer múltiples
servicios con calidad (QoS) como una conversación telefónica, la transferencia de
ficheros, acceso a la web o la realización de videoconferencia, sin restricciones de
lugar y de tiempo. Estos ejemplos de comunicación inalámbrica espontánea entre
dispositivos se denomina redes Ad Hoc, permitiendo a los dispositivos establecer
la comunicación, en cualquier momento y en cualquier lugar. En realidad, la
formación de redes Ad Hoc como tal no es nueva, sino lo es nuevo es la forma de
configuración y uso de sus elementos [6]. Una aproximación para otorgar calidad
de servicio es la de diferenciar entre el conjunto de paquetes que circulan por la
red clasificando los paquetes en un número pequeño de tipos de servicios y utiliza
mecanismos de prioridad para proporcionar una calidad de servicio adecuada al
tráfico. Este estudio preliminar se realizo aplicando servicios diferenciados con el
modelo SWAN [1] en el entorno del simulador ns2. SWAN es un modelo de red
“sin estados”, el cual usa algoritmos de control distribuidos para entregar servicios
diferenciados en MANET de una manera escalable y robusta. Estos algoritmos
aplican controles basados en retroalimentaciones para soportar servicios de
tiempo real “soft” y servicios diferenciados en redes inalámbricas Ad Hoc. El
modelo usa el rate control (rc) para trafico UDP y TCP best effort, y un admission
control (ac) para trafico UDP de tiempo real. SWAN aplica la notificación explicita
de congestionamiento (ECN) para regular dinámicamente trafico de tiempo real
admitido. El novedoso aspecto de este modelo es que no requiere de QoS en la
capa MAC.
86
4.1.2 Introducción
Los sistemas inalámbricos han capturado la atención y la imaginación del publico,
y se han convertido en el segmento de mayor y más rápido crecimiento en las
telecomunicaciones, donde su principal consecuencia han sido dotar de movilidad a los
nodos de la red al liberarlos de sus conexiones físicas (cableado), dichos nodos pueden
funcionar de encaminadores y de anfitriones (Host).
Los sistemas inalámbricos también están empezando a ofrecer múltiples servicios con
calidad (Quality of Service –QoS-) como una conversación telefónica, la transferencia de
ficheros, acceso a la web o la realización de videoconferencia, sin restricciones de lugar y
de tiempo. Estos ejemplos de comunicación inalámbrica espontánea entre dispositivos o
nodos podría ser definido de manera informal como un esquema, al que a menudo se
denomina formación de redes Ad Hoc, que permite a los dispositivos establecer la
comunicación, en cualquier momento y en cualquier lugar. En realidad, la formación de
redes Ad Hoc como tal no es nueva, sino lo es nuevo es la forma de configuración, de uso
y de sus elementos. [6]
4.1.3 ¿Qué son las redes Ad Hoc?
Las redes Ad Hoc consisten en nodos móviles interconectados con enlaces
de comunicación inalámbricos multisaltos que a diferencia de las redes
inalámbricas convencionales, las redes Ad Hoc no tienen una infraestructura fija
de red o administración central, donde la topología de estas redes cambia
dinámicamente con nodos móviles entrando o saliendo de la red, y con
consecuencias de que algunos enlaces de comunicación llegan a ser inválidos [4],
por ello uno de los principales objetivos en este tipo de redes es encontrar una
trayectoria que tenga suficientes recursos para satisfacer las limitaciones del
retardo, ancho de banda, calidad de los datos multimedia (video, audio, etc) y/o
otras métricas [5] enviando paquetes hacia otros nodos y ejecutar las aplicaciones
del usuario, adicionalmente también todos los nodos pueden ser móviles
dinámicamente, creando una red inalámbrica auto-creciente, auto-organizada y
auto-administrada. [6] Por lo tanto, las comunicaciones en estas redes se crearían
únicamente por interacciones entre sus nodos móviles inalámbricos, usando esas
87
interacciones para proporcionar el control de flujo necesario y funciones de
administración, [4] pero siendo la comunicación degradada en alguno casos por la
movilidad de sus nodos. Es decir, los nodos pueden entrar y salir de áreas de
mayor interferencia, o alejarse repentinamente de una zona de cobertura de otro
nodo con el cual establecía una comunicación. Además, contrariamente a las
redes cableadas, el número de integrantes en una red de nodos móviles, puede
variar bastante dinámicamente, al punto de saturar dicha red.
4.1.4 Retos a superar en Ad Hoc.
De una forma resumida y no por orden de importancia, son numerosos los
retos que deben superarse para alcanzar los beneficios prácticos de las redes Ad
Hoc inalámbricas, tales como:
•
Encaminamiento efectivo (Throughput alto, perdida nula o baja de
paquetes, etc.)
•
Métodos de control de acceso al medio ( o canal)
•
Administración móvil
•
Seguridad
•
La calidad de servicio (QoS) de las aplicaciones multimedia, que es
afectada principalmente por el retardo y por la administración del disponible
ancho de banda, entre otros factores. [4]
•
Conseguir elementos / equipos con potencia extremadamente baja para
evitar tener que recargar frecuentemente la batería.
•
Dispositivos de poco peso debido a que son portátiles y deben poder
llevarse encima (wearable).
•
Conseguir bajos costos en el mercado
•
Resolver el problema de las interferencias.
88
•
Conseguir interoperabilidad entre los diferentes equipos que están
moviéndose dentro en la red, a través de un eficiente modelo y protocolo de
encaminamiento.
•
Creación de contenidos.
•
Los factores ambientales juegan un papel muy importante, no solo
limitando la distancia entre dos nodos, sino agregándole ruido, interferencia
y variedad de terrenos que obstruyen la señal. [6]
4.1.5 QoS en Redes Ad Hoc
El concepto de calidad de servicio (QoS) ha sido propuesto para evaluar las
prestaciones cuantitativas y cualitativas de un conjunto de requerimientos de
servicio que serán encontrados, otorgados y mantenidos por la red mientras
transporta un paquete desde el origen al destino, siendo una función de la red
satisfacer ese grupo de requerimientos en términos de retardo estático extremo a
extremo (end-to-end), disponibilidad de ancho de banda, probabilidad de pérdidas
de paquetes en una conexión.[3]. Por ejemplo en multimedia esto puede incluir
calidad de imágenes, o tiempo de respuesta, al hecho que una imagen fue
producida o fue una respuesta a un estimulo ocurrido. La QoS puede estar
delimitada por un conjunto de condiciones, las cuales pueden ser:
•
Link constraints: especifican la restricción en el uso de los enlaces, p.e.
tener ancho de banda disponible para cierta aplicación.
•
Path constraints: especifica los requerimientos QoS extremo a extremo en
una simple trayectoria.
•
Tree constraints: especifica los requerimientos para un árbol multicast. [8]
El costo de transporte y el rendimiento total de la red pueden ser incluidos como
parámetros. El costo generalmente se describe en términos monetarios por
proceso o en término de tiempo usado en un proceso. Es frecuentemente el caso
de que el costo será usado para poner los límites superiores e inferiores a las
89
otras características. El costo de un enlace también puede ser en función de la
utilización del buffer o ancho de banda. El costo total de una ruta (árbol) es el total
del costo de todos los enlaces en la trayectoria. La optimización del problema es
encontrar la trayectoria con menor costo entre todas las rutas factibles.
Obviamente que los recursos en la red de deben estar disponibles durante la
invocación del servicio para la garantía QoS. La primera tarea esencial es
encontrar una adecuada ruta a través de la red, entre el origen y el destino que
tendrá los recursos necesarios disponibles para encontrar las características de
QoS para el servicio deseado. La tarea de reservación recursos (pedir, identificar y
terminar) es el otro ingrediente indispensable de QoS. [4]
4.1.6 Características de los enlaces con QoS para esquemas de
tiempo real
Para tener tráfico en tiempo real como voz, video en vivo, debe mantenerse
bajo cierto límites el retardo total y la varianza del retardo, el cual se puede lograr
reduciendo hasta donde sea posible el número de saltos, o encaminadores
intermedios en el camino. Con cambios potencialmente impredecibles de topología
en una red Ad Hoc este objetivo es difícil de lograr.
Aunque existen aplicaciones en tiempo real “Blandas” (soft) presentan cierta
tolerancia en cuanto a que los mensajes lleguen después de su deadline.
Muchas de las aplicaciones multimedia están en esta categoría. Pero las
aplicaciones de Tiempo Real “Duras” (hard) permiten imponer cualquier restricción
para establecer la comunicación, pero una vez establecida no se permite que
ningún mensaje llegue después de su deadline y mucho menos que se pierda
mensajes. En esta categoría están las aplicaciones industriales por ejemplo que
controlan robots o sistemas de seguridad.
Una aproximación para otorgar calidad de servicio es diferenciar entre el conjunto
de paquetes que circulan por la red. Cuando se desarrolló el concepto de
conmutación de paquetes, se aplicó un servicio de mejor esfuerzo, el cual trata los
paquetes sin hacer ninguna diferenciación entre los diferentes tipos de flujos.
90
Todos los paquetes reciben la misma prioridad al momento de ser procesados por
el planificador de paquetes el cual se encarga de decidir cual paquete es el que va
a pasar primero al enlace. De esta manera, los paquetes son más sensibles a los
retardos.
Una manera de mejorar este esquema del mejor esfuerzo, es tratar a los paquetes
de manera diferente, tomando la decisión de cómo procesarlo dependiendo del
contenido del encabezado del paquete. Los campos que son de utilidad en el
encabezado para el manejo del paquete son los campos de dirección fuente y
destino, el puerto de origen y destino, tipo de servicio (ToS) y el protocolo. El
encaminador basándose en estos datos puede tomar una decisión de cómo
procesar el paquete. Sin embargo, cuando la cantidad de paquetes es muy grande
–varios cientos o miles de paquetes por segundo- esto puede repercutir en el
rendimiento del encaminador.
Si existen similitudes entre diferentes paquetes, es posible clasificar los paquetes
en grupos y tomar decisiones de cómo procesar los paquetes dependiendo del
grupo al que pertenezca un paquete. Este mecanismo se logra reservando ciertos
bits en el encabezado del paquete –de hecho el campo de tipo de servicio del
protocolo Ipv4 estaba reservado para este propósito- y definir en él, el tipo de
servicio que se le debe aplicar al paquete de acuerdo a las políticas que se hayan
especificado para ese propósito. [7]
4.1.7 Servicios diferenciados (DiffServ)
El modelo de Servicios Diferenciados se basa en tráfico sin reservación.
Este modelo clasifica los paquetes en un número pequeño de tipos de servicios y
utiliza mecanismos de prioridad para proporcionar una calidad de servicio
adecuada al tráfico. El objetivo principal de este mecanismo es asignar el ancho
de banda a diferentes usuarios en una forma controlada durante periodos de
congestión. Este mecanismo se aplica igualmente a aplicaciones tradicionales
basadas sobre TCP, tales como transferencia de archivos, accesos a bases de
datos o Servidores de Web, y nuevas clases de aplicaciones tales como audio o
video en tiempo real. [9] Los Servicios Diferenciados pueden proveer a los
91
usuarios, una expectativa predecible del servicio que las redes le proveerá en
tiempos de congestión, y permite que diferentes usuarios obtengan diferentes
niveles de servicio de la red. [3]
4.1.8 Modelo SWAN: Service Differentiation in Stateless Wireless Ad
Hoc Networks
El objetivo de este punto es realizar estudios preliminares aplicando
servicios diferenciados con el modelo SWAN [1] en el entorno del simulador ns2.
SWAN es un modelo de red “sin estados”, el cual usa algoritmos de control
distribuidos para entregar servicios diferenciados en MANET de una manera
escalable
y
robusta.
Estos
algoritmos
aplican
controles
basados
en
retroalimentaciones para soportar servicios de tiempo real “soft” y servicios
diferenciados en redes inalámbricas Ad Hoc. El modelo usa el rate control (rc)
para trafico UDP y TCP best effort, y un admission control (ac) para trafico UDP de
tiempo real. SWAN aplica la notificación explicita de congestionamiento (ECN)
para regular dinámicamente trafico de tiempo real admitido. El novedoso aspecto
de este modelo es que no requiere de QoS en la capa MAC. [2]
A continuación se presenta la configuración de la pc en la que fueron realizdas las
pruebas:
4.1.9 Hardware and Software requirement
•
Laptops/mini-laptops
At least Three Laptops: One for Server (source node), Intermediate node,
Client (destination node) with Intel Pentium or higher.
•
Wireless Adapter Card
For SWAN Admission Controller, D-Link Wireless Adapter Card (IEEE
802.11) is needed Wireless Adapter Card should be configured to AdHoc
mode. Linksys or Orinoco card may work as well.
For SWAN Rate Controller, Aironet Wireless Adapter Card (IEEE 802.11) is
needed.
92
•
Operating System
SWAN Project Testbed runs on Linux Kernel version 2.2.18. (RedHat Linux
7.3)
•
Complier
The SWAN Testbed is compiled by gcc compiler. Tcl/Tk 8.x is also needed.
•
Others
The libpcap package is needed. If /usr/include/pcap doesn't exist, you
should install it. (For download and installation, see 2.)
MpegTv is used
for streaming video at destination node for SWAN Admission Controller.
4.1.10
Metodología
El modelo se aplico en un entorno de simulación MANET con protocolo
AODV (Fig. 46), evaluando los parámetros de: Throughput, Retardo medio y
Paquetes perdidos.
El entorno de simulación considera los siguientes escenarios:
• Fuentes de video: 1 y 19 (Trafico de tiempo real)
• Fuentes de FTP: 1 y 19 (Trafico de tiempo no real)
• Área de simulación: 500x2500 mts.
• 100 nodos
• Tiempo de simulación de 100 seg.
• Tiempo de pausa de 20 seg.
• Movimiento Random Waypoint (RWP)
93
Fig. 46 Metodología del modelo aplicado
4.1.11
Resultados y conclusiones
a) 19 Fuentes de tiempo real (video) y 1 de tiempo no real (FTP)
Se observa que cuando esta activado el admission control (ac), el
throughput de tiempo real aumenta debido a que se le da prioridad, y por lo tanto
su retado medio y cantidad de paquetes perdidos disminuyen. Fig. 47
94
Fig. 47 Resultados obtenidos con el modulo admission control
95
Fig. 48 Resultados obtenidos con el modulo admission control
b) Fuente de tiempo real (video) y 19 de tiempo no real (FTP).
Se puede observar que aquí también al igual que el punto anterior, el aplicar la
diferenciación de servicio mejora o disminuye las prestaciones evaluadas con un
trafico
mayoritariamente
de
tiempo
no
real.
Fig.
49.
Fig. 49 resultados con un trafico mayoritariamente de tiempo real
96
Fig. 50 resultados con un tráfico mayoritariamente de tiempo real
97
CONCLUSIÓN
98
Con las WLANs la red, por sí misma, es móvil y elimina la necesidad de
usar cables y establece nuevas aplicaciones añadiendo flexibilidad a la red, y lo
más importante incrementa la productividad y eficiencia en las empresas donde
está instalada. Un usuario dentro de una red WLAN puede transmitir y recibir voz,
datos y vídeo dentro de edificios, entre edificios o campus universitarios e inclusive
sobre áreas metropolitanas a velocidades de 11 Mbit/s, o superiores.
Pero no solamente encuentran aplicación en las empresas, sino que su extensión
a ambientes públicos, en áreas metropolitanas, como medio de acceso a Internet
o para cubrir zonas de alta densidad de usuarios (hot spots) en las próximas redes
de tercera generación (3G) se ven como las aplicaciones de más interés durante
los próximos años Muchos de los fabricantes de ordenadores y equipos de
comunicaciones como son los PDAs (Personal Digital Assistants), módems,
terminales de punto de venta y otros dispositivos están introduciendo aplicaciones
soportadas en las comunicaciones inalámbricas.
Las nuevas posibilidades que ofrecen las WLANs son: permitir una fácil
incorporación de nuevos usuarios a la red, ofrecer una alternativa de bajo costo a
los sistemas cableados, además de la posibilidad para acceder a cualquier base
de datos o cualquier aplicación localizada dentro de la red.
Dentro del enorme horizonte de las comunicaciones inalámbricas y la computación
móvil, las redes inalámbricas van ganando adeptos como una tecnología madura y
robusta que permite resolver varios de los inconvenientes del uso del cable como
medio físico de enlace en las comunicaciones, muchas de ellas de vital
importancia en el trabajo cotidiano.
La tecnología WLAN es una tecnología madura perfectamente aplicable y
funcional hoy en día a un coste asequible pero haciendo especial hincapié, en que
si se decide implantar, se deben tomar medidas de seguridad.
Entre las medidas de seguridad que se deben tomar, las más básicas son una
correcta configuración de la red para impedir el acceso a la misma de usuarios no
autorizados y hacer que la información circule de forma cifrada. Los dos ámbitos
de aplicación son en la empresa como sustitución a las redes cableadas y en la
otra cara de la moneda está el surgimiento incipiente de las redes ciudadanas, que
se apoyan en esta tecnología y en el software libre.
99
Realizando una profunda comparación de la gama de redes inalámbricas con las
LANs
cableadas,
se
llega
a
la
conclusión
que
ambos
sistemas
de
telecomunicación no son en absoluto excluyentes sino complementarios, ya que
es el sistema inalámbrico el que funciona con el usuario final, pero este sistema se
basa en los sistemas alámbricos.
Con las redes inalámbricas se ofrece como gran prestación el ahorro del costoso
cableado del edificio. Como punto negativo se tiene que comentar el inconveniente
de transmitir por un medio que cuenta con interferencias y otros factores no
propicios, lo que dificulta poder alcanzar velocidades comparables con las de las
redes alámbricas.
En un futuro se puede prever la integración de las dos tecnologías, es decir la
tecnología alámbrica y la inalámbrica, de manera que se aplique la que mejor
resultado tenga en cada uno de los casos que se presenten.
Para redes inalámbricas móviles, las prestaciones de los protocolos de
encaminamiento son afectadas por muchos factores, como la tecnología
empleada, el comportamiento del nivel de enlace, movilidad, dispersión y
velocidad de los nodos, etc. Por otro lado el modelo SWAN tuvo buenas
prestaciones al tener baja tasa de paquetes perdidos, pero mostró un incremento
en el retardo medio y jitter debido a su naturaleza reactiva con tamaño de
paquetes de 512 bytes. Sus prestaciones se mantuvieron mas estables y
eficientes en los escenarios altamente dinámicos. También se observo que la
aplicación de servicios diferenciados en MANET, mejora las prestaciones del
trafico en tiempo real, teniendo una mejor calidad de servicio extremo – extremo.
Como resultados se espera que el lector de este trabajo haya sido capaz de
instalar el sistema operativo Linux, así como también, de instalar su tarjeta de red
inalámbrica para poder realizar sus pruebas y, basándose en los resultados aquí
mostrados, tener un punto de referencia con el que pueda comparar sus propios
datos.
Los resultados mostrados en el último capítulo esta basados en un experimento
mediante un simulador de redes y una configuración punto a punto (Ad Hoc), y se
espera que en el futuro se implementen algoritmos que provean de calidad de
servicio a las redes de tipo infraestructura con salida a internet, alcanzando, con
100
esto, evitar al máximo perdida de información y por lo tanto optimizar la
transmisión de datos.
101
BIBLIOGRAFIA
Instant Byte S.L., http://www.instantbyte.com , ejemplo de Linux, 20 de julio de
2007.
http://sopa.dis.ulpgc.es/ii-aso/portal_aso/practicas/modulo.htm, 28 de agosto de
2007.
http://es.wikipedia.org/wiki/Linux, 15 de marzo de 2007
[1] G-S. Ahn, T. Campbell, A. Veres and L. Sun, “Stateless Wireless Ad Hoc
Networks (SWAN)”. http://www.comet.columbia.edu/swan/draft-ahn-swan-manet00.txt. Columbia University, October 2002.
[2] G-S. Ahn, T. Campbell, A. Veres and L. Sun, “SWAN: Service Differentiation in
Stateless Wireless Ad Hoc Networks”, Proc. IEEE INFOCOM'2002, New York,
New York, 2002.
[3] S. Andreozzi, “DiffServ simulations using the Network Simulator: Requirements,
Issues and Solutions”, Master’s Thesis, University of Pisa, 2001
[4] S. Chakrabarti and A. Mishra, “QoS issues in Ad Hoc Wireless Networks”, IEEE
Communication Magazine, February 2001.
[5] S. Chen and K. Nahrstedt, “Distributed QoS routing with imprecise state
information”, In 7th Int. Conf. on Computer Communications and Networks (IC3N),
October 1998, Urbana ,IL
[6] M. Fording, P. Johansson and P. Larsson, “Wireless Ad Hoc Networking –The
Art of Networking without a network ”, Ericsson Review Num 4, 2000
[7] P. Pieda, J. Ethridge, M. Baines and F. Shallwani, “A Network Simulator
Differentiated Services Implementation”, Open IP, Nortel Networks, July 26, 2002.
[8] A .Qayyum, L. Viennot and A. Laouiti, “Multipoint relaying: An efficient
technique for flooding in mobile wireless networks”, 35th Annual Hawaii
International Conference on System Sciences (HICSS'2002).
[9] V. Rexhepi, G. Karagiannis and G. Heijenk, "A Framework for QoS and Mobility
in the Internet Next Generation”, EUNICE 2000 proceedings, September 2000.
Beck, M., et al.:”Linux Kernel Programming”. Tercera Edición. Addison Wesley,
2002.
102
Herbert, T.F.:”The Linux TCP/IP Stack: Networking for Embedded Systems”.
Charles River Media, 2004 (Capítulo 6)
103
Descargar