Está en la página 1de 535

Proqramacion de Socket Linux

Sean Walton

Traducci6n

Clave Informatica I+D. S.A.

lndice de contenido

Introducci6n x

PARTE I

Programaci6n de red desde la perspectiva del cliente

Capitulo 1. Recetarlo del diente de red 3

Un mundo conectado mediante sockets 7

Ccncralidades del direccionamiento TCP lIP 8

Escucha del servidor: el algoritmo basico del cliente 9

La Hamada del sistema socket procedimientos y advertencias 10

Realizaci6n de la Hamada: conexion al servidor 13

Obtencion de la respuesta del servidor 16

Cierre de la conexi6n ,........................................................... 20

Resumen: 2.que ocurre entre bastidores? ,............. 21

Capitulo 2. Elocuencia dellenguaje de red TCP/IP 23

Gcncralidades de la numeracion IP '" , 25

Identificaci6n de la computadora ,................ 25

Organizacion dcllD Internet .,.................................................................. 26

Mascaras de subredes ,.,.,.,., ,., ,',........ 29

Routers y resolucion de direcciones 29

Direcciones desaprovechadas y especiales ,........... 30

Numeros de pucrtos de host IF 32

Ordenaci6n de bytes de red , ,................................................. 34

Usa de herramientas de transforrnacion de Internet 35

Aplicacion de las hcrrarnientas y extension del cliente 37

Diferentes clases de sockaddr 41

Canales con nombre de UNIX 42

Resumen: aplicacion de herramicntas y nurneracion IP 43

Capitulo 3. Tipos de paquetes de Internet ,....................................... 45

El paquete de red fundamental ,.............................. 47

Campo version , , ,.,.,., ,.,.,.......... 50

Campo header_len ,., ,.,.,............ 50

Campo serve_type , .. , , ,........ 50

Campo to , ,................................ 51

Campo frag_offset y flags dont_hag y more_frags 51

Campo time_to_live (TTL) 52

Campo protocol 52

Campo options 53

Campo data 53

Analisis de varios paquetes 53

Cuestioncs relacionadas con los paquetes 54

Tipos de paquete 56

Como encajan los protocolos IP 67

C6mo escudrifrar la red can Tcpdump 67

Escritura de un escudrifiador de red a medida 69

Resumen: eleccion de los mejores paquetes para e] envio de mensajes . 70

Capitulo 4. Envio de mensajes entre peen; 71

(. Que son los sockets basados en la conexi6n? 73

Canales abiertos entre programas 73

Cornunicaciones fiables 74

Conexiones de protocolo inferior 76

Ejemplo: conexion al demonio HTTP 77

Protocolo HTTP simplificado 78

Obtencion de una pagina HTTP 78

~ Que son los sockets sin conexion? 80

Configurando la direcci6n del socket 80

Algunos programas s610 necesitan el mensaje 82

Transaction TCP (T ITCP): un TCP sin conexion .. 82

Envio de un mensaje directo H5

Asociacion del puerto al socket 86

Como enviar el mensaje 1'17

Como coger el mensaje HI'!

Garantia de Ilegada de un mensaje UDP 90

Como fortalecer la fiabilidad de UDP 91

Secuencia de los paquetes 92

Redundancia de paquete 92

Verificaci6n de [a integridad de los datos 92

Fallos imprevistos del flujo de datos 93

Tareas enrevesadas: una introducci6n ala multitarea 94

Resumen: modelos conectados frente a rnodelos sin conexi on

95

Capitulo 5. Explicaci6n del modelo de capas de red 97

Soluci6n del desafio de red '19

Cuestiones de hardware de red 99

Cuestiones de transmision de red 101

Interaccion de la red con el sistema operative 102

Interacci6n de la red can eI programa 103

Modele de red de interconexi6n de sistemas abiertos (OS1) 104

Capa 1: fisica 105

Capa 2: enlace de datos 106

Capa 3: red 107

Capa 4: transportc 107

Capa 5: sesion 108

Capa 6: presentacion 108

Capa 7: aplicacion 109

Paquete de protocolos de Internet 109

Capa 1: capa de acceso de red 109

Capa 2: capa de funcionarniento en Internet (IP) 110

Capa 2: extensiones de la gesti6n de mensajes de error-control

(TeMP) 111

Capa 3: de host a host (UDP) 111

Capa 3: flujos de host (TCP) 112

Capa 4: capa de aplicacion 113

Diferencias fundamentales entre OSI e IP 113

(Que da servicio a que? 114

Resumen: de la teoria ala practice 114

PARTED

La perspectiva del servidor y el control de carga

Capitulo 6. Generalidades sobre el servidor 119

Asignaci6n del socket el flujo de programa general del servidor 121

Un servidor de ceo sencillo 123

Asociar puertos a un socket 124

Creacion de una cola de espera de sockets.............. 126

Aceptar concxioncs de clicntes 127

Cornunicacion con el cliente 129

Reglas generales sobre la definicion de protocolos 131

(Que prog-rama habla primero? 131

(Que programa dirige la conversaci6n? 131

(Que nivel de certificacion necesita? 132

GQU€ tipos de datos utilizar? 132

GC6mo debe rnanejar los datos binaries? 132

(Como saber cuando se produce un interbloqueo? 133

lNcccsita sincronizacion horaria? 133

GComo y cuando reiniciar la conexi6n? 134

lCuando ha finalizado? 134

Un ejemplo extenso: un servidor de directorio HTIP 134

Resumen: los elementos basicos de un servidor 138

Capitulo 7. Divisi6n de Ia (arga: multitarea 139

Definici6n de rnultitarea: procesos irente a threads 141

Cuando se debe utilizar la multitarea 143

Caracterfsticas de la multitarea 144

Diferencias en las tareas 145

,C6mo creo un proceso? 146

,C(1mO creo un thread? ISO

La Hamada del sistema _clone(): la Hamada de los valientes 153

Comunicaci6n entre tareas 158

Venciendo al reloj: condiciones de carrera y exc1usiones mutuas

(mutex) 169

Condiciones de carrera 169

Exclusion rmitua (mutex) 171

Problemas de exclusion mutua de Pthread 173

Prevencion del interbloqueo 173

Control de hijos y eliminacion de procesos zombis 174

Preste mas atencion a los hijos: prioridad y planificacion 175

Entierro de los procesos zombis: limpieza tras la finalizacion 175

Ampliacion de los clientes y servidores actuales 178

Uamada de programas externos con el exec del servidor 178

Resumen: distribucion de la carga del proceso 182

Capitulo 8. C6mo decidir cuando esperar ElS 183

Bloqueo de la EjS: ,por que? 185

zCuando debo bloquear? 186

Alternativas al bloqueo de la E/S 187

Comparacion de las diferentes interacciones de programaci6n

de E/S ISH

Sondeo de la E/S 190

Un lector de sondeos 191

Escritor de sondeo 192

Sondeo de las conexiones 194

E/S asincrona 195

Lectura bajo demand a 198

Escrituras asincronas 199

Conexiones bajo demanda 201

Resoluci6n de bloqueos de la E/S no deseados con pollO y selectO 202

Implernentacion de los tiempos de espera 205

Resumen: elecci6n de las estrategias de E/S 207

Capitulo 9. C6mo romper las barreras del rendimiento 209

Creacion de servlets antes de la Uegada del cliente 211

Coloracion de un tope en el rurmero de conexiones cliente 211

Preduplicacion de sus servidores 214

Ajuste a diferentes niveles de carga 216

Ampliacion del control can un select inteligente 219

El asalto al planificador 219

Sobrecarga de selectO 220

Llegar a un compromise con un select intehgente 220

Problemas de implementacion 222

Redistribucion de la carga 223

Invcstigacion a fondo del control de sockets 225

Opciones generales 226

Opciones de socket espccificas de IP 228

Opciones de socket especificas de IPv6 229

Opciones de socket especificas de TCP 230

Recuperacion del descriptor de socket 231

Envio antes de 1a recepcion: mensajes entrelazados 232

Apunte sobre los problemas de E/S de archivos 233

Utilizaci6n de E/S sobre la base de la demanda para recuperar

tiempo de CPU 233

Aumento de la velocidad de sendO 234

Descarga de recvt) 234

Envio de mensajes de prioridad alta 235

Resumen: discusion de las caractensticas de rendimiento 238

Capitulo 10. Diseiio de Socket Linux robustos 239

Utilizacion de herramientas de conversion 241

Controle los valores de retorno 242

Captura de senales 244

SICTIPE......................................................................................................... 245

SICURG 246

SICCHLD 246

SJGl-IUP 247

SIGIO............................................................................................................. 248

SIGALARM 248

Adrninistracion de recursos 248

Adrninistracion de archives 249

La pila de la memoria 249

Memoria de datos estaticos 251

CPU, memoria compartida, y procesos 251

Scrvidores criticos 251

L QU!~ se califica como un servidor eritico? 252

Interrupciones y eventos de comunicacion 253

Cuestiones sobre la recuperacion de la sesion 254

Tecnicas de recuperacion de la sesion 255

Cuestiones sabre la concurrencia cliente-servidor 256

Interbloqueo de la red 257

lnanicion de la red 258

Ataques de denegaci6n de servicio 258

Resumen: servidores s6lidos como una TOea 259

PARTE III

Examen objetivo de los sockets

Capitulo 11. C6mo ahorrar tiempo con objetos 263

La evolucion de la ingenierfa del software 265

Programacion funcional paso a paso 266

Como ocultar detalles de implementacion can la programacion

modular 267

Los detalles no son necesarios: programaci6n abstracta 268

Como conseguir un pensamiento mas natural mediante la

programacion orientada a objetos 268

Como llegar ala prograrnacion Nirvana 269

Reusabilidad del trabajo 269

Consolidacion de la reusabilidad can la reubicabilidad

(pluggability) 270

Presentacion de los fundamentos de los objetos 271

Encapsulacion de la irnplementacion 272

Herencia de metodos 273

Abstraccion de datos 274

Polimorfismo de metodos 275

Caracteristicas de los objetos 275

La clase 0 el objeto 275

Atributos 276

Propiedades 276

Metodos 277

Derechos de acceso 277

Relaciones 277

Extension de los objetos 278

Plantillas 278

Persistencia 278

Generaci6n de flujos 279

Sobrecarga 279

Interfaces 279

Eventos y excepciones 280

Formatos especiales 280

Registro-Estructura 280

Colecci6n de funciones 281

Soporte dellenguaje 282

Soporte activado frente a soporte orientado 282

C6mo incluir objetos en los lenguajes no orientados a objetos 283

Resumen: mentalidad orientada a objetos 285

Capitulo 12. Uso de Ia API de red de Java 287

Exploraci6n de diferentes sockets Java 289

Programacion de clientes y servidores 290

lmplementacion de mensajeros 294

Envio a multiples destinos 296

Conexion a traves de E/5 298

Clasificaci6n de las clases de E/S 298

Conversion entre clases de E/S 300

Configuracion del socket Java 301

Configuraciones compartidas par sockets Java........ 301

Configuraciones Java especfficas de la multidifusion 302

Multitarea de los programas 302

Usa de threads en una clase 303

Como afiadir threads a una clase 304

Sincronizaci6n de metodos 305

Limitaciones de la implementaci6n 306

Resumen: programaci6n de redes de tipo Java 307

Capitulo 13. Disefio y U&O de una estructura de socket en C++ 309

GPor que utilizar C++ para la programaci6n basada en sockets? 311

C6mo simplificar la conexion con los sockets 311

Como ocultar los detalles de implcmentacion 312

Implantacion de componentes reutilizables que faciliten

cl uso de las interfaces 312

Dernostracion de los procesos del disefio del marco de trabajo 313

Disposicion del marco de trabajo 313

Definicion de las caracteristicas generales 314

Agrupamiento en componentes principales 315

Creacion de Ia jerarquia del marco de trabajo 318

Definicion de las capacidades de cada clase 320

Prueba del marco de trabajo basado en sockets 325

El dicnte/servidor de eeo 325

Multitarea de igual a igual 328

Limitaciones de implementaci6n 329

Envio de mensajes desconocidos 0 indefinidns 329

lncorporacion de la multitarea 330

Resumen: un marco de trabajo basado en sockets de C++

simplifica la programaci6n 330

Capitulo 14. Limitaclones de los objetos 333

Recordatorio sabre objetos 335

Comience con buen pie 335

Un mezclador no es un objeto 337

Separacion entre analisis y disefio 337

El nivel de detalle apropiado 338

La explosion de la herencia . .,.................................................................... 33t}

Reutilizaci6n-Desaprovecharniento 339

Uso correcto de la directiva friend de C++ 340

El operador sobrecargado 340

Los objetos no 10 resuelven todo .. 341

Las novedades llegan yevolucionan 341

Infeccion de la hcrencia 341

Codigo inalcanzable 341

Complejidad dar y tornar 343

Simplificacion de programas can interfaces establecidas 344

EI enigma de la herencia multiple 344

Incremento del tarnafio del codigo 345

El dilema de la administracion de proyectos 346

Obtencion del personal apropiado en el momenta oportuno 346

Fenomeno WISCY ("Whisky") 347

Prueba de (des-rintegracion 348

Resumen: tenga euidado con las pendientes 349

PARTE IV

Sockets avanzados: mas prestaciones

Capitulo 15. Encapsulado de red con Uamadas de procedimiento

remoto (RCP) 353

Repaso del modele OSI 355

Comparaci6n de programacion de red y proeedimental 356

Lirnitaciones del lenguaje 356

Mantenirniento de sesiones conectadas 358

Suministro de metodos middlewnre 360

Stubbing en las llarnadas de red 360

Adicion de la implcrnentacion de llamadas de scrvicio 361

Implementacion del nivel de presentacion 362

Creacion de RPC con rpcgen 363

Lenguaje de interfaces de rpcgcn 363

Creacion de Ilarnadas con estado con conexiones abiertas 369

Diagnosis del problema del estado 369

Reeuerde donde esta 370

Seguimiento de una ruta especifica 370

Reeuperaci6n desde un estado erroneo 370

Resumen: creacion de una caja de herramientas para RPC 371

Capitulo 16. C6mo anadir seguridad a los programas de red y SSL 373

Asignaci6n de permisos para trabajar 375

Niveles de identificacion 375

Formas de intercambio ,' , , ,.,.,.,.,.,. 376

El problema de Internet ' , , '., ,.,.,.,.,., '.,.,. 377

Todo esta visible '.,., , ,.,., '.,.,.,.,.,.,., ,.,.,.,.,... 377

Forrnas de ataquel intrusion ,.,.,.,.,.,.,., ,.,.,.,.,.,............. 378

Pirateo del TCP lIP '.,.,.,.,.,.,.,.,., '.,., ,., 379

Como garantizar la seguridad en un nodo de red ,.,.,.,., ,.............. 379

Acceso restringido '.,.,.,.,.,.,.,.,., ,.,.,.,.,.,., ,...... 380

Firewalls '.,.,.,.,.,.,.,.,., ,.,.,.,.,.,.,.,., , , ,...... 380

Zonas desmilitarizadas (DMZ) , ,. 381

Como garantizar la seguridad del canal ,.,..... 384

Cifrado de mensajes '.,.,.,.,.,.,.,., , ,.,.,.,.,.,.,., ,.,.,.,. 386

LCuales son los tipos de cifrado disponibles? .... ,................................... 386

Algoritmos de cifrado publicos ,........................................... 387

Problemas can el cifrado .,.,., ,., , ,.,., ,., , ,., 387

Scguridad a nivel de sockets (SSL) , , ' ,................ 388

Usa de OpenSSL '.,.,.,.,.,.,.,.,., '.,.,.,.,.,.,.,., ,.,.,.... 388

Creacion de un cliente SSL , , ,......... 389

Creacion de un servidor SSL , , ,., , ,............... 391

Resumen: el servidor seguro ,............................................................. 393

Capitulo 17. C6mo compartir mensajes con multidifusi6n, difusi6n

y Mbone ' ,., , ,...... 395

Difusion de mensajes a un dominio 397

Repaso de la estructura IP '........................................................ 3Y7

Programaci6n para activar la difusi6n , ,.,.,.,. 398

Limitaciones de la difusion , , ,.,.,............. 399

Multidifusion de mensajes a un grupo 400

Union a grupas de multidifusion 400

Envio de mcnsajes de multidifusi6n ,.,.,.,., 403

Como la red proporciana Ia multidifusion ,.,.,., ,............ 403

Salida del mensaje de multidifusion , 404

Limitaciones de la multidifusion ,........ 406

Resumen: comparticion eficientc de los mensajes 407

Capitulo 18. La polencia de los sockets raw................................... 409

.:.Cuando se deben usar sockets raw? 411

Explicacion de ICMP 411

Como controlar la cabecera IP "....................................................... 411

Aceleracion a traves de la red fisica 412

LCuales son las limitaciones? 412

Como poner los sockets raw a funcionar 413

Seleeci6n del protoeolo correcto , 413

Creacion de un paquete ICMP ,............................................. 413

Como calcular una suma de cornprobacion 414

Como controlar la cabecera IP 415

Trafico de terceros 415

(Como opera ping? 4111

El receptor MyPing 416

EI ernisor MyPing 417

zC6mo opera traceroute? 418

Resumen: toma de decisiones raw......................... 420

Capitulo 19. 1Pv6: la proxima generaci6n de IP 421

Problemas actualcs de direccionarniento 423

Rcsolucion de la reduccion del espacio de direcciones TPv4 423

lA que se parece lP,r6? 424

lCt1mO funcionan juntos IPv4 e IPv6? 425

Como poner a prueba IPVh 426

Configuracion del nucleo 4211

Configuraci6n de las hcrrarnientas 426

Transformacion de las llarnadas JPv4 a IPv6 427

Transforrnacion de sockets rawa IPv6 42K

Transformacion de sockets ICMPv6 a IPv6 430

El nuevo protocolo multidifusion 430

Pros y contras de lPv6 432

Incorporacion esperada de Linux 433

Resumen: traslado del codigo hacia el futuro 433

PARTE V Apendices

Apendice A. Tablas de dato8.............................................................................. 437

Dominies: primer paramctro de socketO 438

Tipos: segundo pararnetro de sockctO . 446

Dcfiniciones de protocolo 446

Asignaciones estandar de puertos de Internet (100 prim eros

puertos) 447

C6digos de estado HITP 1.1 44H

Opciones de socket (get/setsockoptO) 450

Definiciones de sefiales 455

C6digos ICMP 457

Asignacion de rnultidifusion JPv4 458

Asignaci6n de direcciones IPv6 propuesta .. 459

C6digos lCMPv6 460

Campo de ambito de multidifusion IPv6 "..................................... 460

Campo flag de multidifusion IPv6 "............................ 461

Apendice B. API de red 463

Conexi6n a la red 465

Comunicaci6n por un canal 472

Terminaci6n de conexi ones 483

Convcrsiones de datos de red 484

Herrarnientas de direccionarniento de red 489

Controles de socket 493

Apendice c. Subconjunto API del nucleo 497

Tarcas 499

Threads 507

Bloqueo 511

Scfiales 514

Archivos y otros 518

Apendice D. Oases de objetos 531

Excepciones de C++......................................................................................... 533

Exception (Superclase) 533

NetException (Clase) 533

Clases de soporte C++ 534

SimpleString (Clase) 534

HostAddress (Clase) 534

Clascs de mensajeria C++ 535

Message (Clase abstracta) 535

TextMessage (Clase) 536

Clases de sockets C++ 536

Socket (Superclase) 537

SocketStrearn (Clasc) 53H

SockctScrver (Clase) 538

SocketClient (Claso) 53Y

Datagram (Clase) 539

Broadcast (Clase) 540

MessageGroup (Clase) 540

Excepciones de Java 541

java.io.Krbxception (Clase) 541

java.net.SocketException (Clase) 541

Clases de soporte Java 542

java.netDatagramPacket (Clase) 542

java.net.InetAddress (Clase) 543

Clases Java de E/S 543

java.ioJnputStream (Abstract Class) 544

java.io.ByteArraylnputStream (Clase) 544

java.io.Objectlnputbtream (Clase) 545

java.io.OutputStream (Clase abstracta) 546

java.io.ByteArrayOutputStrearn (Clase) 546

java.io.ObjectOutputStrearn (Crase) 547

java.io.BufferedReader (Clase) ,...... 548

java.io.PrintWriter (Clase) 548

Clases de sockets Java 550

ja va . net-Socket (Clase) 550

java.net.ServerSocket (Clase) 551

java.net.DatagrarnSocket (Clase) 552

java.net.Multicastfiocket (Clase) 553

in dice aIfabetico 555

Acerca del autor

Sean Walton obtuvo su titulacion en Ciencias de la computacion en 1990 en la Brigham Young University, en la especialidad de teoria de la multitarea y fusiones de lenguajes. En 1988 fue contratado par el departamento de ciencias de la computacion de la BYU como ayudante para el desarrollo de teorias y metodos para la administraci6n de procesos transputer, migraci6n y comunicacion, Comenzo a trabajar con sockets BSD cuando trabaj6 como administrador en el departamento de ciencias de la computaci6n. Durante su trabajo en Hewlett-Packard, desarroll6 el metodo de deteccion automatica de lenguaje (entre PostScript y PCU, que implementan hoy dia las impresoras LaserJet 4 y superiores. Asimismo, desarrollo un sistema operativo de micro en tiempo real para el microcontrolador 8052 que permite emular motores de impresion.

Sean posee afios de experiencia profesional en varios tipos de programaci6n y administracion UNIX, incluido Linux, HPUX, Ultrix, SunOS y System V. Como consccucncia de su trabajo en diferentes sistemas, ha centrado su atenci6n en estilos de programacion independientcs del sistema, que permiten una facil portabilidad.

En los ultimos afios, Sean ha trabajado como asistente profesional, autor-disenador de cursos, y profesor de conceptos basicos de computadoras, obtenci6n de requisites, OOAjD, Java y C++. A principios de 1998 comenz6 a trabajar con sockets Java, integrando esta informacion en su curso de Java. Sus servicios como profesor estan muy solicitados, Durante su trabajo en el equipo Nationwide Financial Process Improvement, definio los procesos de analisis y disefio para integrar los nuevos desarrollos con los estandares existentes. Ha dirigido y disefiado el producto Nationwide Insurance Authentication, que induye politicas y autenticacion divididas,

Dedicatoria

Al dador de todo bien y principe de hi pa; perfecto,

Agradecimientos

Soy consciente de que este libra no habria sido posible sin la colaboraci6n esencial de varias personas. En primer lugar, ami amada esposa, Susan, que me ha animado constantemente, dandome todo el tiempo que he necesitado para llevar a termino este proyecto. En segundo lugar a Wendel, mi padre, que me ensefio la importancia de una buena organizacion y presentacion. En tercer lugar, al movimiento Linux que, de forma desinteresada, me ha proporcionado un sistema operativo efectivo y fiable sobre el que pader trabajar. En cuarto lugar, a Beverly Scherf,

quien me abrio los ojos y me mostr6 una forma efectiva de comunicarme. Par ultimo, no fui consciente de 10 importantc que era cste trabajo para m! profcsionalmcntc hasta recibir eI entusiasmo y el apoyo de mis amigos Charles Knutson y Mike Holstein.

Introduccion

Expansion del desafio en la proqrarnacion

La mayoria de los objetivos en programaci6n tiene que ver de forma inmediata con funciones 0 tareas (lue se llevan a cabo en una computadora de sobremesa 0 un portatil, En contadas ocasiones, estas tareas involucran la comunicaci6n con algo mas que un raton, un teclado, un monitor y un sistema de archives. Un paso mas alla en la programaci6n nos llevaria a considerar programas en varios equipos conectados a traves de un canal de red. La programacion en red constituye una expansion de este concepto, ya que se precisa coordinar tarcas y enviar asignaciones.

La unidad fundamental de toda la programacion de red en Linux (yen Ia mayoria de los sistemas operatives) es el socket. De la misma forma ljue la E/S de archivos permite la conexion con el sistema de archives. el socket permite cstablecer conexion con Iii red. EI sockct es un medio que el programa utiliza para direccionar, enviar y recibir mcnsajes,

La programacion de socket 0 de red va mas alia que la programaci6n de tareas individuales 0 incluso de multitarea, debido a la mayor potencia y olomontos introducidos por el multiprocesamiento. La potencia es algo obvio: Parallel Virtual Machines (PMV), 0 maquinas virtuales en paralelo, como Beowolf pueden llevar a cabo un volumcn d e procesamiento mucho mayor mediante la organizacion de bloques de tareas y la distribucion de estas entre las cornputadoras de la red. Los temas a dilucidar aqui ticnen que ver con la consecucion de un rcndimiento optimo, la coordinacion de las transferencias y la adrninistracion de E/S.

En este libro se describen y se ofrecen varias soluciones para dar respuesta a estes temas. Esta pcnsado para dar respuesta a las necesidades primarias y a medio plazo del prograrnadur de red profesiona!.

Orqanizacion dellibro

Este libra entra en rnuchos aspectos particulates de Ia programaci6n en red. Esta organizado en cinco parte, cada una de las cuales sc basa en el contenido de la parte anterior:

• Parte I: Programaci6n de red desde la perspectiva del cliente.

En esta parte se introducen los sockets y se definen los terminos basicos. Se describen los distintos tipos de sockets, los esquemas de direcci6n y la teoria de redes.

• Parte II: La perspectiva del servidor y el control de carga.

La Parte II amplia la programaci6n de socket can servidores, tecnicas de multitarea, control E/S y opciones de socket.

• Parte Ill: Examen objetivo de los sockets.

C no es el unico lenguaje de prograrnacion que proporciona acceso a sockets. En esta parte se presentan algunas tecnicas orientadas a objetos y se describer. las ventajas y limitaciones de la tecnologia de objetos, en general.

• Parte IV: Sockets avanzados: mas prestaciones

En esta parte se presentan una gran cantidad de tecnicas de prograrnacion de redes avanzadas, que incluyen la seguridad, la difusion y la multidifusion, IPv6 y sockets fa w.

• Parte V: Apendices.

Los apendices vienen a consolidar muchos de los recursos que son de irnportancia para los sockets. EI primer apendice incluye tablas y Iistados que son dernasiado largos para incluirlos en los capitulos. EI segundo y tercer apendices describen las API Socket y Kernel.

EI sitio web que sieve de apoyo allibro y que contiene todo el cooigo fuente de los ejemplos induidos en el mismo, 10 puede obtener de nuestra pagina Web (www.pearsoneducacion.corn), en el "Area de descarga" de la seccion "Informatica".

Puede obtener mas informacion de [a propia pagina web del autor, www.linuxsocket.org,

Estilos del lector profesional

Este !ibro esta pensado para el profesional de la programacion. Normalmente, el profesional necesita alguna de estas tres cosas: aprender una tecnologia nueva, solucionar un problema concreto, ° buscar algun ejemplo 0 definicion. Los capitulos y apendices intentan responder a cada uno de estos criterios,

• Lectura lineal de principia a fin. Esta opcion es la idonea cuando se desea aprender terna a tema. en sucesion, Cad a apartado del capitulo se basa en el eontenido de capitulos precedentes. EI texto esta organizado en terminos de complejidad ereciente. La prograrnacion de sockets puede resultar bastante intuitiva al principio. Sin embargo, al avanzar en este tema van surgiendo cuestiones relativas a la ternporalizacion, excepeiones, rendimiento, etc, que pueden echar por tierra eI mejor de los disefios. La lectura lineal facilita la compresi6n ordenada de los conceptos necesarios para realizar las tareas como es debido.

• Hojear, Hojeando el libro se puede obtener la informacion necesaria sin entrar en muchos detalles. Se supone que el profesional conoce bien el tema y desea ir directamente al punto de interes, De forma parecida a navegar por la Web, el hojeador va pasando de unos temas a otros hasta que localiza exactamente la informacion que anda buscando.

• Consulta. El expcrto suele necesitar informacion (tablas, fragmentos de programa, API concretas) rapidamcnte. La informacion ha de ser en este caso 10 mas sucinta posible y facil de localizar.

EI libra contiene toda la informacion fundamental necesaria para abordar las tareas mas habituales en este terreno. Adernas, hay muchos capitulos en los que existcn porciones de texto apartadas del contenido normal del tema. Estos fragmentos contiene informacion adicional, detalles, notas para expertos y opiniones.

La audiencia y la interacci6n esperada

EI libra contiene muchos ejemplos de c6digo (1ue ilustran los temas tratados, Lea los apartados y pruebe los programas. Para ello necesitara conocer como llevar a cabo 10 siguiente:

1. Crear un archivo fuente C 0 Java (en eualquier editor).

2. Compilarlo usando un cornpilador C 0 Java.

3. Ejecutar el programa.

Algunos ejemplos requieren, adernas, modifiear el nucleo (difusion 0 multidifusion). La mayoria de las distribuciones de Linux instalan y ejeeutan la red aungue no exista una conexi6n fisiea a la misma. Para poder ejecutar lodos los programas que aparecen en el libro necesita:

• Programas y compilar c6digo C, C++ Y Java.

• Tener todos los compiladores instalados.

• Saber configurar el nucleo para redes, difusion y multidifusion,

• Com pilar e instalar el rnicleo nuevo.

Reservas y limitaciones

Aunque todos los programas que figuran en el texto han sido probados, es posible que alguno no funcione tal cual se presenta aqui, dcbido a que la eonfiguraci6n del sistema cambia con el ticrnpo. En la mayoria de los cases. si algo no funciona, se debe a que ha cambiado la distribucion.

Adernas, hay expertos que han verificado los programa5 en otros sistemas operativos UNIX. Esto puede representar una ironia con respecto a la maxima de portabilidad. Sin embargo, 5i existe una diserepancia entre Linux y otras implementaciones, en el libro se incluyen siempre los listados para Linux (y se incluye,

adernas, una nota descriptive de estc heche). El libro esta centrado principal mente en Linux.

Por ultimo, el libro no trata de otros sistemas operatives (Microsoft Windows 0 Macintosh). Algunos capitulos ponen de manifiesto algunas comparaciones, pero todos los algoritrnos soportan Linux/UNIX.

Convenios usados en el libro

A 10 largo dellibro se han utilizado los siguientes convenios tipograficos:

• Las Iineas de c6digo, comandos, instrucciones, variables y cualquier texto que sc ha de teclear 0 que aparece en pantalla, se muestra en un tipo de letra de espacio fijo 0 sin adorn os. EI tipo de letra sin adornos sc utiliza tambien para indicar las entradas del usuario.

• Los marcadores de posicion en las descripciones sintacticas aparecen en un tipo de letra sin adornos y cursive. Ha de recmplazar los marcadores de posicion por nornbres de archivo, parametros 0 el e1emento que estes representen.

• Se ha usado el atributo de cursiv<1 para resaltar terminos tecnicos cuando estes son definidos.

• EI icono ._ delante de una linea de c6digo reprcsenta la continuacion de la linea previa. A veces una linea de c6digo es demasiado larga para caber en una linea de texto en la pagina. Si ve este sirnbolo delantc de una linea de codigo, recuerde que forma parte de la linea anterior.

• EI texto induye tarnbien referencias a documentos relatives a estandares de Internet, denominados Request For Comment (RFC). Estas citas aparecen entre corchetes, con el numero RFC correspondiente, como [RFC875].

Proqramacion de red desde la perspectiva del cliente

En esta pa rte

1 Recetario del ciiente de red 3

2 Elocuencia dcl lenguaje de red Tel' /11' 23

3 Tipos de paquetes de Internet 45

4 Envfo de rnensajes entre pecrs 71

5 Explicacion del modele de capas de red 97

Parte I

Capitulo I

Recetario del cliente de red

En este capitulo

Un mundo concctado mediante sockets 7 Generalidades del direccionarniento rcr / IP 8 Eseueha del servidor: el algoritmo basico del cliente 9 Resumen: lque ocurre entre bastidores? 21

iEsa maidita beteria RAM CMOS! Bien, .;que bore es? No se ve el reloi, llemare a ia informacion horerie. 1-614-281-8211. Ring. " ... son las ocho y veiniitres y cuarenta segundos". Clic. [Humm! ,::a.m. 0 p.m.? ,::Esperan ellos que 10 mire afuera?

La computadora que utiliza probablemente se cncuentra conectada a algun tipo de red. Podria ser una Intranet corporative completa con fire walls dentro de Internet; n quiza un par de computadoras que conecta en su tiempo libre. La red conecta estaciones de trabajo, servidores, impresoras, arrays de discos, faxes, modems, etc. Y cada conexion de Ted utiliza 0 suministra un servicio, Algunos servicios ofrecen informacion sin ninguna interaccion. Igual que en una Hamada a la informacion horaria, un cliente de red basico se conecta con un servidor y 10 escueha.

(Que tipos de servicios ofrccen los servidores? Muchos, Todos los servicios se ajustan a euatro categorias de recursos: comun, restringida 0 valiosa, com partida y delegada. He aqui algunos ejemplos de cada una:

Comun Restringida Compartida Delegada

Espada de disco (norrnalmentc respaldado), Impresoras, moderns, arrays de discos.

Bases de datos, control de proyectos. documentaci6n. Programas remotos, consultas distribuidas.

En este capitulo sc describe el codigo de un cliente basico que se conecta a un servidor. Estc proceso ayuda a en tender todo 10 que envuelve a la eseritura de programas de red. EI diente inicialmente se conecta al scrvicio de informacion horaria del servidor (0 a cualquier otro servicio que no ncccsite entrada de datos al inicio). Junto con el procedimicnto, en este capitulo sc explican las diferentes llarnadas, sus parametros y errorcs mas cornunes.

EI programa cliente necesita una interfaz para cnviar-recibir y una direccion para conectarse al servidor. Los clientes y los servidores necesitan utilizer sockets pard conectarse y cnviar mcnsajes independientemente de la situacion. Considcrc el ejemplo telcfonico otra vez: el auricular tiene dos partes, un microfono (transmision) y un altavoz (recepcion), Los sockets tienen tarnbicn estos dos canales. Adicionalrnente, el ruimero tclcfonico es en eseneia la direccion unica para el telefono.

De igual modo, el socket bene dos partes 0 canales: uno para la escucha y otro para cl envio (como el modo de lectura-escritura para un archivo de E/S). EI clientc (0 la llamada) se conecta con el servidor (0 contcstador) para comcnzar una convcrsacion de red. Cada host ofrccc varios servicios estandar (vease letdservices en el sistema de archives). como ('1 nurnero telefonico de informacion horaria correcta,

" ",". "

EJECUCI6N DE LOS EJEMPLOS DEL LlBRO

Se pueden ejeeutar la mayor parte de los ejemplos dellibro sin ester conectado a la red, si se tiene habilitada la red en el nucleo y el demonio servidor de red, inetd, esta ejecutandose, De hecho, muchos ejemplos utilizan la direcci6n local (0 loopback) de 127.0.0.1. Si no se tienen los controladores de red configurados y funcionando, la mayoria de las distribueiones Linux incluyen como minimo todo 10 que se necesita para el funcionamiento en red delloopback.

EI programa cliente debe seguir varios pasos para comunicarse con un equipo homologo 0 servidor, Estos pasos tienen que seguir una secuencia particu lar. Por supuesto, se puede preguntar: "(por que no se reernplazan todos estos pasos can menos llarnadas?" En rnedio de cada paso, el programa puede seleccionar de muchas opciones. No obstante, algunos pasos son opcionales. Si el cliente amite algunos pasos, normalmente 121 sistema operative rellena esas opciones con los valores predeterrninados.

Puede seguir algunos de estos pasos basicos para crear un socket, configurar el host de destino, establecer el canal a otro programa de red y cerrarlo. La Figura 1.1 muestra graficamente los pasos que el cliente toma para conectarse a un servidor.

Cliente

FIGURA 1.1

(ada cliente lnteractua con el sistema operativo realizando varias lIamadas en sucesi6n.

En la siguiente Iista sc describe cada paso:

1. Crear un socket. Se selecciona de diversos dominies de red (por ejemplo, Internet) y clases de socket (como flujo).

2. Configurar las opciones del socket (opcional). Se dispone de muchas opciones que afectan al comportamiento del socket. Una vez abierto el socket, el programa puede cambiar estas opciones en cualquier memento. (Para obte-

ner mas detalle vease el Capitulo 9, "Como romper las barreras del rendimiento'")

3. Asociar con una direccion-pucrto (opcional), Se aceptan conexiones de todos o de una sola direcci6n IF, y se establece un puerto de servicio, Si se omite, cl sistema operativo asume cualquier direccion IP y asigna un numero de puerto aleatorio. (En el Capitulo 2, "Elocuencia del lenguaje de red TCP! jp", se tratan las direcciones y puertos en mayor detalle.)

4. Conectar a un equipo nomologo-servidor (opcional). Se extiende y establece un canal bidireccional entre el programa local y otro programa de red. Si se omite, el programa utiliza una cornunicacion dirigida 0 sin conexi6n.

5. Cerrar la conexion parcialmente (opcional), Se restringe el canal de envio 0 de recepcion, Se puede utilizar este paso despues de la duplicacion del canal.

6. Enviar-recibir mensajes (opcional), Una raz6n para prescindir de cualquier E!S podria incluir comprobacion de disponibilidad de host.

7. Cerrar la conexion, Por supuesto este paso es importante: si los programas no cierran las conexiones terminadas, los programas que consumen bastante tiempo de CPU pueden ago tar casualmente los descriptorcs de archivo,

En los siguientes apartados se describen algunos de estos pasos, definiendo las llamadas del sistema y suministrando ejemplos,

Un mundo conectado mediante sockets

Hace varios afios, el funcionamiento en red implicaba a una linea serie dedicada de una computadora a otra, Ninguna otra computadora podia compartir el mismo circuito, y UNIX utilize UUCP (copia de UNIX a UNIX) para mover archivos entre sistemas. Como la tecnologia de transmision en la linea mejoro, se hizo posible el concepto de comparticion de la linea de transmision. Esto implicaba que cad a computadora necesitaba idcntificarse de forma unica y habia que realizar turnos en la transmision, Existen varios metodos diferentes para compartir la red en el tiernpo, y muchos de ellos funcionan bastante bien. A veces, las computadoras transmiten simultaneamente, causando una colision de paquete.

EI hardware y los controladores de bajo nivel gestionan las cuestiones de colisiones y retransmisiones, ahora un objeto de programaci6n del pasado. Esto libera al disefio de fijar su atencion en la transmision y recepcion de mensajes, La API de Socket (Interfaz de programacion de la aplicacion) suministra a los disefiadores el medio para recibir 0 cnviar mensajes.

La prograrnacion de sockets se diferencia de la aplicacion 0 herramienta de trabajo normal, en que trabajamos con programas y sistemas que funcionan concurrentemente. Esto implica que necesita conocer la sincronizacion. temporizaci6n y administracion de recursos,

Los sockets enlazan tareas asincronas con un unico canal bidireccional. Esto podria conducir a problemas como el interbloqueo y la inanicion, Con conocimiento

y planificacion, puedc evitar muchos de estes problemas. Pucde obtener informacion de como gestionar cuestiones de mutitarea en 1'1 Capitulo 7, "Division de la carga: multitarea", y construccion de sockets robustos en el Capitulo 10, "Discno de sockets Linux robustos",

Normalmente, un servidor sobrecargado reduce su vclocidad de respuesta a 10 recibido de Internet. La administracion de recursos y la tcmporizacion reduce Ia carga del servidor, increrncntando cl rendirnicnto de la red. Puede encontrar muchas ideas para mejorar el rendimiento en la Parte II, "La perspectiva del servidor y el control de carga".

Internet fue disefiado para funcionar con la conmutaci6n de paquetes. Todos los paquetes necesitan tener toda la informacion necesaria para alcanzar 1'1 destine. Como una carta, un paquete debe incluir la direccion de destino y de origen. EI paquete conmuta de una computadora a la proxima a traves de las conexiones (0 enlaces). Si la red pierde un enlace mientras se transmite un mensaje, 1'1 paquete encuentra otra ruta (conmutaci6n de paquetes), y si no 51' alcanza 1'1 host, el router en via un error hacia cl origen. Esto asegura la fiabilidad de los datos. Los caminos rotos en la red son pausas de red. Probablemente encontr6 alguna vez alguna pallsa de red.

Generalidades del direccionamiento TCP/IP

Las redes soportan difcrcntes tipos de protocolos. Los pmgramadores han utilizado algunos protocolos para controlar temas especificos como radio-microondas: otros intentan resolver los problemas de fiabilidad de la red. TCP/II' (Protocol a para el control de la transmision-Protocolo de Internet) fij6 la atencion en el paquetc yen el potencial de perdida en los canales de comunicacion. Siempre que falle un ~egment(J de red, el protocolo intenta cncontrar una ruta nueva.

EI rastreo de paquetos, deteccion de perdida y retransmision son algoritmos dificiles, porque la tomporizacion no es cl unico indicador. Afortunadamcnte, la expericncia industrial ha probado los algoritmos utilizados en el protocolo. Normalmenle, se pucdcn ignorar estas cuostiones durante el diseno, porgue las soluciones estan ocultas dentro del protocolo.

Tep /IP esta compuesto por capas: los protocol os de nivel alto ofrecen mas fiabilidad pero monos flexibilidad y los niveles inferiores ofrecen mas flexibiIidad pern sacrifican la fiabilidad. Con los diferentes niveles de flexibilidad y fiabilidad, Ia API de Socket ofrece todo 10 que las interfaces necesitan. Esto es una desviacion de la estrategia del UNIX estandar en la que cada nivel tiene su propio conjunto de 11amadas,

EI archivo de E/S estandar utiliza tambien una estrategia por capas. Las computadoras conectadas a traves de TCP / IP utilizan sockets, en su mavoria, para cornunicarse can e1 rcsto. Esto puede parecer extrafio, considerando que las distintas capas de protocolos disponibles para un programa han sido diseiiados para que

openO (el cual produce un descriptor de archive) y fopenO (el cual produce una referenda de archivo) sean difcrentes y casi incompatibles. Todas las capas de protocolos estrin disponibles a traves de una: socketl). Esta Hamada unica resume todos los detalles de implernentacion de redes diferentes (TCP/IP, IPX, Rose).

Fundamentalmentc, cada paquete contiene los datos, la direccion de origen y la de destine. Cada capa del protocolo anade su propia firma y datos adicionales (envoltura) a la transmision del paquete. Cuando se transmite, la envoltura ayuda a1 receptor a reenviar el mensaje hacia la capa apropiada que aguarda su lectura.

Cada computadora conectada a Internet tiene una direccion IP (Protocolo de Internet), un unico ruimero de 32 bits. Sin la unicidad, no hay forma de conocer el destino correcto de los paquetes.

TCP lIP lleva el dircccionarniento un paso mas alia can el concepto de puertos.

Como los 305 digitos de extensioncs telefonicas, cada direccion de la computadora tiene varios puertos a traves de los cuales la computadora se comunica. Estos no son fisicos; mas bien, son abstracciones del sistema. Toda la informacion se dirige a traves de la direccion de red como e1 ruimcro telef6nico principal.

El Formato de escritura estandar para la direccion IP es [0-255].[0-255].[0- 255].[0-255]-por ejernplo, 123.45.6.78. Se debe observar que el cero y cl 255 son nurneros especialcs utilizados en mascaras de red y multidifusion, asi que hay que tener cuidado con su uso (en cl Capitulo 2 se trata la numeraci6n IP con mayor dctallc). Los puertos Internet scparan norrnalmcnte estes numerus con otro punto 0 dos puntos:

[0-255]. [0-2551. [0-2551. [0-2551: [0-65535]

Par ejemplo, 128.34.26.101 :9090 OP=128.34.26.101, puerto=9090). [0-255]. [0-255]. [0-255]. [0-255]. [0-65535]

Pur ejernplo, 64.3.24.24.9999 OP=64.3.24.24, puerto=9999).

pue.n-6s col\i' DO~ PUNTOS t:ONTRA PUNT'o'---La notaci6n can dos puntas es mas comun para los puertos que la notacion punta decimal.

Cada direcciun IP ofrece cfectivamente sobre 65.000 numeros de puerto al que un socket se puede conectar. Vease el Capitulo 2 para mas informacion.

Escucha del servidor: el algoritmo basico del cliente

La conexi6n cliente-socket mas simple es la que abre una conexi6n a un servidor, envia una consulta y acepta la respuesta. Algunos de los servicios estandar incluso

no esperan consultas. Un ejemplo es el servicio timc-oi-dey hallado en el puerto 13. Desafortunadarnente, rnuchas distribuciones de Linux no tienen ese servicio abierto sin que se revise el archivo letdinetd.conf. Si bene acceso a una maquina BSD, HPUX 0 Solaris, puede intentar conectarse a ese puerto.

Existen varios servicios disponibles para probar con seguridad. Puede intentar en la maquina la ejecucion del comando Telnet para conectarse al servicio FfP puerto (21):

% telnet 127.0,0.1 21

Despues de Ia conexion, el programa obtiene el mensaje de bienvenida del servidor. No funciona muy bien el hacer Telnet para conectarse al servidor FTP, pero puede ver la interacci6n basica. EI ejemplo simple de cliente del Listado 1.1 se conecta al servidor, lee la bienvenida y luego se desconecta.

listado 1.1 Un algoritmo basico de diente Tep

/*** Un algoritmo basico de cliente.

***/

Crear un socket,

Crear una direcci6n de destino para el servidor. Conectar con e1 servidor,

Leer y visualizar cua1quier mensaje. Cerrar 1a conexi6n.

EI algoritmo del Listado 1.1 puede parecer demasiado simplificado, ya 10 mejor 10 es. Sin embargo, la conexion y la comunicacion con un servidor es realrnente facil. Los siguientes apartados describen cada uno de estes pasos. Puede encontrar el programa fuente completo al final de este libra y en el CD-ROM adjunto.

La lIamada del sistema socket: procedimientos y advertencias

La unica herramienta que haec eficaz al receptor de mensajes y comienza el proceso complete de envio y recepcion de mensajes de otra computadora es la Hamada del sistema sockett). Esta Hamada es la interfaz corruin entre todos los protocolos disponibles en un sistema operative Linux/UNIX, Al igual que la Hamada del sistema openO crea un descriptor para acceder a los archivos y dispositivos en nuestro sistema, soc ketO crea un descriptor para acceder a las computadoras de Ia red. Esta Hamada necesita informacion que determine a que capa quiere acceder. La sintaxis es como sigue:

#inc1ude ~sys/socket,h>

#include <resolv.h>

int socket(int domain, int type, int protocol);

La Hamada al sistema socketO acepta varios valores distintos. Para obtener una lista completa, vease el Apcndice A, "Tablas de datos". Por ahora, encontrara algunos en Ia Tabla 1.1.

Para metro Valor

Tabla 1.1 Valores de parametres seleccionados de la lIamada de sistema socketO

Descripcion

domain PF ~INET PF ~LOCAL

type

PF~IPX PF~INET6 SOCK~STREAM

SOCK~RDM

SOCK_DGRAM

SOCK_RAW

protocol

Protocolos de Internet ll'v4; pila TCP lIP.

Canales con nombre locales al estilo BSD. Normalmente utilizado en el registro del sistema 0 en una cola de impresi6n.

Protocolos de Novell.

Protocolos de Internet IPv6; pila TCP lIP.

Fiable, flujo de datos secuencial (flujo de bytes) [Protoco- 10 para el control de la transmision (TCPl).

Fiablc, datos en paguetes (no implementado ya en muchos sistemas).

No fiable, datos en paguetes (datagrama) [Protocolo de datagrama del usuario (UD]»].

No fiable, datos en paquctes de bajo nivel,

Estc es un entero de 32 bits en el orden de bytes de red (vease el apartado sobre 1.1 ordcnacion de bytes de red en el Capitulo 2). Muchos tipos de conexion soportan s610 el protocolo = 0 (cero). SOCK_RAW necesita especificar un valor de protocolo entre (1 y 255.

Por ahara, los unicos parametres que el ejemplo utiliza son domain=PF _INET, type=SOCK_STREAM y protocolee (cera).

En este libro se utilizan los dominios PF .:" (familia de protocolos) en la lIamada de socket, porque la forma corrects es el uso de las constantes de dominio FP _ *. Sin embargo, muchos programas utilizan las constantes AF ~ * (familia de direcciones) de forma intercambiable. Tenga cuidado y no se confunda cuando observe el c6digo fuente que utilize el estilo AF. (Los archives de cabecera en C definen las constantes AF _ * como PF _ *.) Si desea, puede util izar la notaclon AF _ * perfectamente, pero puede aparecer alguna incompatibilidad en un futuro.

A continuaci6n aparece un ejemplo para una Hamada TCP lIP de generaci6n de flujo:

int sdj

sd ~ socket(PF_INET, SOCK_STREAM, 0);

sd es el descriptor de socket. Funcinna de la misma forma que un descriptor de archivo fd:

int fd;

fd ~ open( ... )j

La Hamada devuelve un valor negativo cuando ocurre un error y coloca el codigo de error en errno (la variable global estandar para los errores de biblioteca). He aqui algunos de los errores mas comunes que puede obtener:

• EPROTONOSUPPORT. El tipo de protocolo 0 el protocolo espedficado no se soporta dentro de este dominio, Esto ocurre cuando el dominio no soporta el protocolo que se demanda. Excepto para SOCK_RAW, muchos tipos de dominio solo soportan el valor cero en el protocolo.

• EACCES. El permiso para crear un socket del tipo especificado 0 protocolo se dcniega. Nuestro programa es posible que no tenga los privilegios adecuados para crear un socket. SOCK_RAW y PF _PACKET necesitan los privilegios de root.

• EINVAL Se dcsconoce el protocoio 0 no se dispone de la familia de protocolo.

Esto ocurre cuando un valor en cualquier campo dominic 0 tipo es invalido. Para obtener un listado complete de valores validos, vease 121 Apendice A.

Por supuesto, necesita conocer los archives de cabcccra mas importantes a incluir. Para Linux, son estos:

#include <sys/socket.h> #include <sys/types.h>

,0 Define funciones estandar. °1

'* Tipos de datos del Sistema estandar. *1

#include <resolv.h> /* Define los tipos de datos que se necesitan. *1

El archive sys/socket.h tiene las definiciones de funcion que se necesitan para la API de Socket (incluyendo, por supuesto, la funcion socket(}). sys/types.h incorpora muchos de los tipos de datos llue se uti1izan con los sockets.

-, ;':",",:'

".'. '.', •. 0:.

. .. , " ~

usa DE'RESOLv.:H FRENTE A5V5I1"'VPI!~LH' .----En este libro se utiliza el archivo resolv.h para la definicion de los tipos de datos. Se debe observar que otras distribuciones de linux 0 versiones UNIX pueden utilizar sys/types.h, el archivo de inclusion mas estandarizado. Durante la escritura de este libro, los ejemplos se comprobaron sobre Mandrake 6.0-7.0, el cual utilize archivos de inclusion muy peculiares. (Parece que estas versiones de dlstribuclon tienen el archivo sys/types.h err6neo el cuaJ no incluye el archivo netinetlin.h que se necesita para los tipos de direcci6n.)

La llamada del sistema socketO solo crea las colas para el envio y recepcion de datos, de forma contraria a 1a Hamada del sistema para 1a apertura de archivos, 1a cual abre el archivo y lee el primer bloque. 5610 cuando el programa ejecuta una Hamada del sistema bindf). el sistema operative conecta la cola a la red.

Se utilizara de nuevo el ejemplo del telefono, cl socket es el auricular sin telefono o conexi6n de red. Si se ejecuta bindt), connectO 0 alguna E/5 se conecta el aurieular al telefono y este a la red. (Si el programa no realiza explicitamente la llamada bindt), el sistema operative realiza implicitamente Ia Hamada par el, Para obtener mas informaci6n consulte el Capitulo 4, "Envfo de mensajes entre peers".)

Realizacion de la lIamada: conexion al servidor

Despues de la creacion del socket, se puede obtener el primer" lhola?" a traves de la conexion al servidor, La Hamada del sistema connectO es similar en varios aspectos a Ia Hamada de alguien por telefono:

• Se identifica el destino utilizando un numero de telefono, Cuando se llama a un numero de telefono, se identifiea a un telefono especifico ubieado en eua1- quier lugar del mundo de la red telef6niea. La direccion TP identifica de Ia misma forma a la computadora. Al igual que los nurneros de telefono tienen un formato especffico, se requiere que la conexion posea un Formato especifico para definir a que computadora se conecta y c6mo eonectarse.

• La conexion ofrece el canal para los mensajes. Una vez que se dcscuelga el auricular, existe un canal a traves de cual dos 0 mas personas pueden conversar, Su nurnero de telefono no es importante a menos que la persona tcnga que llamarle.

• EI camino de regreso hasta su auricular esta oculto dentro del sistema telef6- nico, La red telef6nica tiene varios caminos compartidos, al igual que una red de computadoras. Es importante tener un camino de regreso para obtener los mensajes de vuelta a su auricular. EI equipo de destino 0 servidor obtiene la direccion y el puerto de su programa para poder responder utilizando un camino similar.

EI nurnero telefonico tiene que estar publicado para que otros Ie llamen. Si su prograrna acepta Ilamadas, debe especificar Ull unico canal (0 puerto) y publica rio a sus clientes,

La Hamada del sistema connectO se define como sigue: #include <sys/socket.h>

#include <resolv.h>

int connect(int sd, struct sockaddr *server, Int addr_len)j

El primer pararnetro (sd) es el descriptor de socket que se cre6 con la Hamada sockett). El ultimo pararnetro es la longitud de Ia estructura sockaddr. EI segundo parametro apunta hacia diferentes tipos y tarnafios de estructuras. Esto es importante, porque es [0 que hace diferentes las llamadas socket{) de las llarnadas de E/S de archivos.

Recuerde que la llamada del sistema socket{) soporta al menos dos dorninios diferentes (PF _INET Y PF _I PX). Cada dominio de red (PF _ *) tiene su pro pia estructura para describir la direcci6n. Todos enos tienen un padre comun=-el mismo que se

usa en la definicion connectO-struct sockaddr. Consultc el Apendice A para obtener un listado cornpleto de todas las declaraciones de estructura,

1~~~~flW~,8.1'~~~Jge~imfi:·7----------

La interfaz sockaddr utiliza abstraccion de datos. La abstraccion de datos simplifica las interfaces asegurando que mientras los tipos de datos pueden cambiar, los algoritmos permanecen igual. Par ejemplo, una pila puede contener diferentes tipos de datos, pero la funclon de la pila sigue siendo la misma: meter, sacar y as; sucesivamente. Para utilizer una interfaz abstracts, el primer campo de la estructura sockaddr debe tener el mismo significado. Todas las estructuras tienen un campo comun: ... _family. EI tipo del campo es un entero de 16 bits sin signo. EI valor de este campo determina que dase de dominic de red utilizar.

jimJ~.~"\T§;!~~_~~

DE FAMILIA SOCKADDR

EI tipo de dominic que se estableclo en la lIamada del sistema socketO debe ser el mismo valor que el primer campo en la familia sockaddr. Por ejemplo, si el programa creo un socket PF _INET6, el campo de la estructura debe ser AF _INET6 para que el programa trabaje correetamente.

He aqui el registro genE~rico y el registro INET para que pueda compararlos (con los archivos de cabecera):

struct sockaddr {

unsigned short int sa_familYi unsigned char sa_data[141i

struct sockaddr_in sa_family_t

Sin_familYi

unsigned short int s~n_port;

} i

struct in_addr unsigned char

sin_addri

_pad[Ji

} j

Sc debe observar que sa_family y sin_family son eornunes a las dos estructuras, La tarea que cada procedimiento de llamada ejecuta cuando reeibe este registro es cornprobar el primer campo. Se observa que este es el unico campo que esta en el orden de bytes del host (vease el Capitulo 2). EI campo de relleno (denorninado sa_data y _pad) puede ser corruin para todas las familias de sockaddr. Par convencion, la estructura generica sockaddr y 1a estructura INET sockaddr _in tienen que ser de 16 bytes de tamafio (la estructura IPv6, sockaddr _in6, es de 24 bytes). Asi, el campo de relleno completa la estructura can los bytes sin usar.

Puede observar que la longitud del campo de relleno en sockaddr _in esta ausenteo Esto es meramente una convencion. Como el relleno se tiene que establecer a cera, el tamano real no es importante. (En esta definicion de sockaddr _in, es 8 bytes de tamafio.) Algunas implementaciones pueden definir campos adicionales para calculos internos, No se preocupe de ellos -y no los use, porque no se puede garantizar la disponibilidad de estos campos de un sistema a otro y de una version

a otra. Cualquier cambio en los campos no estandarizados puede paralizar al programa. En todos los casos, es mejor una iniciacion a cero de la instancia entera de la cstructura.

En la siguientc tabla se describe cada campo. Tambien se ofrecen ejcmplos de posibles valores,

Nombre de campo Descripcion Orden de bytes Ejemplo
~in_family La familia de protocolos Host, nativo AF
sinport E1 mlmero de puerto del Red 1 3 (informacion
servidor horaria)
sin addr La direcci6n IP numerics Red 127.0.0.1
del servidor (localhost) EI programa rellena cada campo antes de la invocacion ala Jlamada del sistema connectl). Linux tiene enmascarada levemente la lIamada del sistema, asi que no es neccsario transformar sockaddr_in en sockaddr. POT transportabilidad, pucde seguiT las convenciones todavia y aplicar las transformaciones.

~;u~~sra;~i'~~b~l:~~~~~t __

Con otros SO compatibles (on UNIX, puede trasformar cualquiera de los miembros de la farni lia sockaddr _ * a sockaddr para evitar advertencias de compilaci6n. los ejemplos aqui mostrados no utilizan ninguna transformaci6n simplemente para ahorrar espacio (y porque Linux 10 permite).

El codigo puede parecerse al del Listado 1.2.

Listado 1.2 Ejemplo de connectO

/*** Trozo de codigo mostrando 1a iniciacion e

***/

/*** invocacion de 1a llamada del sistema connect{). ***/

#define PORT_TIME 13

struct sockaddr_in dest; char *host = "127.0.0.1'; int sd;

/**** Crear e1 socket y hacer otro trabajo. ****/

bzero(&dest, sizeof{dest»)j /* comenzar can una pizarra 1impia. */

(con tin tie)

listado 1.2 Ejemplo de connectO (continuaci6n)

dest.sin_fami1y = AF_INETj 1* Se1eccionar 1a red deseada. *1 dest.sin_port = htons(PORT_TIME); /* Se1eccionar e1 puerto. */

inet_aton(host, &dest.Sin_addr);

(* DirecC16n remota. */

if ( connect(sd, &dest, sizeof(dest)) == 0) f* iConectarl */

{

perror('Socket connection'); abort () ;

}

En este codigo, 1a Hamada del sistema connectO requiere de varios pasos preparatorios antes de que se conecte el socket al servidor. Primero, crear una estructura sockaddr_in. Utilizar 1a direcci6n del servidor para la segunda linea. Si se desea coneetar a un servidor diferente, coloque la direcci6n IP apropiada en esta cadena. El programa prosigue con otras iniciaciones, incluyendo la Hamada del sistema socketf), Cuando comienza el funcionamiento can 1a estructura. se pone a cero con la funcion bzeroO. E1 programa establece la familia a AF _INET. Luego, el programa establece el puerto y la direcci6n IP. Las hcrramientas de transformaci6n htonsO y inet_atonO utilizadas aqut se trataran en el Capitulo 2.

La siguiente Hamada es la eonexi6n al servidor. Sc debe observar que el fragmento de e6digo comprueba los valores devueltos para eada Hamada de procedimiento, Esta politica es una de las muchas claves para la realizacion de programas de red robustos,

Despues de que el programa establezca la conexi6n, el descriptor del socket, sd, sc convierte en un canal de lectura/escritura entre los dos programas. Muchos servidores a los que estamos acostumbrados ofrecen transacciones individuales y luego cortan la comunicaci6n (por ejemplo, un servidor HTTP 1,0 envia el archive pedido y Iuego cierra la conexion), Para interactuar con estos tipos de servidor, los programas tienen que enviar la consulta, obtener la respuesta y cerrar la conexi6n.

Obtencion de la respuesta del servidor

EI socket sc abre y e1 canal se establece. Ahora, se puede obtener el primer "hola". Algunos servidores inician la conversacion como Ia persona responde al telefono. Una vez que la conexion esta abierta, se puede utilizar la biblioteca estandar de llamadas de E/S de bajo nivel para la comunicacion. He agui la Hamada del sistema readO:

#inc1ude <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

Probablemente se encuentra familiarizado con esta llamada. Aparte de su capacidad especial para utilizar el descriptor socket (sd) en lugar del descriptor de archivo (fd), todo 10 dernas es aproximadamente 10 mismo que la lectura de un archivo. Puede incluso utilizar la Hamada del sistema readO como en el siguiente fragmento de c6digo:

int sd, bytes_readj

sd = socket(PF_INET, SOCK_STREAM, 0);

/* Crear e1 socket. */

/**** Conectar a1 host ****/

bytes_read = read(sd, buffer, MAXBUF) j /* Leer e1 mensaje. */ if ( bytes_read < 0

/* Informar del error de 1a conexi6nj rutina de salida. */

De hccho, se puede transformar el descriptor de socket a un FILE* para E/5 de nivel bajo. Por ejernplo, para utilizar tscanft), puede seguir el ejemplo de abajo. (Las lineas en negrita indican los cambios del listado previo.)

char Name[NAME] , Address[ADDRESS] , Phone[PHQNE];

FILE *sp;

int Sdj

sd = socket(PF_INET, SOCK_STREAM, 0);

/* Crear e1 socket. */

/**** Conectar a1 host ****j

if ( (sp = fdopen(sd, Or"» == NULL)

perror("FIlE* conversion failed·); else if ( fscanf(sp, ·%*s, %*s, %*8\n·,

/* Transformar a FILE*. */

/* Utilizar como siempre. */

NAME, Name, ADDRESS, Address, PHONE, Phone) < 0 )

{

perror(·FScanf')j

(r nicamente los sockets de flujo se pueden transformar de forma fiable a un flujo FILE*. La raz6n es simple: los sockets de datagramas son norrnalrnente sin conexi6nun mensaje se envia y ya esta. Tarnbien, los sockets de flujo ofrecen integridad de datos y fiabilidad del mensaje, mientras que los datagramas son poco fiables, Los datagramas son similares a la coloracion de un mensaje en un sobre can destino y sella que se envia a traves del sistema postal: el mensaje puede no llegar en absoluto. Una conexi6n FILE* debe ser un canal abierto. Si intenta transformar un datagra-

rna, puede perder datos criticos. En el Capitulo 3 "Distintos tipos de paquetes de Internet", se puede obtener mas informacion de flujos contra datagramas.

Las eonexiones de socket FI LE * ofrecen recursos excelentes de busqueda y de analisis gramatical para el programador de red. Sin embargo, cuando se utilizan, se deben comprobar todos los valores devueltos, incluyendo *printf() y =scanff). Se debe observar en el ejernplo anterior: si el valor devuelto de fscanfO cs menor que cero, habra un error.

SI!60ttf6Ab''V'''FtABfLI6Aont!''LA·'~''·''--------

La seguridad y fiabilidad son de extrema importancia cuando se crean los programas de red. En el momenta de la escritura de este libra, los sistemas operativos Microsoft han afrontado varios problemas de seguridad fundamentales, algunos involucrados con las conexiones de red. Cuando se escriben programas, hay que asegurarse que los buffers no se puedan desbordar y que todos los valores devueltos se comprueben. En un software de configuration de bazar, se puede solicitar la entrada de otros en el codiqo fuente. La revisi6n del punta de este software bazar es un recurso inmenso de conocimiento y experiencia-utilfcelo.

Can la Hamada del sistema readt), se pueden obtener cualquicra de los siguientes errores:

• EAGAIN. Una E/S no bloqueada esta seleccionada, y no existen datos disponibles. Este error indica al programa l1ue intente la lIamada de nuevo.

• EBADF. fd no es un descriptor de arehivo valido 0 no esta abierto para lectura. Esto puede ocurrir si la Hamada del socket no tuvo exito 0 el programa cerro el canal de entrada (creandolo de 5610 escritura),

• EINVAL. fd se ha conectado a un objcto que cs inadecuado para la lectura.

La Hamada del sistema read(} no ofrcce un control especial sobre la forma en que utiliza cl socket. Linux ofrece otra Hamada del sistema estandar, recvt). Se puede utilizar directamente recvO con el descriptor de socket para obtener la informacion mientras ofrcce mas control:

#include <sys/socke!.h> #include <resolv.h>

in! recv(int sd, void *buf, in! len, unsigned in! flags);

La Hamada recvO s610 se diferencia de la Hamada readO en las sefializaciones.

Las sefializaciones dan un mayor control sobre el que obtener, e incluso ofrece control de flujo. Estos valores pueden agruparse can el operador 0 (FLAG 1 I FLAG2 I ... ). Dentro de circunstancias normales, el para metro se establece a cero. Podria preguntarse por que no se utiliza la Hamada del sistema readO cuando las sefializaciones son cera, ya que en este caso no se diferencian en nada. Como sugerencia, utilice recvO en lugar de readO-esto puede ayudarle mas adelante cuando el programa se haec mas complejo. Tambien, generalmente hablando, es mejor utilizar un conjunto de herramientas que herrarnientas mezcladas. Finalizando, readO com-

prueba que tipo de descriptor de E/S envio y ejecuta la llarnada del sistema mas apropiada.

He aqui las sefializaciones mas usuales que se pueden utilizar para controlar la Hamada del sistema recvt), Se puede encontrar un listado mas completo en el Apendice B, "API de red".

• MSG_OOB, Se procesan los datos fuera de banda. Se usa en los rnensajes de alta prioridad. Algunos protocolos permiten elegir entre una prioridad normalo alta cuando se envia un mensaje. Se establece esta sefializacion para indicar al administrador de cola que busque y devuelva los mensajes fuera de banda en vez de los datos normales. Se puede ver el Capitulo 10 para obtener mayor informacion.

• MSG_PEEK. Se lee de forma no destructiva. Se utiliza para indicar al administrador de cola que lea de la cola de mensajes sin mover el puntero de indice de lectura. (En otras palabras, una lectura posterior produce al menos los mismos datos cada vez. Mire la caja de texto en la proxima pagina.)

• MSG_WAITALL. Se utiliza para que no devuelva el mensaje hasta que el buffer suministrado este completo. Algunas veces sc obtiene un buffer semilleno, porque el resto de los datos estan en transite. Si conoce cuanta informacion csta enviando el servidor y no desea recomponerla, utilice esta seftalizaci6n para terminar de rellenar el buffer (0 esperar indefinidamente).

• MSG_DONTWAIT. Se utiliza para que el rnensaje no se bloquee si la cola esta vacia. Es similar al establecimiento de la caracteristica de no bloqueo en cI socket, unico requisito de esta opcion en est a Hamada del sistema recvO exclusivamente. Normalmente, si no existen datos de mensaje disponibles, el proceso espera (se bloquea) hasta que Heguen algunos datos. Si se utiliza esta sefializacion y la cola no tiene datos disponibles a la hora de la Hamada, la llamada del sistema devuelve un c6digo de error EWOULDBLOCK inrnediatamente. (Linux no soporta actualrnente esta opcion en la llamada recvt). Se puede utilizar O_NOBLOCK con Ia Hamada del sistema fcntlt). Esto hace que el socket no se bloquee indefirudamente.)

OBTENCfON'De; PAQO"ES"PR;A~;2f~lWd§~----

Los programas se ejecutan mucho mas rapido que las redes. Algunas veces un paquete Ilega a la computadora en trozos. porque los routers de red 10 fragmentan para adaptarlo a las limitaciones de la red. Si se llama a recvO cuando esto ocurre. se puede obtener un mensaje incompleto. Esta es la raz6n de par que MSG_PEEK puede dar diferentes resultados en Ilamadas consecutivas: la primera lIamada puede dar 500 bytes y la segunda puede ser de 750 bytes. Asimismo, esta es la razon de par que existe una senalizacion M$G WAITALL.

La Hamada del sistema recvO es mas flexible que readQ, permitiendo el usa de distintas sefializaciones para modificar su comportamiento. Para realizar una lectura normal desde un canal de socket (equivalente a read{)), haga 10 que se indica a continuacion:

int bytes_read;

bytes_read = recv(sd, buffer, MAXBUF, 0);

Para leer de forma no destru.ctiva desde el canal de socket, haga 10 siguiente: int bytes_read;

bytes_read = recv(sd, buffer, MAXBUF, MSG_PEEK);

Para leer de forma no destructiva los datos fuera de banda del socket, haga 10 siguiente:

int bytes_read;

bytes_read = recv(Sd, buffer, MAXBUF, MSG_OOB : MSG_PEEK);

EI primer ejemplo obtiene la informacion del servidor proporcionando un buffer, un tarnafio y ninguna sefializacion. EI segundo ejemplo rnuestra la informacion. Existe un flujo intencionado aquf: (que ocurre si el servidor envia mas informacion que la que pueda aceptar el buffer? No es un error critico: nada fallara. EI algoritmo puede simplemente perder los datos que no se lean.

La lIamada del sistema recvO produce codigos de error sirnilares a readf). y ad icionalmente los codigos siguientes:

• ENOTCONN. sd no esta conectado. EI descriptor de socketproporcionado no esta conectado a otro equipo hornologo 0 al servidor,

• ENOTSQ(K. sd no es un socket. EI descriptor de socket proporcionado no tiene la firma t1ue indica que viene de una lIamada del sistema sockett).

Sc debe observar que si se utilize Ia llarnada del sistema readO can un descriptor de socketse pueden obtener aun estos codigos de error, debido a que readl) ejecuta internarnente ala llarnada recvf).

Cierre de la conexi6n

Una vez que se obtuvo la informacion que necesitaba del servidor y que todo se realizo bien, se debe cerrar la conexion. De nuevo, existen dos formas para poder cerrar la conexion, Muchos programas utilizan la Hamada del sistema closeO de la E/S estandar:

#include <unistd.h>

int close(int fd);

Una vez mas, el descriptor de socket (sd) se puede substituir por el descriptor de archivo (fd), funciona igual. Si se ejecuta con exito, el valor devuelto es cern.

Esta llamada produce un solo error:

• EBADF. fd no es un descriptor de archive valido.

Sf~M~e···H~¥·t)tj~';;~~w*~¥e~:·~;·

DESCRIPTORES DE SOCKET ~------------~ Siempre se deben cerrar manualmente los descriptores, particularmente los sockets. Por ornision, el sistema operativo cierra todos los descriptores y vacfa los butters. Si el descriptor hace referencia a un archivo, el proceso funciona sin afectar a otros sistemas. Los sockets, por el contrario, pueden tardar mas de 10 necesario, bloqueando recursos y haciendo la conexi6n dificil a otros clientes.

La lIamada del sistema shutdownO da mayor control del cierre de canales, porque se puede cerrar cualquier canal entrante 0 saliente. Esta Hamada es especialmente util cuando se utilizan sockets para reemplazar a stdin 0 stdout.

~&hij~··tri··Lb'~~&~A:"'bM"·~·~'!:;t:;;~···,----

La Ilamada del sistema shutdownO es distinta al comando shutdown (secci6n 8 de los manuales en linea de UNIX) para cerrar el sistema operative.

Con la llamada del sistema shutdownO, se puede cerrar cualquier direccion de flujo de datos del canal de comunicacion, estableciendo el camino de s610 lectura 0 5610 escritura:

#include <5Y5/socket.h>

int shutdown(int 5, int how);

EI para metro how puede tener tres valores:

Valor

Funci6n

o (ccro) 1 (uno)

SOlo cscritura (pcnsar en "0" de "output"). S6(0 lectura (pensar en "I' de "input").

2

Cerrar la entrada y La salida.

Resumen: ,que ocurre entre bastidores?

Varias cosas ocurren entre bastidores cuando el programa abre un socket y se conecta a un servidor TCP. Lo unico que realiza la Hamada socket es crear una cola de mensajes. Realmente, ocurren mas casas cuando el programa se conecta. (Se puede obtener un listado del programa completo en el CD adjunto.) La Tabla 1.2 muestra 10 que ocurre en la parte del cliente y del servidor,

Es bastante para una Hamada connectO simple. Este procesa se puede complicar mucho mas, especialmente entre los equipos de encaminamiento (como la administraci6n de encaminarniento, verificaci6n de paquetes, fragmentacion y defragmentacion, conversion de protocolos, tunneling, etc.). La API de Socket simplifica considerablemente la comunicacion de red.

Tabla 1.2

Pasos para la creacion y conexion de un socket

Acciones del diente

Acciones del servidor

1. Llama a sockeu): crea una cola y establece las sefializaciones para los protocolos de la cornunicacion.

2. Llama a connectO: el sistema operative asigna un ruirnero de puerto temporal si el socket no tiene un mimero de puerto asignado a traves de bindt),

(Esperando una conexion)

(Esperando)

3. Envia un mensaje al servidor solicitando una conexion, indicando que numero de puerto esta usando.

(Esperando al servidor)

4. Coloca la peticion de conexion en la cola de escucha,

(Esperando)

S. Lee la cola de conexion, acepta la conexi6n y crea un canal de socket individual.

(Esperando)

n. Algunas veces, crea una tarea 0 thread unico para interactuar con cl programa.

7. Envia de regreso una confirmacion de que la concxion es accptada. Envia un mensoje al puerto 0 espera una consulta del programa. E1 servidor pucde cerrar el canal despues del envio de los datos, si ofrecc un mensaje de boletin simple (como la hora actual).

(Esperando)

H. Empieza la correspondcncia de los datos.

La red requiere un lenguaje y algoritmo muy particulares con objeto de establecer una conexion. Ante todo, con la Hamada del sistema socketO Se inicia 1'1 rodamiento del balon can la creacion del auricular del telefono. Este auricular permite a un programa enviar y recibir mensajes si esta concctado. El programa puede utilizar las funciones normales readO y writeO como se usan en los canales y descriptores de archivo. Alternativamente, se pueden utihzar las llamadas del sistema mas especializadas como recvf),

La red JP tiene varias caracterfsticas que necesitan de una mayor explicacion. En el pr6ximo capitulo se trata la numeracion IP, los puertos y la ordenaci6n de bytes. Tarnbien se explican herramientas muy utiles para transformar la informacion, simplificando los esfuerzos de programaci6n.

Capitulo II

Elocuencia del lenguaje de red TCP/IP

En este capitulo

Ccneralidades de la numeracion IP 25 Numeros de puertos de host IP 32 Ordcnacion de bytes de red 34 Diferentes clases de sockaddr 41 Canales con nombre de UNIX 42

Resumen: aplicaci6n de herramicntas y numeracion IP 43

Cuando se trabaja con Internet se necesita conocer como dirigir los mensajes con el fin de que lleguen correctarnente, La direction es una parte importante de la creacion de un mcnsaje. Como en el telefono, una eomputadora debe tener una direccion 0 10 para que pueda obtener los mcnsajes correct os y otras eomputadoras puedan dirigir el trafico como corresponda.

En el capitulo anterior se introdujo el concepto el socket. En este capitulo se amplia el tema con 1a API de Socket. Primero se trata el sistema de numeracion IP, de c6mo el encaminamiento funciona en un nivel abstracto, los formatos binarios correctos y diferentes tipos de socket.

Generalidades de la numeraci6n IP

La numeracion rr uti1iza una direccion de longitud fija. Esta restriccion requirio una gran planificacion cuando se disefio e1 protocolo. EI protocolo ofrecio soluciones a varias cuestiones durante su epoca de vida: identificacion de computadoras, organizacion de red, encaminamiento y resoluci6n de direcciones. Ahora afronta cuestiones nuevas como e1 crecimiento explosivo y 1a perdida de direcciones.

tdentlflcacion de la computadora

Las redes irnplican la cornparticion de un unico recurso (el cable de red) con varias computadoras, Debido a que toda esn informacion pod ria fluir en un medio de red, cada computadora debe aceptar la informacion. Sin embargo, si cada cornputadora de nuestra red sc llarnara Bert 0 Ernie, otTOS hosts no scrian eapilces de detcrminar el destino real. Cada computadora de red necesita una unica identificacion (11). Pero eso no es todo,

COM()AF~ONTARt:.A coLlsl'6N 'DE ·Dnt~c'c'6N ---

Una estaci6n de trabajo no trabaja bien con la red cuando comparte una direccion (colision de red). Alguien que haya intentado localizar una colision de red puede confirmar que es bastante duro arreglarlo. Es aun peor cuando una de las computadoras esta utilizando alguna asiqnacion de direcci6n dinarnica (como DHCP). La forma mas obvia (y laboriosa) de resolver este problema es mirar cada computadora del lugar.

Las redes son dinarnicas y tienden a aumentar en complejidad. La computadora ticnc que ser localizable facilmentc por su IO tanto como sc amplie la red. Toda informacion co1ocada en la red consume una porcion de esc valioso recurso, asi que cualquier informacion innecesaria no se deberia incluir en el mensaje.

Algunos sistemas en red incluyen un mapa de rutas en cl mensaje. Cada servidOT de la lista coge el mensajc y 10 pasa al siguiente servidor. Este metodo reduce el

rendirniento de la red al descender el porcentaje de los datos reales con la cabecera, Si se codifica Ia direccion del destino en la propia direccion. el mapa de rutas es innecesario.

Las computadoras de red eonectadas tienen todavia un unico ID llarnado Control de acceso a1 media (MAC); un ejemplo es el ID ethernet. La computadora utiliza este ID para arrancar en red (sistemas sin disco que solo tienen memoria RAM y todo el almacenamiento esta en el servidor). El ID ethemet tiene seis bytes de tamario, y usualmente 10 veremos eserito en hexadecimal: OO:20:45:FE:A9:0B. Cada tarjeta ethernet tiene uno y es unico.

Desaforhmadamente, no se puede utilizar ese ID para identifiear ala computadora exclusivamcnte, Tiene dos problemas fundamentales. Prirnero, cada servidor de encaminarniento debe obtener cada ID de la red. La base de datos de los ID podria ser muy grande y reducir significativamente el tiempo de encarninamiento para cada mensaje. Segundo, todas las interfaces no tienen una MAC (PPP, por ejcmplo).

El 10 de la computadora podria tener un mecanisme incorporado para el encaminamiento del mensaje. Este mecanisme es como una direccion de una carta: de 10 mas general a 10 mas especifico. Los 10 Internet resuelven los problemas de unicidad mientras ofreccn indicadores para las cuestiones de encarninamiento.

Una direccion IF tiene mas ventajas que una MAC. El numero puede cambiar (no es fijo), asf la implantacion de clusters consistentes de direcciones es mas facil, y los equipos portatiles no se encuentran can problemas. La red puede asignar la IF' a la MAC utilizando el Procolo de resolucion de direcciones (ARP). Vease la RFC 826 en el CD-ROM adjunto.

;~bt_6:~w~m~W1;:

DE DIRECCIONES (ARP)

ARP es una tabla de tradueei6n simple que asigna a una IP su MAC asoeiada. Todos los mensajes de la red deben tener una MAC para que el adaptador (0 los eontroladores) puedan recoger el mensaje. EI origen puede desconoeer la MAC del host destinatario, el cual se puede oeultar detras de varios routers. EI router mas bien envia el mensaje a los routers que eontrolan las subredes definidas en la direcci6n IP del destinatario. Cuando el mensaje akanza un router con ARP, este comprueba las tables. Si el router encuentra la direcci6n IP, la MAC del paquete consigue el destino correcto. En otro caso, el routerenvfa un mensaje de difusi6n a la subred para resolver la direccion IP.

Orqanizacion del 10 Internet

EI TD Internet utiliza un esquema de direccionamiento de 10 mas general a 10 mas especifico. Cada [0 es un rnimero de cuatro bytes, como el TO ethernet. El primer ruimero, Ieyendo de izquierda a derecha, es la close de red. Observe la Figura 2.1.

La direccion IP actua como un mapa de carreteras para los routers. Cada parte de la direccion ofrece una informacion mas especifica sobre donde se encuentra el destine. Comienza con la clase de red y termina con el numero de host. Puede compararlo facilmente a la direccion de una carta: la primera linea es el destinatario, luego la calle <1 apartado de correos. El detalle se reduce en la direccion hasta el estado a pais,

~J

26.188,15,21

L...-_R_ed_S-_....Jf ~

Subred

FIGURA 2.1

La direcci6n IP tiene varios componentes que identifican la dimension de la red.

El direccionamiento de Internet tiene cinco clases basicas de direcciones. Cada clase es un conjunto de asignaciones de red con distinta dimensi6n. El plan de direccionamiento de Internet se encuentra organizado para que las empresas puedan comprar segmentos del espacio de direcciones. Las clases estan etiquetadas de Ia A a la E:

(lase

Direcci6n

Rango de direcciones. descripci6n

A

0.0.0.0 a 0.255.255.255 1.0.0.0 a 126,255.255.255

B

127.0.0,0 a 127.255.255.255 128.XXX.0.O a 191.XXX.2SS.255

(Reservadas)

22L26 16.777.214 de nodos por cada asignacion de scgmento. Esta clase tienc 126 segmentos.

Utilizadas en organizaciones grandisimas que dividen la red en subredes como se necesite, como por ejemplo un proveedor de servicio de Internet (lSP).

(Reservadas para la interfaz de loopback), 216_2 065.534 nodos para cada asignaci6n de segmento. Esta clase tiene 64"256 segmentos disponibles.

U tilizadas en organizaciones grandes como empresas y universidades. Se pueden crear subredes. La XXX es la subred asignada (por ejemplo, 129.5,0.0 es una red asignada). Nota: Este espacio de direcciones se encuentra poco utilizado.

Direcci6n Rango de direcciones. descrlpclon

(lase

c

192.XXX.XXX.0 a 223.XXX.XXX.255 2/;-2 6254 nodes por (ada asignacion de segrnento. Esta clase tiene 32*65.536 segmentos disponibles,

Utilizadas en ernpresas pcquciias 0 por particulares. La direccion tiene varios espacios disponibles.

221'-2 6 26R.435.454 nodos.

D

224.0.0.0 a 239.255.255.255

Estas direcciones no se encuentran asignadas pero se reservan para direcciones de multidifusi6n.

E

240.0.0.0 a 255.255.255.255

228_2 6268,435,454 nodos,

Estas estan reservadas para un lISO futuro. 5e debe observar que 255.255.255.255 es una direccion IP de difusion general. Nunca es una direcci6n valida.

Las clases de red se encuentran numeradas de forma peculiar, porque el direccionamiento utiliza los primcros bits de la direcci6n para determinar la clase. Par ejempIn, la red de Clase A tiene un cero en el primer bit de la direcci6n. De igual modo, Ia Clase B tiene un uno en el primer bit y un cera en el segundo:

Clase A: 0 (0000,0000) a 126 (0111,1110). Clase B: 128 (lOOn,oooO) a 191 (1011,1111). Clase C: 192 (1100,0000) a 223 (1101,1111). Clase D: 224 (1110,0000) a 239 (1110,1111). Clase E: 240 (1111,0000) a 255 (1111,1111).

Con el uso de esta estrategia, los routers pueden rapidarnente determinar (can cuatro bits) como encarninar el mensaje. Hoy en dia, se encamina mejor utilizando ol cncaminamiento de dominio de Internet sin clasc (CIOR). Estas definiciones nuevas (localizadas en las RFC 1517- 15 19) idcntifican la localizacion y el camino de un host utilizando los bits superiores de la direccion,

Can el protocolo IP se introdujo este esquema de numeracion pitra la identificacion de la computadora y sus agrupaciones de forma eficiente. Con esto, un router puede deterrninar rapidarnente si intercepta un paquete 0 10 mueve a la interfaz que conduce a la subred de destino. La propagacion es muy importantc: simple rcccpcion de un paquete, se comprueba y se pasa si no sc acopta. Cada bit que el router acepta significa un rctardo en la red. El router no deber retardar mas bits que los necesarios para determinar la relevancia del rnensaje, En otras palabras, no debe haber retardos. Por ejemplo, la conmutaci6n de telefono normal en los Estados Unidos de America no intenta resolver el numero tclefonico cornpleto; los primeros tres digitos indican un area 0 region, y los siguientes tres digitos indican la estaci6n.

Mascaras de subredes

Algunas de las clases necesitan mas filtrado que otras, Una red con 16 millones de nodos es excesiva si todos se encuentran agrupados en un unico espacio, Como uno mismo se configura la computadora Linux y la red, puede haber observado el termino miiscera de subred. La llegada de CIDR ha simplificado la complejidad de grandes subredes [RFC950].

La mascara de subred se especifiea para identificar el grupo de direcciones contiguas que una interfaz puedc alcanzar en una red. Con esto se obtiene un filtro adicional que permite a ciertos mensajes espedficos pasar de un lado a otro. Cuando un mensaje llega, el TOuter utiliza la mascara de subred en la direccion de destino del mensaje. Si coincide, el router deja pasar el mensaje. Puede construir mascaras de la forma que desee, pero el conjunto de bits menos significativo especifiea la subred.

Por ejemplo, si tenia una red pequefia de ocho maquinas, y previo que el grupo creciera no mas de cinco maquinas, podria establecer la mascara de subred del roulera 187.35.209.176. El ultimo bit en la direccion csta en 176 (141Cl1,OOOO). El rango de direcciones esta en 13 parte 'X' (subred active) de 1101,XXXX. A partir de aquf, puede repartir las direcciones: 187.35.209.176 (router), 187.35.209.177 (host numero 1), hasta la 187.35.209.~'~. Puede tener cualquier combinacion, pern el bit del conjunto menos significativo es el marcador.

MASCARAS DE 5UBRED VDIRECCIONES POR OMISI6N

AI usar la mascara de red coma una direcci6n host puede causar conflicto y perdida de paquetes. Esto es debida a la direcci6n especial 0 (cera). EI ejempla, 187.35.209.0, tiene los ultimos echo bits a cera. Si la direcci6n se correspande con la mascara de red, esa es la direcci6n cera. Deberfa siempre reservar la direcci6n cero para la direcci6n de red de la mascara. Asirnisrno, puede haber observado que el ejempla amite 187.35,209.223. Si fuera a usar ese ID, ese host nunca podra ver un mensaje. EI numero 223 tiene la subred activa todos a unos: 1101,1111. Esta es una direcci6n de difusi6n. No deberfa usar esa como una direccion de host.

En muchos casas no necesita preocuparse de como configurar routers, la configuraci6n esta mas alla del ambito de cste libro. Normalmente, cuando observa la mascara de subrcd en la configuraci6n de red, puede aceptar la mascara que el script Ie ofrece.

Routers y resolucion de direcciones

Las redes de area local (LAN) pueden llegar a estar muy sobrecargadas por todos los rnensajes entre los hosts. Cada computadora en Internet pod ria potencial-

mente escuchar cada mensaje. Pero can todo el trafico, las redes son muy confusas, los paquetes colisionan con otros (en transmisiones simultaneas), y el rendimiento cae ccrcano a cero.

Las LAN utilizan el direccionamiento y las submascaras para limitar el trafico dentro de grupos (0 clusters) de eomputadoras. Mas alla del paso de mensajes a las interfaces apropiadas, los routers actuan como puertas de control de informacion. El trafico local pennanece dentro del cluster, y el trafico externo pasa de un lado a otro,

Los hosts utilizan 1a mascara de subred para determinar si tiene que pasar un mensaje al router. Todos los mensajes destinados al exterior pasan a traves del router, y los mensajes locales pennaneeen dentro de la subred. Este proeeso reduce la congestion en el backbone de la red.

Los routers tarnbien dirigen los mensajes hacia el destino utilizando sus tablas de rutas, Cada router indica a otros routers de la red cuales son sus rutas de red para que Ie envfen los mcnsajes que pueda encaminar eorrectarnente. Las redes de area ancha (WAN) utilizan esta caraeteristica para enviar mensajes.

Cada router a 10 largo del camino entre el arigen y el destino mira en la direccion IP, comparando las redes can las tablas de rutas. Los routers trasladan el mensaje cada vez mas hacia un destino especffieo. EI primer saIto intenta resolverlo en el duster, el segundo traslada el mensaje para resolverlo en la subred, asi sucesivamente, hasta que se resuelve la clase.

Tan pronto como el router encuentra una correspondencia (general 0 especifica), traslada el mensaje en esa direcci6n, utilizando la direcci6n MAC para enviar el mcnsaje al siguiente router. Eventualmente el cluster correspondido obtiene el mensaje, y el ARP del router reemplaza su MAC can la MAC del destino.

Un adaptador de red ethernet accpta unicamente mensajes con su ID. En cuanto cl host se inicia y estabiliza, comunica a todos los de la red su JD ethernet y su direccion IP. Esta es Ia funcion de ARP, como mencionamos anteriormente.

Direcciones desaprovechadas y especiales

Como mencionamos antes, existen algunas direcciones reservadas. La subred activa de un mascara de subred tiene dos direcciones reservadas: todo a cera (direccion de red) y todo a uno (direccion de difusion). Signifiea que cuando cuenta las direcciones que tiene en su disposicion, debe restar 2 a esc nurnero. Considere esto: si crea 100 subredes, pierde efectivamente 200 direcciones.

Esta perdida es justa al principio. Dos grandes bloques de direeciones estan reservadas para uso interno: del 0.0.0.0 al 0.255.255.255 y del 127.0.0.0 al 127.255.255.255. EI primer grupo de direcciones significa "esta red" en nomenclatura IP (vease la nota sombreada a continuaci6n). Si tiene una direccion de la red 128.187.0.0, usando el valor 0.0.25.31 en el mensaje resulta 128.187.25.31, implicitamente.

En 1992, el Cornite de arquitectura de Internet (lAB-vease la RFC 1160 para el disefio, ingenieria y administracion de Internet), llego a estar muy preocupado con cl crecimiento explosivo de Internet-inc1uso con todas las tecnicas de direccionarniento y planificaci6n esmeradas. La adjudicaci6n de direcciones sobrepaso los 450 millones de nodes. El comite vio que el incremento en las asignaciones acabana con el espacio de direcciones disponibles. Sin embargo, 56]0 el 2% de las asignaciones fueron realmente utilizadas, (D6nde estaban el resto de todas las direcciones?

lAB asigna rangos de direcciones a comparuas en bloques enteros, Las compamas. anticipandose a usos adicionales y con el fin de mantener sus direcciones 10 mas contiguas posible, compraban rangos muy superiores a sus necesidades reales,

~~~ft5ti;}~·A9~Ab'6R~i> --~-

En un lugar pequefio donde trabaje me mostraron su asignaci6n de 128 dlrecclones; solo 30 estaban en usa a la vez. Me asignaron 10 unidades. Nunca utilice mas de 2. A dfa de hoy, creo que aquellas direcciones pueden seguir asignadas ami, aunque deje la cornparua hace cuatro aries,

En todo, las exccpciones de direcci6n y las asignaciones desperdiciadas han comido la mayor parte del espacio de direcciones, Estimaciones recientes indican llue las rcdes de Clase B y C estan cornpletas. Los ISP estan utilizando mas de c1ase

A. Dentro de poco tiernpo, la dernanda puede utilizar todas las direcciones.

LQU€ va haccr Internet con el espacio de direcciones perdido? (Como puede el direccionamicnto IP actual utilizarse mejor? lAB, ahora Hamada Internet corporation for assigned names and numbers (lCANN), no puede reclamar facilmente las unidades inutilizadas vendidas a las compafiias. porque los departamentos IT de las cornpafuas han ya asignado esas direcciones dentro de la organizacion.

Muchas cornparuas ahora utilizan Dynamic host configuration protocol (DHCr) [RFC2131], 10 cual asigna una direccion IP una vez iniciado. EI host no posee una direccion IP de forma fija. DHCP ayuda tambien con la seguridad: los crackers de las computadoras adman las direcciones IP fijas, Si recuerda, bootp envia un mensaje de difusion para encontrar un servidor bootp. Cuando se encuentra, el servidor emite una direcci6n IP. De forma similar, un host normal carga su generador de peticiones durante el inicio. EI gencrador de peticiones envia un mensaje de difusion para encontrar un servidor DrICr activo. Cuando 10 encuentra. el servidor asigna una direcci6n de su grupo de direcciones disponibles y se la pasa (junto con la mascara de red apropiada) al generador de peticiones.

El generador de peticiones DHCP acepta la informacion y configura los protocolos de red del host local. En algunos casas esto puede llevar varies segundos, debido a la congesti6n de la red. Hasta que el host local es configurado correctamente, puede sufrir de amnesia IP (el host no COOl)(e su propia direccion).

~MJi~;t:!~6~;'~~~~;~~-----~-~--------

La amnesia de host 0 IP tarnbien sucede cuando el nombre de la red y el host no

estan correctamente configurados. Puede ser un problema serio. Hasta ejecutar un ping 127.0.0.1 puede no funcionar. Si el host tiene amnesia, compruebe la distribucion. La distribuci6n Red Hat (y derivados) utiliza letclsysconfig/network y letclsysconfig/network-scriptslifcfg- * para definir y establecer los valores.

Otra soluci6n es prolongar el tamano de la direcci6n IP. Introduciendo: jIPv6 [RFC2460]! IPv6 en resumidas cuentas es cuatro veces el tamafio de una direccion IP: 128 bits contra 32 bits. IPv6 tarnbien cambia la apariencia de forma drarnatica:

8008:4523:FOEl :23:830:CF09: 1 :385

El resultado es una direccion dificil de recordar.

La ventaja principal de IPv6 es que bene el espacio de direcciones mas grande para trabajar, Can mas de 3x1038 direcciones elimina probablemente cualquier problema de limitaciones de direcciones par muchisimo tiempo. Para obtener mas informacion vease el Capitulo 17, "Como compartir mensajes con multidifusion, difusion y Mbonc".

Numeros de puertos de host IP

Todos los mensajes llcgan a una 0 mas direcciones reconocidas. Si un programa acepta estos mensajes, puede recibir informacion destinada para otros programas en eiccucion. EI sistema operative tiene poca consideraci6n hacia donde se dirige el mensaje, con tal de que se entregue. La pila TCP lIP afiade el concepto de puerto. Un sistema puede tener varios puertos disponibles. todos asociados con la misma direccion.

La pila TCP I IF' afiade los puertos para abstraer la red y facilitar la programacion. Estos no son puertos fisicos reales. Son canales que el subsistema de red utiliza para redireccionar la informacion al programa apropiado. Todos los programas de red no reciben todos los rnensajes que llegan; sino que s610 reciben los rnensajes de su puerto.

En la red basada en Internet, cada paquetc peculiar de datos iP tiene la direccion del hasty el nurnero de puerto. Cuando un paquete Uega de la red, un campo de 16 bits en la cabecera del paquete indica el numero de puerto de destine. EI sistema operativo lee este campo y coloca el paquete nuevo en la cola de puertos. Desde alli, el programa lee el socket (con la Hamada del sistema readO a recvO). Asimismo, cuando el programa transmite un mensaje (mediante la Hamada del sistema writeO o sendO), el sistema operativo coloca los datos en la cola saliente del puerto.

Por omision, solo un programa JXlsec un puerto. De hecho, si se intenta ejecutar dos programas que asignan el mismo nurnerc de puerto en la misma computadora, la llamada del sistema devuelve un codigo de error EINVAL. Se puede compartir un puerto utilizando SO_REUSEADDR (vease el Capitulo 9, "Como romper las barreras del rendirniento").

COMO COMPARTtR PUERTd~)~";~M; -------

La regia de que dos sockets no pueden compartir el mismo puerto se aplica tambien a los procesadores sirnetricos. La razon es simple: los procesadores, como recursos, comparten la memoria y el sistema operativo. Si se tienen dos sistemas operativos funcionando, se pueden tener te6ricamente dos sockets en programas separados en ejecucion con el mismo nurnero de puerto, con tal de que estos residan en diferentes espacios del sistema operativo.

Todos los servicios estandar tienen asignados numeros de puerto. Se puede ver la lista completa en letdservices, en el Apendice A. "Tablas de datos", y en la estaci6n de trabajo Linux. A continuaci6n se muestran unos pocos puertos estandar:

Puerto Nombre del servicio, alias
1 tcpmux
7 echo
9 discard
13 daytime
20 ftp-data
21 ftp
23 telnet
25 smtp, mail
37 time, timeserver
42 narncscrvcr
70 gopher
79 finger
HD WWW, http Descripcion

Multiplexor del servicio de puertos TO'.

Servidor ceo.

Como I dev I null.

Fecha y hora del sistema. Puerto de datos FTP.

Conexion FTP principal. Conexion Telnet.

Com·oUNIX.

Servidor de hora.

Resolucion de nombres (DNS).

Informacion con menus de tcxto.

Usuaries actuales,

Servidor web.

Se pucdo encontrar una lista mas completa en el Apendice A.

Probablementc reconozca algunos de estes servicios. El formato del archivo es legible: numcro de puerto, nombre de servicio. alias y descripcion, Puedc interactuar con muchos de ellos usando Telnet 0 el programa mostrado anteriormente. Tenga presente que, aunque letdservices puede inc1uir un servidor. la cornputadora puede que no tenga el servidor asociado ejecutandose (par ejcrnplo, la distribucion Mandrake no habilita los servicios de hom). Todos los puertos incluidos en el archivo letdservices estan reservados. por 10 que su uso puede causar conflictos.

El programa basado en sockets utiliza algunos puertos locales para toda la comunicaci6n: esto es responsabilidad elemental de bindt). Aunque no se utilice la Hamada del sistema bindf), ya que €I programa utiliza el socket para cualquier E/S, el sistema operativo asigna un puerto local disponible al socket.

~~fh-i~':;Ni",~;Mi~"i:~~---------~-

Como parte de la seguridad del nucleo, los puertos con valor menor a 1024 requiere acceso de root 0 privilegiado. Par ejemplo, si desea crear un servidor de hora (puerto 13), el usuario root debe de ejecutar el programa (0 con SUID de root). SUID es un acronirno de "Set user ID" (establece el ID del usuario). Cada programa en el sistema de archives puede permitir a los usuaries que to ejecuten como si el propietario del programa 10 hiciera. Normalmente, cuando un usuario ejecuta un programa, este programa tiene los mismos permisos del usuario. Algunas veces el programa necesita permisos diferentes 0 adicionales. AI cambiar el identificador del usuario, el programa se puede ejecutar como si 10 hiciera et propietario. Por ejernplo, lusr/binlat necesita acceder a las tablas eron (propiedad del root). Para que esto ocurra, lusr/binlat cambia automaticamente el acceso a root. Para obtener mas informacion, se puede consultar la documentadon del UNIX estandar, Precaucion: el SUID de root es una fuente potencial de riesgos de seguridad. Nunca se debe crear 0 estabtecer el SUID mientras se es root, a menos que se conozca el programa muy bien y se conozcan todos los riesgos.

Como se ha advertido previa mente, si no se rcaliza la asignacion de un puerto a un socket, eI sistema operative asigna uno automaticamente. Estos puertos asignados dinamicamente y autornaticamente se Haman puertos eiimeros. Linux parece seguir el estilo BSD en la asignacion de puertos: asigna los puertos effrneros a partir del puerto 1024.

Di~"~lti\1j.iSI!GtiM>·

AI experimentar con diferentes puertos, se pueden seguir estas reg las simples:

Ejecutar y depurar un programa como un usuario corriente (no como root). Usar puertos y direcciones que no afecten a otros 0 causen riesgos de seguridad. Registrar el origen de todos los mensajes entrantes.

Ordenaci6n de bytes de red

Muchos tipos distintos de computadoras pueden residir en una red, pero es posible que no utilicen el misrno procesador. Todos los procesadores no almacenan sus mirneros binarios de la misma forma. Las computadoras usan dos tipos de almacenarniento de ruirneros binarios basicos: big-endian y little-endien. Simplemente, los numeros big-endien se leen de izquierda a derecha; los nurneros little-cndian se leen de derecha a izquierda. Por ejernplo, considere el rnimero 214.259.635. En hexadecimal, el numero se lee como #OCC557B3. Un procesador big-endien alrnacena este valor como sigue:

Direcci6n:

00 0C

01 C5

02 57

03 83

04

Datos:

Se debe observar que el byte mas significative (Oc) esta listado primero. EI proeesador little-endien 10 almacena al reves:

Direccion:

00

01

02

03

04

Datos: B3 57 C5 0C

Se debe observar que el byte menos sigruficativo (B3) esta listado primero.

La utilidad de los distintos endianness es un asunto largo de debate. Aqui no se resucitan estas discusiones, 5610 se apuntan los usos importantes y las diferencias. Por supuesto, lpor que no se puede utilizar sencillamente ASCII hexadecimal? La representacion es ineficaz, doblando el numero de bytes que se necesitan. Para que las eomputadoras de una red heterogenea se comuniquen eficientemente, tienen que usar binario y deben establecer un endianness. EI endianness de una computadora 0 host es el otden de bytes de host. De la misma forma, el endianness de una red se denomina orden de bytes de red. El orden de bytes de red es siempre big-endian.

Uso de herramientas de transforrnaclon de Internet

Haee muchos afios, se eligi6 que el protoeolo de red entendicra big-endian. Esto es bueno para procesadores big-cndien. pem .:que hay de los little-endiani Se disponen de varias herramicntas que ayudan a realizar la transformacion. Los programas de red utilizan estas herramientas todo el tiempo para rellenar la estruetura struct sockaddr _ *, sin preocuparse del endianness del proceso. Ahora, otra dificultad: todos los campos de la estructura no estan ordenados en bytes de red. Algunos son ordenados en bytes de host. Considere el extracto de codigo del Capitulo 1, "Recetario del cIiente de red":

/*** Ejemplo de herramientas de transformaci6n: /*** como rellenar sockaddr_in.

* * * /

* *. /

struct sockaddr_in dest;

char *dest_addr = "127.0.0.1";

dest.sin_family = AF_INET;

dest.sin_port = htons(13); /* Puerto n213 (servidor de h~ra). */ if ( inet_aton (dest_addr I &dest. sio_addr) == 1 ) {

EI codigo rellena tres campos: sin_family, sin_port y sin_addr. sin_family es un campo ordenado en bytes de host, as! que no necesita transformaci6n. Los otros dos estan ordenados en bytes de red. EI campo sin_port de dos bytes transforma el

puerto 13 utilizando htonsf), Existen varias herramientas transformadoras como a continuaci6n:

Llamada Significado
htons De host a red (short)
htonl De host a red (long)
ntohs De red a host (short)
ntohl De red a host (long) Descripdon

Convierte 16 bits binarios a big-CIldian. Conviertc 32 bits binarios a big-endien. Convierte 16 bits binarios a formate de host.

Convierte 32 bits binaries a forma to de host.

En el Apendice B, U API de red", se muestran estas funciones con mayor detalle, Es de interes, que la utilizacion de estas herramientas no consume ningun tiempo de CPU si la cornputadora cs big-endian (orden en bytes de red).

La siguiente Hamada del ejemplo, inet_atonO, transforma la direcci6n IP ASCII (usando notaci6n punto) al binario equivalente. Tarnbien se convierte a la ordenacion de red (no se necesita llamar a htonl{) en el resultado), A continuaci6n se muestran otras llamadas:

Llamada

Desui pd6n

inet_atonO

inet_addrO

inet_ntoaO

gethostbynameO

getservbynameO

Transforma la notacion punto (###.###.###.###) al binario ordenado en red. Devuelve cero SI falla y distinto de cero si la direccicn es valida,

Obsolete (la misma que inctuton). No gestionil los errores correctamente. Si ocurre un error, devuclvc -1 (255.255.255.255-la direccion de difusion general).

Transforma un binario IP ordcnado en red a un ASCII en notacion punto decimal.

Prcgunta al servidor de nombres para transforrnar el nombre (como pur ejemplo www.linux.org) a una 0 mas direcciones [I'.

Obtienc el puerto y protocolo asociado a un servicio del archive letdserv ices.

Las bibliotecas ofreccn rnuchas mas herrarnientas de funci6n que estas, En este libro sc trata 5610 unas pocas que se consideran utiles. Para obtener mas informacion de estas llamadas de funci6n, se puede consultar el Apendice B.

AI..CANt:E'DE·LA,'TRANSPoftTAt!ft,DAD' '

Para qulenes piensan que probablemente no tengan que preocuparse sobre estas herramientas de transformacion, deben considerar esto: la idea qlobal del desarrollo del software Linux es realizarlo compatible con todos los sistemas, i.es correcto? AI usar esas IJamadas no se hace dana a nada a pesar de Ia plataforma. Generalmente, es una buena practka de proqrarnacion programar como si fuera a ser trasladado a otro procesador.

Si esta probando a transformar de un formato a otro, puede encontrar la funcion transformadora adecuada en alguna biblioteca. Esa es la belleza del uso de la tecno- 10g1a establecida como la compatibilidad de POSIX. Par supuesto, eso significa que existen muchas herramicntas para exarninar, 10 cual ayuda a tener las herrarnicntas agrupadas por su funcion, (Esa es la razon par la cual este Iibro incluye varias paginas de manual aplicables en los apendices.)

Aplicaci6n de las herramientas y extension del cliente

El proximo paso es extender la funcionalidad del lector de hora can la capacidad de enviar un mensaje y conseguir la respuesta. De nuevo, un descriptor de socket se pucdc intercarnbiar con un descriptor de archivo. Al igual puede utilizar rea dO, puede utilizar writeO:

#include <unistd.h>

ssize_t write(int fd, const void 'buf, Slze_t count);

He aquf algunos errores comunes que se pueden encontrar:

• EBADF. fd no es un descriptor de archive valido 0 no se pucde abrir para escritura. Por ejemplo, cl programa cerro ya el descriptor de socket, 0 cl socket nunca fue abierto correctarnente (comprobar el valor devuelto de la Hamada socket(».

• EINVAL. fd esta asociado a un objeto que es inadecuado para la escritura, Esto pucde ocurrir si el programa habia ccrrado previamente el canal de escritura.

• EFAUL T. Se especifico una direccion de espacio de usuario no valida en un parrimetro, EI puntero buf no apunta a un cspacio valido, Cuando la Hamada intento acceder a la region de memoria, obtuvo una infraccion de segmentacion.

• EPIPE. fd esta conectado a un canal 0 socket euyo fin de lectura esta cerra do.

Cuando esto ocurrc cl proceso de escritura recibe una serial SIGP1PE; si se atrapa, bloquea 0 ignora esto, se devuelve el error EPIPE. Este error ocurre 5610 en la segunda Hamada writer). Un escenario puedc ser:

1. Un diente se conecta a un servidor y envia algunos datos.

2. EI servidor lee parte del mensaje. luego cierra la conexion (0 falla).

3. No se conoce ningun problema, el cJiente envia el siguiente bloque de datos.

De igual modo que en la llamada write{), puede substituir e1 descriptor de archivo (fd) can un descriptor de socket (sd). Como ejemplo, a continuacion puede ver parte de una salida de socket tipica can writeO:

int sd, bytes_written = 0, retval;

sd = socket(AF_INET, SOCK_STREAM, 0);

... 1*** Conectar al host. w**1

while ( bytes_written < len /* Repetir hasta que todos */

{ 1* ... los bytes del mensaje son enviados. */

retval ~ write(sd, buffer+bytes_written, len);

if ( retval >~ 0 )

bytes_written t~ retval;

else

I*--Informar de error de conexi6n.--*/*/

}

Par otro Iado, a continuaci6n se muestra parte de Ia salida de un socket tipico con fprintfO a traves de Ia transformaci6n del descriptor de socket a FILE*:

FILE *sp; int sd ;

sd ~ socket(AF_INET, SOCK_STREAM, 0);

--. 1*** Conectar al host. ***1

sp fdopen(sd, 'w"); if sp ~= NULL

perror('FILE· conversion failed');

/* Crear FILE· desde el socket. */

fprintf(sp, "%s, %s, %s\n',Name, Address, Phone);

Se debe observar en el primer ejernplo, que el programa tiene que realizar un bucle con writeO para obtener todos los bytes externos. Aunque esto es un flujo de socket, no puede garantizar que el programa envie todos los bytes en seguida, EI segundo ejemplo no tiene esta limitacion, porque FILE* tiene su propio subsisterna de gestion de buffers de datos, Cuando se escribe en un bufer FllE*, el subsistema obliga a esperar hasta que se envian todos los bytes.

Hay, por supuesto, un socket dedicado para escribir la llamada: sendt). Como la llarnada recvO, da al prograrnador mas control sobre la ejecuci6n de la transmisi6n. La declaraci6n del prototipo es:

#include <sys/socket.h>

#include <resolv.h>

int send(int sd, const void *msg, int len, unsigned int flags);

Todos los parametres son los misrnos que en writeO excepto el ulumo=ftaqs.

La Hamada del sistema sendO tiene varias opciones que ayudan a revisar el funcionamiento de la Hamada:

• MSG_OOB. Envia datos "fuera de banda" (ooB). Como se utilizo antes, eso permite enviar un byte a un equipo hornologo, diente 0 servidor para indicar una condicion urgente, El receptor tiene un s610 byte dedicado para datos cx)B; subsiguientes mensajes CX)B sobreescriben el ultimo mensaje. Cuando un mensaje ooB llega, el sistema operativo emite una SIGURG (serial urgente) al programa responsable.

• MSG_DONTROUTE. No permite el encaminamiento del paquete. Esto ocasiona que el paquete omita las tablas de rutas, obligando a la red a intentar contactar directamente con el receptor. Si el destine es inaccesible dircctamente, la Hamada produce un error ENETUNREACH (red inalcanzable), Solamente utilizan esta opcionprogramas de diagnostico a de encaminamiento,

• MSG_DONTWAIT. No espera a que sendO finalice. Esta opcion permite al programa proceder como si sendQ estuviera hecho (0 delegado). Si se utiliza, el sistema operative emite una serial SIGIO, para indicar una operacion writeO completa. 5i la operacion se bloquea porque la cola de sendO esta llena. la Hamada devuelve un error y establece EAGAIN en errno.

• MSG_NOSIGNAL. No emite ninguna serial SIGPIPE. Si el otro extreme cierra pronto, y si el programa local envia otro mensaje, se puede obtener una serial SIGP1PE. Si no se esta preparado para esta sefial, el programa detiene su ejecucion.

El uso de la Hamada del sistema sendO es similar al uso de recvO. Si quiere agregar las sefializaciones, utilice el operador aritrnetico 0:

1*** Realizar una escritura normal con un canal de socket.***1

int bytes_sent;

bytes_sent = send(sd, buffer, MAXBUF, 01;

I*Enviar cualquier dato fuera de banda desde el canal de socket.*1 int bytes_sent;

bytes_sent = send(sd, buffer, MAXBUf, MSG_OOB : MSG_NOSIGNAL);

EI segundo ejernplo selecciona MSG_OOB y MSG_NOSIGNAL. Se puede recordar que estos ejernplos se diferencian en la Hamada del sistema writeO al afiadir un pararnetro nuevo para el control del socket. Ademas, el socket se debe conectar al servidor 0 host con objeto de usar writet). Aqui estan algunos errores con los que se puede encontrar:

• EBADF. 5e especific6 un descriptor invalido. La causa mas probable es que el programa no cornprobo cl valor devuelto de la Hamada socketf).

• ENOTSOCK. EI argumento no es un socket. A 10 mejor se mezclan los descriptores de socket y de archive.

• EMSGSIZE. El socket pidi6 al nucleo enviar atomicamente el mensaje, y cl tarnafio del mensaje a ser enviado, hizo esto imposible. Los mensajes de difusian no pueden ser fragmentados, 0 el programa establece la opcion de socket a "no fragmentar".

• EAGAIN. El socket se marca como no bloqueante y la operacion solicitada bloquearia. Este no es un error, simplemente es un "no preparado todavia". Intentar el envio otra vez mas tarde.

• EPIPE. EI extrema local ha sido ccrrado en un socket arientado ala conexion.

En este caso, el proceso recibe tambicn un SIGPIPE, a menos que MSG_ NOSIGNAL este establecido, (Identico a EPIPE en la Hamada del sistema writeO.)

Utilice la Hamada del sistema sendO para investigar un servidor. Por ejempJa, si quiere utilizar el programa finger en un servidor, abra un canal al puerto (79) del servidor, envie el nombre de usuario y lea la respuesta. Este algoritrno es normaImente 10 tIue hace el cliente.

No nccesita ninguna opci6n especial para realizar esta tarea. Sin embargo, puede desear leer tanta informaci6n como el servidor le envie. Algunas veces la respuesta puede ser mas grande que el tamafto del buffer. EI siguiente trozo de listado de pragrama muestra la implementacion del aIgoritrno. Puede conseguir el Iistado de programa complete en el CD-ROM que acompafia a este libra.

j***************************************************************/

1*** Extension del comprobador de puertos, anade 1a capacidad **/ /*** de acceder a cua1quier puerto y enviar un mensaje. ********/

I**********~**~***K*******~******K**************.***************/

int main(int count, char ·stringsll) { int sockfd;

struct sockaddr in dest; char bufferIMAXBUF];

1*- .. Crear un socket y asignar un mime ro de puerto. . .. * 1 * / sockfd = socket (AF_INET, SOCK_STREAM, 0);

bzero(&dest, slzeof(dest»);

dest.sin_family = AF~INET;

dest.sln_port = htons(atOi(strings[2)); inet~addr(strings[11, &dest.sin_addr.s_addr);

1*'" Conectar a un servidor y enviar 1a petiCion. "'*/*1 1 f ( connect (sockfd, &dest, sizeof (de st)) ! = 0 )

PANIC ( "connect () failed"); printf(buffer, "%s\n", strings[3]); send(sockfd, buffer, strlen(buffer) , 0);

/* ... Vaciar el buffer y leer 1a respuesta CORTA .. --*/*/ bzero(buffer, MAXBUF);

recv(sockfd, buffer, MAXBUF·1, 0);

printf ( "%s", buffer);

close(sockfd);

return 0;

Si quiere utilizar este algoritmo para obtencr una respuesta larga, necesita cambiar la ultima seccion a 10 siguiente:

/*** Revision del codigo para obtener respuestas largas. ***/

/ * -. Vaciar el buffer y leer la respuesta CORTA. -' * I * / do

{

bzero(buffer, MAXBUF);

bytes = recv(sockfd, buffer, MAXBUF, 0); printf("%s', buffer);

}

while ( bytes> 0 ); close(sockfd) ;

Este cambia fundona correctarnentc 51 el servidor derra la concxion despues del envio de los datos. De otro modo, el programa espera indefinidamente los datos.

La espera de la informacion es un problema particular con la programaci6n de sockets. Algunas vcces puede confiar en que el servidor cierre la conexion cuando el envio esta heche. Sin embargo, algunos servidores dejan el canal abierto hasta que el clicnte 10 cierra. Hay que ser conscientc de que si el programa espera por mucho ticrnpo, puede estar afrontando este tipo de problema.

Diferentes clases de sockaddr

Las redes soportan varios tipos de protocolos distintos, Cada protocolo ticne funcioncs Y caracteristicas cspecfficas. Para la red, solo son paquetes. Los tipos de paquete incluyen:

Sockets con nornbre

PF _LOCAL Actualmcnte no se conecta a Iii red.

Este tipo se usa cstrictamente para colas de procesamiento en el sistema de archives.

Protocolo de Internet Protocolo de Novell

PF _INET (Demostrado ya).

PF IPX Para la comunicaci6n can redes Novell.

AppleTalk

PF _APPLET ALK Para Iii comunicaci6n con redes AppleTalk

Puede encontrar mas protocolos soportados y definidos en el Apendice A. Cada tipo utiliza su propio sistema de nombrado y convcnciones, y todos elias usan la

API de Socket. Esto deberia realizar la programaci6n mas directa. Lamentablemente. hay demasiado contenido para inc1uir aqui, as! que este libro fija su atencion principalmente en el protocolo de Internet.

Canales con nombre de UNIX

Considere por unos instantes como funciona syslog. EI problema que surge es el siguiente: lcomo se podrtan coordinar varias aplicaciones que son susceptibles de emitir errores 0 mensajes en diferentes momentos? Syslog es una herramienta que acepta mensajes como estos. La API de Socket tiene ya incorporado este tipo de coordinacion,

Los sockets con nombre perrniten que varios programas locales se envien mensajes (0 paquetes). Ellos tienen nombre, porque crean realmente un archivo en el sistema de archives. La comunicaci6n es solo local; nada pasa a traves de la red, y un cliente de red no puede conectarse a el.

Funciona como un socket normal: puede crear una conexi6n de flujo a de datagrama. Como se dijo anteriormente, la unica diferencia es el sockaddr. He aquf como configurar el canal con nornbre:

1*** Ejemplo de socket con nombre de Unix.

#include <sys/un.h> int sockfd;

struct sockaddr un addr;

sockfd ~ socket (PF_LOCAL, SOCK_STREAM, 0); bzero(&addr, sizeof(addr)); addr.sun_family ~ AF_LOCALj

strcpy (addr. sun jiath , "I tmp/mysocket" ) ; / * Asignar nombre. *1 if ( bind(sockfd, &addr, sizeof(addr)) I= 0

perror("bind() failed") j

Todo deberia parecer relativamente familiar. El campo sun_path permite un camino de hasta 104 bytes (incluyendo la terminacion NULL). Desde aquf, puede usar todas las llamadas API normales. Es 10 mismo para todos los protocolos soportados.

Despues de ejecutar este fragmento, puede mirar en Itmp para observar el archivo nuevo. Asegurese de borrar este archivo antes de la ejecuci6n de nuevo del programa.

Resumen: aplicacion de herramientas y nurneracion \P

La API de Socket es una herramienta de interacci6n muy flexible para la programaci6n en red. Esta soporta varios protocolos distintos, permitiendo conectar e interconectar con otros protocolos de funcionamiento en red.

EI protocolo de Internet utiliza direccionamiento que incorpora en los mensajes de encaminamiento y los grupos de clustering de las computadoras. Esto haec a cada mensaje aut6nomo del gestor del origen: un mensaje dejado en la red puede conseguir el destine a traves del encaminamiento y las tablas ARP. Sin embargo, debido a la flexibilidad del direccionamiento y la asignaci6n escasa, la asignacion de direccionamiento esta perdiendo bloques de direcciones validas.

Parte de Ia pila TCP lIP resume la red can puertos. La mayo ria de conexiones utilizan puertos para comunicarse can programas especificos en otras computadoras de red como SI poseyeran la conexi6n de red. Esta caracterfstica facilita la programaci(m y reduce la inundacion de mensajes que el programa podria rccibir realmente.

La red utiliza tipos y ordenaciones de bytes tendinnncss) especificos para pasar los mensajes de una parte a otra. sockaddr define el protocoio, direccion y puerto de la conexion. Debido a todos estos formatos de datos distintos, la API de Socket ofrece muchas herrarnientas de transformaci6n para el direccionamiento (por ejemplo, inet_addrO, inet_atonO, inet_ntoa(» y para cl endianness (htonsl), ntohst). htonl(».

TCP Y UDP ofrecen .11 programa nivcles de interaccion distintos, En cl proximo capitulo se definen los distintos tipos y capacidades de cada protocolo dentro de IP.

Capitulo III

Tipos de paquetes de Internet

En este capitulo

El paquete de red fundamental 47 Analisis de varios paquetes 53 Como encajan los protocolos IP 67

Como escudrifiar la red con Tcpdump 07 Escritura de un escudrifiador de red a medida 69

Resumen: eleccion de los mcjores paquetes para e1 envio de mensajes 70

La red fisica soporta distintos tipos de redes 16gicas como Novell (IPX), Microsoft (NetBEUl), AppleTalk y par supuesto, Tep lIP, Cada red logica utiliza mensajes de datos distintos llamados paquetes, como se defini6 en el capitulo anterior, Los paquetes pueden ser mensajes reales en la linea de transrnision (los cuales tienen mucha mas informacion incluida) 0 sola mente el mensaje que se esta enviando.

El paquete de red 16gico en un nivel generico consta de informaci6n sobre el urigen, destine y datos de carga MiL Cada red 16gica ofrece diversos grades de caracteristicas e interfaces (protocclos). Can la programaci6n de red, estan disponibles todos los tipos de paquetes y protocolos, Cada tipo tiene puntas fuertes y debiles significativos. Como en la compra de herramientas. la elecd6n del tipo de paquete depende de como se use,

5e puede elegir de entre cuatro protocolos de paquetes de Internet: IF raw, TCMP, UOP (generacion de mensajcs no fiables), y TCP (generaci6n de flujo), basados todos e110s en capas ubicadas encirna de la red fisica (vease la Figura 3.1). En este capitulo se describe cada tipo y se presenta sus ventajas, desventajas y usos tipicos.

FIGURA 3.1

La API de Sockets ofrece distintos niveles de mensajes fiables.

EI paquete de red fundamental

5i sc pudiera realmente observar los bits que viajan de una computadora a otra, (que se veria? Cada protocolo es muy distinto, pero todos compartcn una caracteristica necesaria en cormin: todos transportan el mensaje del programa. Algunos protocolos induyen la direccion origen, mientras otros requieren la del destine. Se puede pensar que no requerir un destino es un poco usual, pero algunos protocolos (como Ul.X'P) utilizan la conexi6n como la direccion de destino.

EI protocolo de Internet (IP) [RFC79l] requierc que un paquete tenga tres elementos basicos: origen, destine y datos. (La carga util de datos induye su tarnafio.) Estes elementos ofrecen un nivel de autonomia al paguete. No importa donde esta el paquete, se puede idcntificar de donde viene, d6nde va y c6mo es de grande.

La autonomia del paquetc es una caracteristica de Internet. Mientras el paquete este vivo (los datos son oportunos y relevantes), los routers trasladan los datos a su destino cuando el paquete esta activado sabre la red.

A(I~~i'fij(ii~~;l~~Q{,~~:;~' ~

La autonomfa que tiene el paquete tarnbien conlleva una parte negativa. Mientras un paquete ofrece la forma de lIegar a cualquier sitio desde cualquier parte, un programador malicioso puede facilmente engaf'lar a la red. La red no requiere que la direccion del host origen este validada. Hacer aliasing 0 spoofing (en mascaramiento de la verdadera identidad asumiendo una distinta) de la direccion hardware es dificil, pero los programas pueden enmascarar otros ID. Se debe observar que nudeos de Linux recientes no permiten el spoofing.

Como se trat6 en el Capitulo 2, "Elocuencia del lenguaje de red TCP/IP", el paqucte de red esta en cl orden de bytes de red (0 big-endieni. Recordando esto, observe Ia definicion de la estructura del paquete de red en el Listado 3.1. La Figura 3.2 muestra el esquema fisico de la cabecera IP.

listado 3.1 Definicion de la estructura IP

/~** Definicion del paquete IP.

* *" /

~typedef unsigned int uint; #typedef unsigned char uchar;

struct ip_packet {
uint version:4j /* INota] versl.on de 4 bits. */
uint header_len:4; /* [Nota] tamano de cabecera en words.
uint serve_type:8; I· [Nota] como servir el paquete. * /
uint packet_len: 16; /. Tamano total del paquete en bytes.
uint 10:16; I· [Notal ID del paquete. */ */

*/

uint __ reserved:1; uint dont_frag:1; uint more_frags:1;

'" Siempre cero. ~I

/* Flag para perm1tir la fragmentaciOn. */ /* Flag para 'contin~an m~s fragmentos'. */

uint frag_offset:13; /* Ayudar a 1a recomposicion. */

(continua)

Ustado 3.1 Definicion de la estructura 1 P (continuaci6n)

uint time_to_live: 8; /* [Nota] numero de saltos de router permitidos. */
uint protocol:8; /* [Nota] ICMP, UDP, TCP. " /
uint hdr_chksum:16; /* Suma de comprobacion de la cabecera. "/
uint IPv4_source:32; /* Direccion IP del origen. "/
uint IPv4_dest:32; /" Direccion IP del destino. " /
uchar options[] ; / " [Nota] hasta 40 bytes. "/
uchar datal] ; /* [Nota] datos del mensaje hasta 64KB. */ };

o

8 bits a bits
Version I Longitud Tipo de servicio
Longitud de paquete
10 de paquete
o 10FIMFI Oesplazamiento de fragmento
Tiempo de vida Protocolo
Suma de comprobacion de cabecera
- - - - - - - - - - - - - - - - - - - - - 01 reccion origen I Pv4 - - - - - ____ ~ ___________ T
- - - - - - - - - - - - - - - - - - -- Dueccion destino IPv4 ___ ~ _________ T ______
~8 Opciones IP (hasta 40 bytes) ;~
~~ Datos (hasta 65535 bytes - cabecera) ;~ 2

4

6 8

10

12

16

20

20-60

FIGURA 3.2

Esquema de la cabecera IP.

Se observa que Ia estructura del paquete incluye muchos mas campos de los cuatro campos basicos vistos anteriormente en este capitulo. EI subsisterna IP utiliza estos campos adicionales para controlar el paquete. Por ejemplo, el campo dont_frag especifica a la red que, en lugar de desmenuzar el mensaje en trozos pequefios, se deberia aceptar el mensaje completamente ° rechazarlo,

Los comentarios al lado de los campos ofrecen una descripcion suficiente. Los siguientes apartados definen los campos IP que se pueden modificar 0 usar. Este libro no es exhaustive, si desea aprender mas sobre cada campo, puede consultar una buena documentacion en los RFC de los protocolos TCP lIP.

Campo version

Estc primer campo IP es el numero de version del protocolo IP. Muchos de estos valores estan reservados 0 sin asignar; por ejemplo, IPv4 coloca un 4 en este campo. Los pocos valores definidos estan inc1uidos en la Tabla 3.1.

Tabla 3.1 Valores del campo version

Valor Descripcion/Uso

4 IPv4.

5 Modo de datagrama IP de flujo (Il' experimental).

6 IPv6.

7 TP / IX (el "proximo" protocoio de Internet).

8 El protocolo de Internet "P".

9 TUBA

EI (mica cambio que ticne que hacer en este campo es cuando crea un socket raw y decide rellenar Ia cabecera (utilizando la opcion de socket IP _HDRINCU. Incluso entonces, debe establecer el campo a O. EI cero indica al ruicleo que complete este campo can el valor apropiado.

Campo header_len

Este campo indica al receptor la longitud de la cabecera utilizando words de 32 bits. Desde el valor 0, que esta reservado (y que no tiene significado), al tamano mayor de 15 words 0 60 bytes. De nuevo, la unica situacion en la que debe rellenar este campo es cuando utiliza un paquete socket rawy IP _HDRINCl. Como todas las cabeceras IP ticnen al menos 20 bytes, el valor minimo de este campo es de 5 (20/4) bytes.

Campo serve_type

EI campo serve_type indica como administrar el paquete. Tiene dos subcarnpos: un subcampu precedence (ignorado en muchos sistemas) y un subcampo de tipo de servicio (TOS). Norrnalmente establecera TOS con la llarnada del sistema setsockptO. TOS tiene cuatro opciones: retardo minimo, rendimiento maximo, fiabilidad maxima y coste minima (monetario), Si no seleeciona ningun servicio especial significa una adrninistracion normaL (Para obtener un mayor detalle de setsockoptO y sus valores vease el Capitulo 9, "Como romper las barreras del rendimiento" .)

Campo 10

El subsistema IP le da a cada paquete un ID unico, Con un campo de solo 16 bits, puede uno imaginarse que se a1canzan rapidarnente los numeros usados con anterioridad. Sin embargo, el subsistema IP reutiliza un 10 por medio de la hora del sistema, el paquete que se envio previa mente del mismo valor probablemente haya caducado ya.

El 10 ayuda a recomponer paquetes fragmentados. Si decide adrninistrar la cabecera (IP _HORINCL), debe administrar los 10 tarnbien.

tif8~g~~8i. ~~ ___

Si decide manipular la cabecera recuerde que su programa no es el unico que puede enviar mensajes. Et subsistema tP sigue la pista de los tD. Debe tener precaucion (y utiJizar proqrarnacion adicional) para reducir ta probabilidad de seleccionar un ID que el subsistema pueda usar 0 haya usado.

Campo frag_offset y flags dont_frag y more_frags

Estos fl<1gS controlan como fragmentar los paquetcs 0 si se fragmentan. Cuando un paquete extenso atraviesa la red y se encuentra con un segmento de red reducido (uno que no pueda soportar el tarnano de trarna del paquete), el router puede intentar dividir el paquete en trozos mas pequenos (fragmentaci6n). Un paquete fragmentado permanece fragmentado hasta que Ilcga al destine. Puesto que cada fragmento tiene su propia cabecera IP, la sobrecarga fija disminuye el rendimiento de la red.

~'~'~~~~~6';~~;~'~·

DE PAQUETES DEL NUCLEO ------------Cuando el host es un router se puede elegir que el nucleo de Linux recomponga los paquetes fragmentados. Esta opcion es parte de la seccion firewalf/router en la confiquracion del nudeo. Se debe observar que la recornposicion de los paquetes requiere tiempo, especialmente si estes estan disperses y Uegan a distinto tiempo. Sin embargo, como el destino tiene que recomponer los paquetes de cualquier forma, seleccionando esta opcion se reduce el trafico de red dentro del firewall (en la intranet del destine).

El bit dont_frag indica al router 0 host que no divida el paquete. Si establece este bit y el paquete es demasiado grande para un segmento de red reducido. el router descarta el paquete y devuelve un paquete de error (ICMP).

EI bit more_frags indica al destino que existen mas trozos del paquete fragmentado. El Ultimo fragmento establece este bit a O. (Un paquete no fragmentado tiene

cstc bit a 0.) Si configura la cabecera manualmente, debera establecer siempre este bit a O.

El campo frag_offset indica a que zona del paquete pertenece el fragmento.

Puesto que los fragrnentos de los paquetcs pueden viajar a traves de diferentes rutas en la red, pueden llegar a su destino en mornentos diferentes. EI destino tiene que recomponer el paquete, y utiliza el offset para colocar el fragmento en su localizacion correcta.

El campo frag_offset es de s610 13 bits de largo----demasiado pequeno para un paquetc que puede llegar a ser de 64KB. EI offset se multiplica por 8 para colocar la posicion del byte real en el paquete. Esto significa que cada fragmento (excepto el ultimo) debe ser un multiple de 8. El subsistema 1P administra completamente la fragmentaci6n y recornposicion del paquctc, no se debe preocupar de ella.

Con estos campos y el 10 del paquete, el subsisterna IF puede fragmentar y recomponer el paquete. Si el subsistema no puede conseguir todos los trozos dentro de un tiernpo especifico. desearta el paquete y devuelve un error al origen.

Campo time_to_live (TTL)

Este campo contaba originalmente el ruimero de segundos que un paquete podia perdurar en la red durante su transite. Mas tarde, el significado cambi6 al nurnero de saltos de router. Un sslto es la transici6n a traves de un host 0 router tnodo) donde el nodo traslada activamente un paquete de una red a otra.

Este campo de 8 bits permite hasta 255 saltos de router antes de ser descartado.

Cuando un router 0 host de reenvfo obtiene eI paquete, resta este campo en uno. Si el campo es igual a cero antes de la llegada al destine. el nodo descarta el paquete y envia un error al origen. El campo TIL evita que existan paquetes dando vueltas indefinidamente en la red.

Se puede utilizar la opcion de socket IP _ TTL para establecer este valor (vease el Capitu 109). Alternativamente, se puede establecer la opci6n directarnente si sc clige eI tratamiento de cabecera IP directo UP _HDRINCl).

Campo protocol

Cada paquete en Internet tiene un valor de protocolo asignado, e ICMP (lPPROTO_leMP a 1), UOP (IPPROTO_UDP 0 17) Y TCP (lPPROTO_ TCP 0 6) poseen cada uno un codigo. EI protoeolo indica al sistema como tratar el paquete entrante. Puede establecer este valor con la opcion SOCK_RAW en la Hamada del sistema sockett). EI valor de protoeolo es el ultimo para metro de la Hamada. EI archivo de cabecera netinetlin.h del rurcleo contiene muchos mas valorcs. (Sc rccucrda que aunque el nucleo incluya una definicion de protocolo, este puede que no 10 soporte.)

Campo options

E1 subsisterna IP puede pasar varias opciones con cada paquete. Estas opciones incluyen informacion de encaminamiento, marcas de tiempo, medidas de seguridad, registro de encaminamiento y alarmas de caminos. Este campo puede llegar a ser de hasta 40 bytes de longitud. Puesto que algunas de estas opciones dependen del sistema, nunca debe tocar estas opciones directamente.

Campo data

El mensaje se incluye aqui y puede alcanzar hasta 65.535 bytes (menos 60 bytes, del tamano maximo de la cabecera). Esta seccion de datos incluye cualquier informacion de cabecera que los protocolos de las capas superiores necesitan. Par ejernplo, lCMP necesita 4 bytes, U DP necesita 8 bytes y TCP necesita de 20 a 60 bytes.

EI sistema de paquetes de Internet basa todos sus paquetes IPv4 en esta estructura. Cada capa superior anade caracteristicas y fiabilidad.

Analisis de varios paquetes

IP ofrece varios protocolos de paquetes que se clasifican desde muy rapid os a muy fiables. Todos ellos se apoyan en la capa mas baja-el paquete basico IP. Sin embargo, cada capa se ha desarrollado para resolver problemas espedficos. Para seleccionar el tipo de paquete apropiado, se debe conocer 10 que se transmite.

Los tipos de paquctcs que probablemente sean mas de interes son: TCP, VOP, ICMP Y raw. EI conocimiento de las ventajas y desventajas de cada tipo le puedc ayudar a elegir el mas apropiado para la aplicaci6n. Cada tipo de paquete ticne distintas ventajas, como se cncuentras resurnidas en la Tabla 3.2.

Tabla 3.2 Ventajas de eada tipo de paquete
Raw ICMP UDP TCP
Sobrecarga fija (bytes) 20-60 2G---60+[4] 20--60+[8] 20-60+[20--60]
Tarnano del mensaje (bytes) 65,535 65,535 65,535 (ilimitado)
Fiabilidad Baja Baja Baja Alta
Tipo de mensaje Datagrama Datagrama Datagrama Flujo
Rendimiento Alto Alto Medio Bajo
Integridad de los datos Baja Baja Media Alta
Fragmentaci6n Sf Sf 5i Baja En esta tabla, se observa que cada tipo de paquete contiene contraposiciones, Una fiabilidad de valor baja s610 significa que no se puede confiar en el protocolo para conseguir la fiabilidad. A pesar de que las diferencias pueden ser extremas, sc recuerda que son meramente comparaciones.

Cuestiones relacionadas con los paquetes

Cada protocolo controla ciertos aspectos en la transmision, Los siguientes apartados definen cada aspecto y categoria de la Tabla 3.2. Puede ayudarle a entender par que cicrtos protocolos implementan algunas caracteristicas y omiten otras.

Sobrecarga fija de protocolo

En la sobrecarga fija de protocolo se inc1uyen dos casas: el tarnaiio de cabecera en bytes y Ia cantidad de interaccion que el protocolo requiere. Una sobrecarga alta fija de paquete puede rcducir el rendimiento, parque la red ticne que gastar mas tiempo en trasladar cabeceras y menos tiempo de lectura de datos.

Un protocolo robusto en sincronizaci6n e intercambio de sefiales incrementa la interaccion de sobrecarga fija. Esto es mas costoso en la red WAN debido a la propagaci6n de retardos, La Tabla 3.2 no incluye esta medida.

Tamano de mensaje de protocolo

Para calcular el rendimiento de la red, necesita conoccr cl tarnafio de paquete y la sobrecarga fija del protocolo. El tamafto de transmision le da el tarnano maximo de un mensaje enviado, Todos menos TCP utilizan un unico mensaje, esta limitaci6n es debida normalmente a las limitaciones del paquete IP (65.535 bytes). La cantidad de datos que cl programa transmite por paquete es el tamafio de transmision menus las cabeceras.

Fiabilidad de protocolo

Parte del problema con las redes es la posibilidad de perder mensajes. Un mensaj€' se puede corromper 0 desechar cuando se traslada de un host 0 router a otro, 0 si falla 0 se rompe el propio host 0 router, En cada caso, un mensaje se pucde simplemente pcrder, y el programa tendra que repetirlo.

Es probable tambien, que quiera asegurarse que el destine procesa los paquetes en el orden correcto. Por ejemplo, puede componer un mensaje que no cabe bien en un paqucte. Si el segundo paquete llega antes que el primero, el receptor debe conocer como identificar y corregir el problema. Sin embargo, el orden no es importante cuando cada mensaje es independiente y autocontrolado.

La fiabilidad del paquete indica la certeza de seguridad de la Ilegada de los mensajes y su orden. Baja fiabilidad significa que el protocolo no puede garantizar que el paquete alcance el destino 0 que 105 paquetes esten en orden,

Tipo de mensaje de protocolo

Algunos mensajes son autocontrolados e independientes de otros mensajes.

Fotos, documcntos, mensajes de e-mail, etc. son algunos ejemplos que se pucden adaptar al tamafio del paquete. Otros se parecen mas a un flujo de corriente. como sesiones Telnet, canales abiertos de HTTP IRFC26161, documentos, fotos 0 archivos grandes. El tip a de mcnsaje define que estilo se adapta mejor a cada protocolo.

PftbTOCoLoHT1"P

HTIP 1.0 pod ria efectivamente utilizar UDP para la transferencia de mensajes en vez de Tep. EI cliente envia simplemente la consutta de un docurnento especifieo, y et servidor responde can el archivo. Efectivamente, no se efectua ninguna Conversaci6n entre el cliente y el servidor.

Rendimiento de protocolo

El aspecto mas notable de la transmision de datos cs el rendimiento de la red. Al conseguir el valor maximo los usuaries se muestran felices. Para obtener el mejor funcionamiento, necesita conocer el rendimicnto. A rnenudo, los bits por segundo es una pequefia parte de la ecuacion cntera: indicando como la red puede rendir bajo circunstancias idoneas,

EI rendimiento de protocolo mide cuantos datos reales puede enviar cl origen al destine dentro de un periodo de tiempo. Si las cabeccras son grandl's y los datos pequefios, el resultado es un rendimiento bajo, La demands de un acuse de recibo para cada mcnsaje reduce drasticarnente el rendimiento. Por defccto, alta fiabilidad e integridad implican un bajo rendimiento y viceversa.

Integridad de los datos de protocolo

La tecnologia del funcionamiento en red tiene actualmcnte bastantes medidas de seguridad para 1.1 integridad de los datos. Algunas interfaces de red inc1uyen una suma de comprobacion 0 verificacion por redundaneia ciclica (eRC) en cada mensaje de bajo nivel. Tambien incluyen tecnologia hardware especial que puede filtrar e1 ruido y obtener 121 mensaje autentico. Adicionalmentc, cada protocolo induye medidas para detectar errores en los datos. Estos errores pueden 0 no pueden scr importantes para el programador.

La importancia de la integridad de los datos depende de los propios datos; es dccir, algunos datos requieren un seguirniento con mucho cuidado, rnientras que datos menos importantes son menos criticos. A continuacion se describen algunos tipos de datos:

• Fallo intolerable. Datos criticos de vida. Cualquier cosa que pueda afectar a la salud 0 vida privada 0 publica. Por ejemplo, sefiales de vida 0 senales vitales del equipo medico y comandos de lanzarniento de misiles,

• Critico, Datos importantes y responsables. Datos que si estan fucra de secuencia ° defectuosos pueden causar dana ala propiedad a seguridad. Par ejemplo, transacciones financieras, tarjetas de crcdito, numeros PIN, firrnas digitales, dinero electronico, secretes comerciales, actualizaciones de escaner de virus y actualizaciones de productos.

• Importantc, Datos que necesitan un funcionamiento correcto. Cualquier perdida puede causar un mal funcionamiento. Por ejemplo, conexiones Xl l , descargas de FTP, paginas web, direcciones de servidor o router, y conexiones Telnet.

• Informativo. Datos que pueden tener menos del 100% de fiabilidad para un funcionamiento correcto, Por ejernplo, e-mail, flujo de noticias. publicidad y paginas web.

• Temporal. Datos que estan asociadas a la fecha y hora, A menos que el programa utilice esta informacion dentro de un tiempo especifico, se reduce su importancia. Par ejemplo, datos climaticos, datos de supervision y datos horarios,

• Desechable, Datos que pueden degcnerarse sin perder su utilidad. Son normalmente video y sonido. Par ejemplo, pelfculas, archives de sonido, fotos y sparn (par supuesto),

Previamente a la eleccion del tipo de paquete 0 protocolo, se tienen que clasificar los datos de acuerdo a esta lista. Tambien se tiene que incluir las restricciones adicionales (0 externas) del programa. Estas tarnbien pueden ser restricciones adrninistrativas.

Fragmentaci6n de protocolo

Mensajes grandes en redes lentas pueden frustrar a los usuarios. Todas las redcs definen un tamario de trama maximo para que e50S mensajes grandes no avasallen la red. Se recuerda que los host de encaminamiento pueden dividir, 0 fragmentar, los mensajes grandes que atraviesan una red estrecha.

Cada protocolo tiene una probabilidad distinta de fragmentaci6n. Puesto que la recomposicion de mensajes fragmentados es funcion de IP, la reagrupacion se puede realizer de forma transparente a los protocol os de la capa superior. Sin embargo, existen ocasiones en las que se requiere que el mensaje este completo. Esto es particularmente importante para el rendimiento de la red. Cuando los routers dividen el paquete en trozos pequerios. el router pierde tiempo en dividir el mensaje, y los paquetes resultantes incrementan la sobrecarga fija. Al bloquear Ia fragrnentacion, 1.1 red descarta eI paquete y devuelve un mensaje de error (paquete demasiado grande) al programa.

Ti pos de paq uete

En los apartados siguientes se describen cada tipo de paquete, se muestran sus estadfsticas y se define Ia cabecera (si existe). En cada apartado se utiliza una tabla

que ayuda a visualizar rapidarnente las caracteristicas de cada protocolo, EI uso de esta tabla ayuda a elegir el paquete correcto para la aplicacion.

EI paquete raw

Un paquete Taw tiene acceso directo al paquete y la cabecera IF. Se utiliza en la programaci6n de protocolos especiales 0 a rnedida. Sus atributos estan listados en la Tabla 3.3.

Tabla 3.3 Atributos del paquete raw

Tamano del mcnsaje (bytes) Sobrecarga fija (bytes) Fiabilidad

Tipo de mensaje Rendimiento

lntegridad de los datos

Fragrnentacion

65.535 (65.515 maxima carga util de datos). De 20 a 60.

Baja (la red pucde descartar 0 reconfigurar los paquetcs). Datagrama.

Alto (baja sobrecarga fija del sistema). Baja (el sistema no valida el mensaje). Sf.

Linux ofrece la opcion de funcionar con capas distintas en la pila IP (para obtener una definicion completa de Ia pila IF y las capas se puede consultar el Capitulo 5, "Explicacion del modele de capas de red"). EI mensaje TCF/IP mas basico es el mensajc W raw. No ticnc informacion aparte de la mas basica,

Puede utilizar el paquete IP para crear la capa mas basic a y asi crear los propios protocolos a rnedida. Para acceder al paquete IP seleccione SOCK_RAW en la llamada del sistema sockett). Por seguridad, debe tener privilegios de root para cjecutar un programa socket ra ~V.

£1 socket raw perrnite trabajar con las tripas del paquete IP. Puede configurar eJ sockctpara que funcione con dos niveles de detalle: tratamiento de cabecera y datos o s610 de datos. EI tratamiento de los datos cs parecido a la transmisi6n de datos UPO sin soporte de pucrtos, EI tratamicnto de la cabcccra perrnite establecer directamente los campos cabecera.

Con el uso de este mensaje se obtiene ventajas y desvcntajas. Al scr un mensaje datagrama, no se ofrece garantia de la llegada 0 de la integridad de los datos. Sin embargo, 5e puede enviar 0 recibir rncnsajes casi a la velocidad de la red. Para consui tar mas informacion de la administracion de paquetes raw se puede consultar el Capitulo 18, "La potencia de los sockets raw".

Gesti6n de mensajes de error y control IP (lCMP)

El Protocolo de mensajes de control en Internet (ICMP) es una de las capas construidas encima del paquetc basico IP. Todas las computadoras conectadas a Internet (hosts, clientes, servidores y routers) utilizan ICMP para el control 0 los mensajes de

error. Se utiliza para el envio de mensajes de error 0 control. Algunos programas de usuario tambien implantan este protocolo, como por ejemplo traceroute y ping. Los atributos de teMP estan incluidos en la Tabla 3.4.

Tabla 3.4 Atributos de ICMP

Tamano del mensajc (bytes) Sobrecarga fija (bytes) Fiabilidad

65.535 (65.511 maxima carga util de datos). De 24 a 64.

Baja (el mismo que II' raw). Datagrama.

Alto (el misrno que IP raw). Baja (el rnismo que IF raw). Sf (pew es improbable).

Tiro de mensaje Rendimiento

Integridad de los datos

Fragmentacion

Si implanta [CMP en cl programa puede reutilizar el socket para enviar mensajes a hosts distintos sin volver a abrir el socket. Los mensajes se pueden enviar usando la Hamada del sistema sendmsgO 0 sendtoO (como se describira en el proximo capitulo). Estas llamadas necesitan una direcci6n de destine. Con un socket individual, se pueden enviar mensajes a tantos puntos como se desee.

Las ventajas y desventajas de un paqucte [CMP son esencialmente las mismas que en IP raw (y otros datagramas), Sin embargo, el paquete incluye una suma de cornprobacion para 1a validacion de los datos. Tarnbicn, la probabilidad de que la red pueda fragmentar un paquete ICMP cs muy pequena. Esto se debe a la naturaleza de los rnensajes ICMP: se usan para indicar los estados, los errores y el control. EI mensaje no sera rnuy grande, asi que nunca necesitara Ia recomposici6n.

Aunque pueda usar ICMP en los rnensajes propios, se utiliza habitualrnente para mensajes de error y de control. Todos los errores del funcionamiento en red viajan por la red dentro de un mensaje leMP. El paquete tiene una cabecera que incluye los c6digos de error, y la parte de los datos puede contener un mensaje mas especifico describiendo el error.

Como parte del protocolo IP, leMP obtiene una cabecera IP y afiade su propia cabecera. El Listado 3.2 muestra una definicion de la estructura.

Listado 3.2 Definicion de la estructura ICMP

1*** Definicion de la estructura IeMP.

1*** Definicion formal en netinet/ip_icmp.h

***1

/**.***~*****~*******~******.**********.***.**************~**/

typedef unsigned char ui8;

(continua)

listado 3.2 Definicion de la estructura ICMP (continuaci6n)

typedef unsigned short int ui16; struct ICMP_header {

ui8 type; /* Tipo de error. */
ui8 code; /* C6digo de error. */
ui16 checksum; / * Suma de comprobacion del mensaje. */
uchar msg [ I ; (* Descripci6n de datos adic~onales. * I
} ; o 20-60

8 bits J 8 bits

~~ Cabeeera IP (20-60 bytes) ~j
Tipo ICMP ! C6digo ICMP
Suma de corrprobacion ICMP
;~ Datos (basta 65535 bytes - cabeceras) ;~ 22-62

24-64

FIGURA 3.3 Esquema ICMP.

El tipo y el codigo definen que error se produjo. msg puede ser cualquier informacion adicional para buscar detalladamente 10 que sali6 mal. Para obtener un listado completo de tipos y c6digos, vease el Apendice A.

Protocolo de datagrama de usuario (UDP)

El Protocolo de datagrama de usuario (UDP) se utiliza principalmente para las comunicaciones sin conexion (rnensajes independientos). Este puede enviar mensajes a difcrcntes dcstinos sin volver a crear los sockets y actualmente es el protocolo sin conexi6n mas comun. Los atributos de UDP estan incluidos en la Tabla 3.5.

Tabla 3.5 Atributos UDP

Tamano del mensaje (bytes) Sobrecarga fija (bytes) Fiabilidad

65.535 (65.507 maxima carga util de datos). De 2M a 68.

Tipo de mensaje Rendimiento

Baja.

De un solo U50.

Medio.

Integridad de los datos

Medio.

Fragmentaci6n

51,

Cada capa superior de la pila IF fija mas su atencion en los datos y menos en la red. UDP oeulta algunos detalles de los mensajes de error y de como el nucleo transmite los mensajes. Tarnbien, recompone un mensaje fragmentado,

Un mensaje que se envia a traves de UOP es como un mensaje e-mail: el destine, origen y datos es toda la informacion que se necesita. EI micleo toma el rnensaje y 10 coloca en la red pero no verifiea su llegada. Al igual que el paquete ICMP, puede enviar a multiples dcstinos desde un socket individual, utilizando distintas llamadas del sistema sendf), No obstante, sin la verificacion, se pueden aIcanzar rendimientos rnaximos,

Sin vcrificar la llegada, la red puede perder la fiabilidad de los datos. La red puede perder paquctcs 0 fragmentos, 0 corromper el mensaje. Los programas que utilizan UOP, 0 bien siguen la pista de los mcnsajcs, 0 no lcs importa si se pierden 0 quedan corrompidos. (Se debe observar que, aunque los datagramas son poco fiables, esto no significa que algo salga mal. 5610 signifiea que el prntocnlo se efectua sin garantfas.)

De los distintos tipos de datos (definidos anteriormente), lnformativo, Temporal y Desechable se adaptan mejor a los servicios UOF_ La razon principal es su tolerancia a la pcrdida de paquetes, Si la camara web falIa para aetualizar todos los navegadores, el usuario final cs improbable que 10 advierta a le importc, Otro posiblc uso es un servicio horario exacto. Debido a que 1a hora exaeta es Temporal, un host puede dcscartar un par de instantes de reloj sin la perdida de integridad.

uor nfreee la ventaja de mayor velocidad. Adcmas. sc puedc incrementar su fiabilidad de las siguientes forrnas:

• Dividir paquetes grandes. Se toma eada mensaje y se divide en porciones asignandole un ruimero (por ejcmplo, 2 de 5). El cquipo del otro cxtremo rccompone el mensaje. Se recuerda que mas sobreearga fija y menos envio de datos rcduccn cl rcndimiento.

• Seguir la pista de eada paquete, Se asigna un numero unico a cada paquete.

Sc fuerza al cquipo hornologo a mandar un aeuse de recibo de cada paquetc, porque sin acuse de recibo, cl progTama reenvia el ultimo paquete. Si el equipo hornologo no obtiene eI paquete esperado, solicita un reenvio con el ultimo numero de monsajc 0 cnvia un mcnsaje de rcanudacion.

• Anadir una surna de cornprobacion 0 CRe. Se verifican los datos de cada paquetc con una suma de datos. Un CRC es mas fiabIe que una suma de eomprobacion. pem la suma de comprobacion cs mas Iacil de calcular. Si el equipo hom61ogo descubre que los datos estan corruptos, le indica al programa que rccnvic el mensaje.

• Usar tiempos de espera_ Se puede asumir que un tiempo de espeTa expirado implica que ha fallado. EI origen puede retransmitir el rnensa]e, y el receptor puede enviar un recordatorio al emisor.

Los tip os de datos Critico e Importante requieren la fiabilidad de TCP 0 una mejor. EI tipo Fallo intolerable requiere mucho mas de 10 que ofrecen cualquiera de estos protocolo. Estos pasos esquernatizados imitan la fiabilidad de TCP_

UOP confia en las caractertsticas y los servicios de IP. Cada paquete de datagrarna UDP recibe una cabecera UDP e IP. En ellistado 3.3 se define la estructura UDP.

Listado 3.3 Definicion de la estructura UDP

I*************************·*··~******·***·*******************/

1*** Definicion de la estructura UDP (datagrama). 1*** (Definicion formal en netinet/udp.h.)

***/

***1

;*****************************-+*****************************/

typedef unsigned char uia; typedef unsigned short int ui16; struct UDP_header {

ui16 src_port; 1* Numero de puerto del origen. *1
ui16 dst _port; 1* Numero de puerto del destino. */
ui16 length; 1* Tamaiio del mensaJe. */
ui16 checksum; /* Suma de comprobacion del mensaje. *1
uchar data [ I i / * Datos del mensaje. * I
} i o

8 bits 1 8 bits

~8 Cabecera IP (20-60 bytes) ~~
Numero de puerto de origen UDP
Numero de puerto de destine UDP
Longitud de mensaje UDP
Suma de cornprobacion de menSaj9 UDP
~8 Datos (hasta 65535 bytes· cabeceras) ~j 20-60

22-62

24-64

26-66

28-68

FIGURA 3.4 Esquema UDP.

UDP crea un receptaculo de red virtual para cada mensaje en forma de puertos, Con el puerto, IP puede repartir rapidamcnte los mensajes al propietario correcto. Aunque no se defina un puerto can bindO, el subsistema IP crea uno temporal para el programa de la lista de puertos efimeros (vease el Capitulo 2).

Protocolo para el control de la transmisi6n (rep)

Protocol para el control de la transmision (TCP) es el protocolo de socket utilizado de forma mas habitual en Internet. Se pueden utilizar readO y write{), y se

requierc volver a crear un socket para cada conexion. Los atributos Tel' estan incluidos en la Tabla 3.6.

Tabla 3.6 Atributos TCP

Tamano del mcnsajc (bytes) Sobrecarga fija (bytes) Fiabilidad

(Ilimitado). Dc 40 a 120.

Tipo de rnensaje Rendimiento

Alta (£1 recibo de los datos comprobado), Flujo.

Intcgridad de los datos

Bajo (cornparado con otros protocolos). Alta (incluve suma de comprobacion), Improbable.

Fragmentaci6n

Para conseguir una mayor fiabilidad 5e rcquiere Ia garantia de que el destino obtenga cl mensaje exacto llue el emisor envi6. VOP tiene velocidad pero no tiene la fiabilidad que necesitan muchos programas. TCP resuelve el problema de la fiabilidad.

La red, sin embargo, tiene varies problemas fundamentales que la haeen poco fiable, Estos problemas no son una lirnitacion. De hecho, son inherentes al disefio de I .. red. Para conseguir fiabilidad, mensajes can capacidad de flujo a traves de la web entrclazada, TCP lIP tiene que incorporar muchas de las ideas sugeridas en el apartado de UDP. Internet tiene tres obstaculos: conexiones dinamicas, perdida de datos y carninos reducidos, como se trataran en los siguientes apartados.

Conexi ones dlnarnlcas

Un host envia un mensaje a otro host. Esc mensaje viaja a traves de las redes. atravesando varies routers y gatewilYs. Cad a mensaje enviado puede utilizar un camino distinto, Los scgmentos de red (conexiones entre cornputadoras) a menudo aparecen y desaparecen cuando los servidores sc inician y apagan. La potcncia de Internet es su capacidad para adaptarse a estes carnbios y encaminar la informacion de forma consecuente,

La adaptabilidad es una de las fuerzas impulsivas detras de Internet. La computad ora pucde realizar una consulta, y la red intenta pusibles vias para completar la orden. Desafortunadarnente, esta ventaja implies que el camino entre la computadora y el servidor 0 equipo hornologo puede cambiar. alargando 0 aeortando la dislancia.

Si el camino se alarga, el tiernpo de propagacion se incrementa. Esto significa que el programa puedc enviar mensajes sucesivos y muehos llegaran a distinto tiempo, muchas veces desordenados.

TCP garantiza que el destino ha recibido correctamente el ultimo mensaje antes de enviar el siguiente. Se puede comparar esto a una serie de mensajes numerados

(asi es como fundona realrnente TCP). EI prograrna puede enviar 10 rnensajes sucesivos, TCP torna cada rnensaje, Ie ad junta un numero iinico, y 10 envia. EI destino acepta el mensaje y responde con un acuse de recibo. Una vez recibido cl acuse de recibo, TCP permite al programa enviar el siguiente mensaje.

PROTOCOLO DE Vt:NTANA DiVlDIDA

TCP utiliza una tecnica mejor que el protocolo enviar-esperar (0 ACKINACK), el eual es demasiado lento para la paciencia de cualquiera. En lugar de eso, utiliza una ventana dividida: mide cuando y con que frecuencia responder con un ACK (acuse de recibo), Las conexiones lentas 0 malas pueden incrementar los mensajes de aCUSe de reeibo. Conexiones rapidas y con menos perdidas permiten que se envfen mas mensajes antes de la recepcion de un acuse de recibo. Es parte del algoritmo de Nagle. Se puede deshabilitar utilizando opciones de sockets (vease el Capitulo 9).

Perdida de datos

Cuando el destino obtiene el mcnsaje, determina la integridad de los datos. Los datos puedcn via jar a 10 largo de caminos de comunicacion poco optimos, que pueden dcsechar 0 corromper los bits del mensaje. Se debe recordar que la red envia cada mensaje de bit en bit. TCP envia con el mensaje una suma de comprobacion para verificar los datos. TCP es In ultima eapn que puede detectar y remediar datos erroneos,

Si el destino detccta cualquier error, envia al emisor un error, solicitando una retransmisi6n al programa. Asimismo, si la computadora no obtiene un acuse de recibo dcntro de un tiempo dcterminado, el subsistema TCP reenvia automaticamente el mcnsaje sin 1.1 intervcncion del programa.

Caminos reducidos

Regresando ill mensaje individual enviado a un host particular, suponga que el mensaje es demasiado grande para los scgmentos que intervienen en el camino. Los problemas que e1 paquete encuentra cuando pasa a traves de la red son las distintas tecnolugfas y las portadoras de transmision, Algunas computadoras en red permiten paquetes extensos: otras colocan hmites en el tarnafio.

UDP intenta enviar el mensaje tan grande como se pueda. Esto puede ser un problema can los caminos reducidos de datos. Los algoritmos IP se adelantan a que Ins routers puedan fragmentar los datos. De igual modo, IP espera que rccompongan el rnensaje entrante.

TCP, por otra parte, limita cad a paquete a trozos pequefios, TCP divide mensajes grandes, antes de que la red tenga la oportunidad de cogerlos. TCP eligc el tamano en uno que las mayorias de las redes pueden deja rIo intacto. Par omisi6n, TCP utiliza 536 bytes y negocia normalmente hasta 1.500. Para incrementar ese tarnano manual mente, establezca 1a opcion de socket TCP MSS (tarnafio de segmento maximo) (vease el Capitulo 9).

El receptor se puede encontrar que los paquetes del mensaje estan desordenados. TCP los ordena antes de pasar el rnensaje al prograrna.

La solucion a todos estes problemas de red es ariadir sobrccarga fija de cabecera y protocolo al algoritmo TCP, Por supuesto, Ia sobrecarga fija afiadida de todas las tecnicas TCP reducen el rendimiento notablemente.

Definici6n de la cabecera Tep

TCP tuvo que afiadir bastante informacion a su cabecera para soportar todas las caracteristicas LIue ofrcce. EI tamafio, en bytes, de la cabecera TCP es unas tres veces el de la cabecera UDP. En el Listado 3.4 se observa la definicion de la estructura TCP.

Listado 3.4 Definicion de la estructura Tep

/*** Definicion de 1a estructura TCP (Socket de f1ujo). ***/

/*** (Definicion formal en netinet/tcp.h).

***/

typedef unsigned char ui8; typedef unsigned short int ul16; typedef unsigned int ui32j typedef unsigned int uintj struct TCP_header {

ui16 src_port; /* Numero de puerto del origen. */

ui16 dst_port; 1* Numero de puerto del destino. *f

ui32 seq_num; f· Numero de secuenCia. */

ui32 ack_num; f* Numero de acuse de recibo. *f

uint data_off:4; 1* Offset de los datos. *1

uint _res: 6; I· (Reservado.) • I

uint urg_flag:l; I· Urgente, mensaje fuera de banda. */ uint ack_flag:l; f· Campo de acuse de recibo valido. *1

uint pSh_flag:l; 1* Colocar el mensa)e a procesar inmediatamente. *f uint rst_flag:l; /* Reiniciar 1a conexi6n debido a errores. *1

uint syn_flag:l; /* Abrir una conexi6n virtual (canal). *1

uint fin_flag:l; 1* Conexion cerrada. *1

ui16 window; 1* Cuantos bytes se permiten recibir. */

ui16 checksum; 1* Suma de comprobaci6n del mensaje. */

ui16 urg_pos; /* Ultimo byte de un mensaje urgente. */

(continua)

Listado 3.4 Definicion de la estructura Tep (continuaci6n)

ui8optionS[l; /* Opciones Tep. */

uiB __ padding[l; /* (Necesitado para alinear datall). */

uchar datal]; /* Datos del mensaje. */

} ;

FIGURA 3.5 Esquema Tep.

o 20-60 22-62

8 bits _I 8 bits

~~ Cabecera IP (2~60 bytes) R8
Numero de puerto de origen Tep
Nurnero de puerto de destino TCP
____________ r __ - - - - - Nurn. de secuencia Tep - - - - - - _____________ r
-- ---------------- Nurnero de reconocimiento TCP - - - - - - - - _ ... - - ~ --
OespL de datos I (reservado) I urg jack\pshj rst \Syn\ fin
Tamano de ventana de receptor Tep
Suma de cornprooacion de rnensaje TCP
Mensaie urgente TCP-posici6n de bytes
/8 Ope.ones rc= ~~
~ti Datos (hasta 65535 bytes - cabeceras) ~8 24-64

28-68

32-72

34-74

36-76 38-78

40·80

La cabecera puede tener un tarnano variable, asi eI campo data_off apunta hacia el principia de los datos. Para guardar el cspacio de cabecera, este campo actua como el campo header _Ien de 11': asigna e1 nurnero de words de 32 bits que fisicamente precede los datos,

TCP utiliza algunos de los campos exclusivamentc para la apertura de la conexion, control de flujo y cierre de la conexion. Durante una sesion de comunicacion, a1gunas de las cabeceras estan vacias. Los siguientes apartados describen algunos campos intcresantes,

La cabecera TCP utiliza el mismo nurnero de puerto encontrado en UDP. Pero seq_num y ack_num ofrecen seguimiento al flujo. Cuando envia un mensaje, el subsistema [P adjunta un numero de secuencia (seqnurn). El receptor responde que obtuvo el mensaje con un nurnero de acuse de recibo (ack_num) que es superior en 1 al ruimero de secuencia. Esta caractenstica permite que los paquetes de aeuse de recibo transporten tarnbien datos.

Observaci6n de las interacciones Tep

Cuando SI;' abre una conexion de generacion de flujo, el programa y el servidor intercambian una serie de mensajes, los cuales aparecen relacionados y descritos en Ia Tabla 3.7.

Tabla 3.7 Intercambio de senates de tres direcciones

Envfos del cliente

Envios del servidor

Descripcion

SYN=l (syn_flag) ACK",O (ack_flag)

Consulta una conexi6n virtual (canal).

Establece el mimero de secuencia,

SYN=l (syn_flag)

Permite y acusa recibo de una conexi6n virtual.

ACK=l (ack_flag) SYN=O (syn_flag) ACK=l (ack_flag)

Establece una conexi6n virtual.

Esto se llama intercembio de seiieles de tres direcciones. Durante las transferencias, el cliente y e1 servidor especifican eI tamano de buffer de sus buffers de recepcion (ventanas).

Por otra parte, el cierre de una conexion no cs una tarea tan simple como puede parecer en un principia, debido a que puede darse el caso de que existan datos en transito, Cuando el cliente cierra una conexion puedc ocurrir la interacci6n mostrada en la Tabla 3.8.

Tabla 3.8 Cierre de una conexi6n TCP

Cliente

Servidor

Descripcion

FIN=1 (fin_flag)

Transmite datos

EI cliente solicita cerrar.

Recibe datos

ACK=l

Transmite mas

EI servidor vacia los canales.

Recibe mas

ACK=l

FIN=1

Cierre aceptado. El servidor cierra y espera un ACK del cliente.

El clients cierra su lado.

ACK=l

EI cierre de Ia conexi6n TCP hace imposible la reutilizaci6n del socket para otras conexiones, Por ejemplo, si se conecta a un servidor, la unica forma de cortar la conexion es cerrando eI canal, 10 cual cierra tarnbien el socket. Si entonces quiere conectarse a otro servidor, debe crear un socket nuevo. Los otros protocolos no tienen esta limitaci6n.

Como encajan los protocolos IP

Mientras tinene lugar la interaccion can la red, tal vez se pregunte como cncajan entre si todo este conjunto de protocolas. En algunos casos, puede parecer que no existe una adaptacion plena. Algunos de ellos utilizan ciertas caracteristicas de otros, pero rcalmente no funcionan tan estrecharnente juntos que parezcan inseparables.

Los protocolos IP raw, ICMP, UDP Y TCP desempenan papeles espedficos. Puede utilizar estes protocolos para adaptar sus necesidades cuando disefia la aplicacion de red. Por supuesto, mientras TCP tiene mas fiabilidad y caracteristicas que los otros protocolos, no puede reemplazar TCMP con TCP. Debido a que los subsistemas Linux requiercn caracterfsticas distintas de TCP lIP, cada tipo de paquete es irnportante para que el sistema funcione correctamente.

Los paquetes ICMP, UOP Y TCP fisicamente confian en el paquetc IF raw. Sus cabeceras y datos residen en la seccion de datos IP, siguiendo a la cabecera IP.

Como escudriiiar la red con Tcpdump

La observacion de paquetes en una red en funcionamiento muestra de forma efectiva que hace con los mensajes el nucleo y como el subsisterna de red resuelve consultas de direcci6n. Desde el paquete I P raw a TCP, tcpdump es una herramienta tIue visualiza los datos de 1a red. Por seguridadt se necesita acceso de root para ejccutar tcpdurnp.

Por ornision, tcpdump utiliza el modo promiscuo asl que puedc ver todo en la red. EI modo prorniscuo manipula la interfaz hardware dircctamcnte para aceptar todos los mcnsajes.

f:L ·£()t.JtLlBRlctD~:~~·~~tti-p .l~_'-------

EI conocimiento de como hacer muchas cosas es muy poderoso y soporta bastante responsabilidad. Con privilegios de root, puede hacer mucho bien y mucho dario a la red. Cuando instala Linux en la computadora, la distribucion asume que actua con las mismas buenas intenciones como aquellas a quien Ie ofreci6 la habilidad de fisgonear otros paquetes. Una forma efectiva de destruir el movimiento Free Software es abusar de la potencia y confianza que la gente buena y bien intencionada dan.

Norrnalrnente, el adaptador de interfaz hardware recoge solamente aquellos mensajes de la direcci6n ethernet que cs capaz de reconocer. Se puede recordar del Capitulo 2 que cada adaptador de hardware ethernet bene un unico ID de 6 bytes. El adaptador utiliza este TO para ignorar todos los paquetes excepto los que coinciden con el ID.

16 'ETHE,,~;~.eA~lEiJ-"~---------

Algunos OEM (fabrieantes de equipos originales) ofrecen sus tarjetas de interfaz de red (PCI a PCMACIA) las cuales soportan direccion MAC programable (olD ethernet). Esto haee posible la produccion en serie para algunos fabricantes de tarjetas mientras se sirven a varios eientos de marcas de ernpresa. Desafortunadamente, se puede obtener una tarjeta que tiene un ID false, porque no se ha programado correctamente la marea de la empresa. Este error puede hacer que la tarjeta no sea (mica en la red.

Si no desea modo prorniscuo, puede desconectarlo con una de las opciones.

Tcpdump tiene muchas opciones que Ie ayudan a filtrar mensajes no deseados y seleccionar redirecciones de datos y datos visualizados. A continuacion estan aIgunas opciones interesantes de la linea de comandos:

Intenta asignar nombres de red y direcciones de difusion.

E5tO requiere acceder al scrvidor de nombrcs,

Finaliza despues de alcanzar la cucnta especifica de mensajes,

• -n No convierte las direcciones de los nodos a sus nombres (esto es uti! cuando no se tiene un servidor de nornbres).

• -a

• -c -ccuenta»

• -p No coloca la interfaz en modo promiscuo. Si se tiene una red pequena 0 duster, viendo todos los paquetes que pueden ser interesantes. De otra manera, con el modo promiscuo habilitado, la red puede facilrnente abrumar a la computadora.

• -v Visualiza una captura con alguna informacion. Induye el

campo de tiempo de vida (TTL).

• -vv Visualiza una captura con bastantc informacion.

• -w «archives Escribe el paquete ra w al archivo.

Tcpdump puede ejecutarlo sin ninguna opcion, y visualizara mas informacion de la que necesita. Puede tambien ver interacciones interesantes, como ARP (Protocolo de resoluci6n de direcciones) pregunta por el ID ethernet y 10 adquiere de la direccion IP. A continuaci6n se muestra un ejemplo de captura de 100 paquetes cc\\.\ informacion y sin marca de tiernpo:

tcpdump ·v ·t ·c 100

La opci6n -t sup rime la marca de tiempo. Ya que a menudo los mensajes se desplazan fuera de la pantalla rnuy rapidamente, puede desear redireccionar el resultado a un archivo.

Tcpdump tiene unas pocas anomalias; por ejemplo, no recoge los mensajes de el mismo. No observa los paquetes de ping 127.0.0.1, porque el subsisterna de red no envia estos mensajes a las capas inferiores donde tcpdump trabaja.

Escritura de un escudrifiador de red a medida

lComo trabaja tcpdump? Puede leer el extenso programa Open Source, 0 escribir su propio escudrifiador de red (una especie de tcpdump). La unica cosa que necesita conocer es como capturar cualquier mensaje para un JlOSt. La herramienta que en este apartado se describe le ayuda a escribir un escudrifiador de red que desensamble paquctes deseados para un host. No soporta el modo promiscuo, sin embargo.

Por seguridad (como tcpdump), necesita ser root para ejecutar un escudrinador de red. El escudrifiador captura todos los mensajes destinados a la computadora. Para obtener todos los mensajes, utilice las siguientes llarnadas:

sd = socket (PF_INET, SOCK_PACKET, filter);

bytes_read = recvfrom(sd, buffer, sizeof(buffer) , 0, 0, 0);

Observe el tipo de socket nuevo: SOCK_PACKET. Es un socket a nivel hardware de solo lectura.

Puede utilizar varios filtros para SOCK_PACKET. Los filtros lc indican a la capa IP que clasc de paquetc desea capturar. A continuaci6n se muestra varios de estes filtros:

• ETH_P _802_3 Tramas 802.3.

• ETH_P _AX25 Tramas AX.2S.

• ETH_P _ALL Todas las tramas (jcuidado!).

• ETH_P _802 2 Trarnas 802.2.

EI filtro a utilizar es ETH_P _ALl. Como indica la nota, cuidado con este filtro, porque cuando 10 selecciona, se 10 da todo. EI resultado de la Hamada es:

sd = socket(PF_INET, SOCK_PACKET, ETH_P_ALL)j

Despues de que la Hamada haya terminado con exito, cada Hamada del sistema recvfromO que rea lice devuelve una trarna de red (un mensaje de red fisico). La trarna de red incluye la direccion hardware (por ejemplo, la direcci6n ethernet) y la cabecera.

El SOCK_PACKET ofrece acceso a las tramas de nivel hardware y a todos los datos asociadas de cada transmisi6n. Can ella puede observar como el subsistcrna de red construye las tramas.

Puede utilizar la estructura IP definida a1 principle de este capitulo. Sin embargo, recuerdc que el almacenarniento esta condicionado al hardware, as! que los bits de los campos pueden estar en el orden equivocado. La estructura asume que el bit numero 0 es e1 primer bit en el flujo de la trama.

El programa ejemplo del sitio web, snooper.c, reconfigura los campos para hacerlos coincidir con la trama hardware real para un procesador little-endian

(compatible con Intel) y un compilador GNU. Si tiene un procesador diferente (incluso un cornpilador difcrcnte), debe de modificar levemente la estructura.

Resumen: elecci6n de los mejores paquetes para el envlo de mensajes

Puede utilizar tcpdump y el escudrifiador para visualizar las clases distintas de paquetes que la eomputadora envia y recibe, Estos paquetes, en el caso de IP, pueden ser paquetes IP raw, paquetes ICMP del gestor de mensajes de error, datagramas UDP 0 mensajes de flujo TCP. Cada tipo de paquete completa un papel especifico mientras deja suficiente espacio para la expansion.

Cada paquete tiene su propia cabecera, ICMP, UDP Y TCP adjuntan sus cabeceras a la cabecera [Po EI rango total del tamafio dedicado a estas cabeceras es de 20 a 120 bytes. El equilibrio entre las cabeceras y los datos verdaderos afectan al rendimiento de la red.

TCP tiene cl menor rendirniento debido a la propord6n entre cabeccra y datos.

Al ofrecer la comunieaci6n mas fiable entre dos computadoras, es el protocolo mas usado en Internet. TCP nfrece una interfaz de generacion de flujo que le permite utilizar funciones de E/S de la bibliotcca superior, tal como fprintfO y fgetsO.

Puede utilizar UDP para enviar mensajes individuales a hosts distintos sin conectar de nuevo. Eso virtualiza la red usando puertos, al hacerlo parece que la conexion tiene acceso exclusive a la red. UDP ofrece rendirniento bueno pern una transmision poco Hable.

El protocolo que mas se utiliza es TCP, debido a su fiabilidad. UDP 10 sigue detras a 10 lejos. La red de hoy ha dado un paso adelante desde el experimento de utilizar las interfaces y paquetes de muy bajo nivel hacia el envio de mensajes. EI rendimiento no es tan irnportante como la fiabilidad, pero los usuaries continuan observando el asunto del rendimiento.

Capitulo IV

Envio de mensajes entre peers

En este capitulo

"Que son los sockets basados en la concxion? 73 Ejcmplo: conexion al demonic HTTP 77

"Que son los sockets sin conexion? 80

Envio de un mensaje directo 85

Garantfa de llegada de un mensaje UDP 90

Tareas enrevesadas: una introducci6n a la multitarea 94 Resumen: rnodelos conectados frente a rnodelos sin conexion 95

Se puede pensar en el pase de mensajes desde dos angulos distintos: continuo y sin interrupcion (TCP) 0 paquetes discontinuos de informacion (UDP). Mientras el flujo de datos continuo es como una transmision tclef6nica, el paquete discontinue es como una carta en un sobre can direccion.

El flujo continuo requiere que se tenga una conexion establecida con el destino.

Esto asegura que la informacion no se pierde durante el intercambio y que esta ordenada cuando llega. Los mensajes discontinuos permiten que se realice una conexion para facilitar simplemente la programacion. Sin una conexion, el prograrna tiene que colocar una direccion en cada mensaje.

En este capitulo se trata las interfaces sin conexion y las basadas en la conexion, Las comparaciones y ejemplos le pueden ayudar a elegir el tipo mas apropiado para las aplicaciones.

LQue son los sockets basados en la conexi6n?

Linux (y todos los sistemas operativos tipo UNIX) ofrece esencialmente tres niveles distintos de comunicacion para los programas. Todos los niveles requieren la utilizacion de la lIamada del sistema sockett). Estos niveles le dan a conoeer las dinamicas de la programaci6n de red y pueden rcalizar una programaci6n desafiante.

Los tres protocolos basicos OP raw, UDP y TCP que sc cncuentran definidos en el Capitulo 3, "Distintos tipos de paquetes de red") abstraen la red y aiiaden fiabilidad mientras se reduce nccesariamentc cl rendimiento. EI nivel mas alto, TCF, tiene la fiabilidad mas grande de todos los niveles de protocolo, Lo eual garanbza que los datos alcancen el destino correctamente y lleguen ordenados. Es tan fiable que se puede considerar como un archivo 0 un canal de interproceso. Esa es la raz6n de que los sockets TCP son sockets besedos en Ja concxi6n.

Canales abiertos entre programas

Los sockets TCP ofrecen un canal bidireccional abierto entre dos programas.

Como un mier6fonn del auricular, el canal envia y recibe informacion de flujo sin cortes. Los programas pueden enviar simultaneamente informacion a otros sin tcner que recomponer e1 dialogo del mensaje individual.

TCP tambien recuerda a quien se esta hablando. Cada mensaje en niveles inferiores del protocolo IF tiene que suministrar la direcci6n de destino can cada mensaje, Es como marcar el nurnero de un amigo cad a vez que se desea volver a hablar.

Cuando se coneeta al otro programa (utilizando la Hamada del sistema connect()), el socket entonces se acuerda de la direccion de destino y el puerto. Tam-

bien, puede utilizar las llamadas de biblioteca de alto nivel disefiadas para la E/S de flujo, como fprintfO y fgetsO. Lo que simplifica enormemente la programad6n.

Como disefiador del programa, el protocolo TCP lc ayuda a evitar los problemas de perdida de datos que pueden ocurrir con otros protocolos. Esta simplicidad lc permite fijar la atenci6n en el programa.

Comunicaciones fiables

TCP es una E/S de flujo, de alta fiabilidad y acceso a la E/S de alto nivel, implicando que el camino de los datos esta limpio y sin trabas. TCP garantiza comunicaciones fiables: el equipo hom61ogo recibe todo 10 que el programa necesita, EI subsistema de red que induye los dispositivos y las pilas de protocol os (en el servidor 0 cliente) aeeptan un mensaje, 10 comprueban y 10 pasan al programa.

Si la comprobaci6n falla y el subsistema deteeta un error, el subsistema se encarga de reclamar una retransmision, Ambos extremes del camino de eomunieaei6n ejecutan este chequeo de validacion, Como se describi6 en el capitulo anterior, algunos mcnsajes tienen un [0 de paquete unico y secuencial. EI 10 es importante para asegurar la fiabilidad y la ordenaci6n. Obtiene esta caracteristica euando selecciona cl protocolo TCP.

Los dos problemas mas grandc$ con la comunicaci6n de red son la perdida y la reordenacion de paquetes. Suponga que cl programa envia un mensaje. Los programas no puedcn detectar absolutamente que el destine eonsigue el mensaje a menos que reeiba una respuesta del destine. Por ejemplo, el programa envfa el mensaje, y el destine espera la Ilegada del paquete. Si el destine no recibe nada en un rato, envia un mensaje al programa indicando el ultimo nurnero de secuencia que recibio bien. Esta colaboracion estrecha acopla el programa con el destino,

Par otra parte, cl destino pucde recibir algunas partes del mensaje desordenadas con el resto del mensaje. Cuando esto ocurre, el destine aguanta el fragmento del mensaje hasta que obtiene los segrnentos intermedios. El destino entonces recompone el mensaje utilizando el numero de seeuencia como dave de ordenacion,

Como sc debi6 observar antes, las llamadas de biblioteca de alto nivel cuentan con un canal abierto y tarnbien requieren que el camino de comunicacion sea fiable. E1 protocolo Tep fija la atencion en el canal del mensaje con objeto de que la informacion aparezca como un flujo sin paquetes. Alternativamente, los protocolos de bajo nivel fijan la atencion en los paquetes, con 10 gue no pueden soportar llamadas de biblioteca de E/S de alto nivel como printfr).

Los protocolos menos fiables ofrecen enviar mensajes al programa eon un canal muy rapido. UOP, en particular, intenta obtener el mensaje rapidamente sin tener en cuenta la ordenacion. Similarmente, el destino acepta cada mensaje independiente, sin esperar ninguna ordenad6n.

La ordenaci6n es un asunto importante para el disefio. Puede esperar que los datos no esten ordenados cuando, en realidad, pueden estarlo. A continuad6n se

muestran algunas consultas que le pueden ayudar a decidir si los mensajes requieren flujos n no (con rapidez, resumenes explicativos).

• lLa forma de los datos son consultas independientes? EI programa puede aeeptar Ia respuesta en cualquier orden cuanda el mensaje es una eonsulta independiente. Por ejemplo, el orden de ejeeuci6n no es importante en el caso de eonsultas desligadas: un programa puede consultar un archivo y entonces continua para consultar el estado del equipo homologo. Sin embargo, si estuviera enviando puntas de coordenadas para un jugador en un juego de redesto es, una consulta interdependiente--el orden de las posiciones es muy importante. (Si=UDP; no=TCP.)

• lSi reordena aleatoriamente los mensajes, responde casualmente el programa can el mismo resultado? Esta es la verdadera prueba litmus de los canales basados en mensajes, Los flujos no pueden tolerar la reordenacion de los paquctes. TCP cuidadosamente reordena los mensajes dentro de un mensaje continuo. (Si=UDP; no=TCP.)

• lDescribe la conversacion como una conexion de canal 0 un mensajero FedEx? Por un lado, el flujo de la informaci6n entre el programa y el equipo homologo puede compararse al agua en una tuberia. Esta informacion tiene un orden. Por otro lado, un paquete individual de informaci6n se puede comparar a un bulta. La informacion esta desordenada y en paquetes. Por ejcmplo, puede recibir varias bultas en cualquier orden y puede 5610 responder a un par. El flujo del canal no puede soportar esto sin perder informacion. (FedEx=UDP; canal=TCP.)

• Si desconecta y vuelve a conectar entre cada mensaje, leI servidor 0 equipo hom61ogo tienen que guardar el rastro de donde estuvo 0 el estado de la transacci6n? Algunas transacciones pueden ser simplemente "dame esto", y la respuesta es "aqui". EI servidor no recuerda nada de transaccion en transaccion, Otras transaciones Ie fuerzan a pasar a traves de estados distintos. Una sesion Telnet tiene dos estados: conectado y no conectado. (No=UDP; sl=TCP.)

• "Debe el programa seguir la pista de quien ha dicho y que mientras se sirven varias conexiones? Algunas veces necesita tener dialogos (con a sin flujos de datos) en la cual el servidor debe seguir la pista del cliente. Par ejemplo, la personalizacion de Internet permite que el usuario construya a su medida en entorno operative. Algunos programas pueden hacerlo de forma similar. (Si",UDP; no",TCP.)

• lPuede la red perder un mensaje sin afectar a la computaci6n de destino? El emisor puede que necesite tratar los datos perdidos, pero con tal de que el destino no dependa de cada llegada segura del mensaje, pucde utilizar el protocolo sin flujo UDP. Par ejemplo, puede no ser demasiado importante perder una consulta desordenada, pero otra cuestion bien distinta es perder consultas ordenadas. Por ejemplo, los precios de las existencias en un mercado requieren un flujo cuidadoso de informacion, pero las estadisticas atmosfericas pueden tener unas pocas perdidas sin lastimar el pronostico, (Si",UDP; no=TCP.)

Despues de responder a estas cuestiones, si detecta que solo una respuesta es TCP, debe de utilizar TCP 0 reforzar el protocolo UDP. Estas reglas no son duras y rapidas: puede elegir aceptar las cuestiones con el UDP menos fiable can el fin de obtener el rendimiento deseado,

Conexiones de protocolo inferior

Es po sible utilizar la Hamada del sistema connectt) en un socket UDP. Puede ser atractivo cuando no necesita E/S de alto nivel, ya que UDP ofrece una ayuda de rendimiento con los mensajes autocontenidos. Sin embargo, la conexion UDP funciona alga diferente a como TCP gestiona las conexiones,

En el capitulo 3 se describi6 el proceso de intercambio de sefiales de tres direcciones. Este intercambio de sefiales establece el nivel de comunicaci6n para que los datos fluyan entre los programas. Ya que UDP no soporta flujos, la Hamada del sistema connectt) 5610 simplifica el pase de mensajes,

La Hamada del sistema connectj) en una conexion UDP registra simplemente el destino de cualquier mensaje enviado. Puede utilizar readj) y writeO como en una conexi6n TCP, pero no tendra garanhas de fiabilidad y ordenaci6n. El algoritmo presentado en el Listado 4.1 es muy similar al de programacion TCP.

Listado 4.1 Un datagrama simple conectado

1*** Muestra de ejemplo de datagrama con conexiOn. ***1

/*** Extracto de connected-peer.c. ***1

int sd ;

struct sockaddr_in addr;

sd = socket (PF_INET, SOCK_DGRAM, 0)i bzero(&addr, sizeof(addr));

addr.sin_family = AF_INET;

addr.sin_port = htons(DEST_PORT);

inet_aton(DEST_IPADDR, &addr.sin_addr);

if ( connect(sd, &addr, sizeof(addr)) != 0 ) 1* iconectado! *'

la socket datagrama *1

perror("connect");

I*--·Nota: esto no es un send de flujo··-*II

Send(sd, buffer, msg_len);

1* send como en TCP *1

Normalrnente, con UDP se utiliza la Hamada del sistema sendtoO 0 recvfromO (las cuales se describen mas adelante, en este mismo capitulo). La Hamada del siste-

rna sendO asume por omision que el programa ha registrado ya el destino con un connectt),

EI equipo hom61ogo (0 servidor) que espera la conexi6n puede utilizar la misma interfaz de conexion, 0 puede utilizar sendtoO y recvfromO. Sin embargo, para que el programa se conecte al equipo homo logo, se necesita que el equipo homologo publique su numero de puerto con la Hamada del sistema bindt). Para una dcscripcion completa de la Hamada del sistema bindt) se puede consultar el apartado "Envio de un mensaje directo", mas adelante en este capitulo.

EI fragmento de codigo de ejemplo en el Listado 4.1 hace referenda a DEST_PORT. Este ruimero es una interfaz de puerto acordado entre los dos programas. El equipo homologo que escucha activa el puerto a traves de la Hamada bindO para solicitar DEST _PORT. Cuando el rnensaje Hega, el destine puede emitir una Hamada del sistema connectO el mismo.

De distinta forma a la Hamada del sistema connectO en TCP, el programa puede volver a conectarse tantas voces como desee a otros equipos homologos 0 servidores sin cerrar el socket. Con TCP, no puede conectarse a otros equipos hornologos 0 servidores a monos que cierre y luego vuclva abrir el socket. Una de las caractcristicas mas importantes que UDP ofrecc es la capacidad de cnviar mensajes a destines distintos sin cerrar el socket. El uso de 13 Hamada del sistema connectO con el protocolo UDP le ofrece esta flexibilidad a pesar de todo.

De nuevo, si utiliza UDP de cualquicr forma, elige la poca fiabilidad l1ue con lleva. Puede perder paquetes 0 los paquetes pueden llegar desordenados, La Hamada del sistema connectf) para UDP solo rcgistra el destino y no incrementa la fiabilidad del canal entre los programas.

MENSAJES ENTREd .. fJd~ M~jt~'MA1FiA1!l-t.e'(ftt;MJ'-

EI Protocolo de mensajes entregados de forma fiable (RDM) [RFC908, RFCl151) ofrece la qarantia de reparto que ofrece TCP pero Ie permite tener la velocidad basada en el mensaje (no de flujo) de UDP. RDM puede recoger los mensajes desordenados, pero no ofrece un buen compromiso entre UDP y TCP. Desafortunadamente, aunque este protocolo ha estado en los libros durante muchos aries, Linux (y otros sistemas operativos UNIX) no 10 soportan todavia.

Ejemplo: conexi6n al demonic HTTP

E1 protocolo al que los usuarios mas se conectan es HTTP. Describe un interfaz muy simple que incluyc una consulta, El servidor, a su vez, interprets la consulta y responde can un rnensaje que el diente puede entender. Ese mensaje puede ser cualquier documento dentro de un formate simple de cabecera e-mail.

La simplicidad de la interfaz le evidencia [a cantidad de transacciones que existen en la red. Muchas interacciones cliente-servidor estan basadas en transacciones

individuales, Toda [a sobrecarga fija de la interacci6n y comprobaci6n de fiabilidad de TCP se puede desperdiciar en una transaccion individuaL A pesar de eso, este es el estandar aceptado.

Protocolo HTTP simplificado

Par enviar una consulta a un servidor HITP, solo necesita conocer un umco comando. Esta es un representacion demasiado simplificada del protocolo HTTP. En el Capitulo 6, "Generalidades sobre el servidor", se trata el protocolo en mayor profund idad:

GET <query> HTTP/1.0<cr><cr~

EI aspecto normal de la consults es como till camino de directorio, pero este puede tomar parametres y variables. Cuando introduce la URL http://www.kernel. org/mirrors! en el navegador, el navegadar abre un socket a www.kernel.org y envia el siguiente mensaje:

GET /mirrors/ HTTP/1.0<cr><cr>

Tambien puede enviar informacion sobre Ia clase de datos que puede recibir.

Esto ayuda a la interpretacion de los datos. Los dos ultimos <u> son lineas nuevas que indican el final del mensaje. EI cliente puede enviar cualquier numero de parametros y configuraciones, pero debe finalizar el mensaje con dos Iincas en blanco.

La conexi6n es con f1ujo, aSI que no conoce si el rnensaje tiene exito al final. Lo que puedc conducir a esperar indefinidamente algo que nunca llega. Las dos lineas en blanco Ie indican al servidor que el diente a terminado de hablar.

Obtencion de una paqina HTTP

La composiei6n de la consulta es la parte mas facil de la conexion. La consulta le da tarnbien mayor flexibilidad en afiadir 10 que necesita. El unico requisite es asegurase de que cl servidor puede entender el mensaje. EI Listado 4.2 presenta una forma de obtencion de una pagina web. Este programa abre una conexion especificada en la linea de comandos y envia una consulta HITP. EI programa visualiza el resultado en stdout.

Listado 4.2 Obtencion de una paqina web de un servidor HTIP

f*~**********~***·**·******~***************·*****************/

1*** Extracto del archivo http·client.c (en el s1tio web).***/

/******************-*****************************************/

int sd;

struct servent *serv;

(continua)

.... ". ',-.-~~~~-----------------------

Listado 4.2 Obtention de una paqina web de un servidor HTIP (continuaci6n)

if ( (serv = getservbyname( "http", "tep")) == NULL) PANIC("HTTP servent');

if ( (sd = socket (AF_INET , SOCK_STREAM, 0)) < 0 ) PANIC( "Socket");

f*---Inicializa la estructura de puertofdirecci6n del servidor.---*f*f bzero(&dest, sizeof(dest));

dest,sin_family = AF_INET;

dest.sin_port = serv->s_port;

/* Servidor HTTP_ */

if ( inet_addr(Strings[lj, &dest,sin_addr_s_addr) == 0 ) PANIC(Strings[l]);

f*---Conectar al servidor. ---*/*/

if ( connect (sd, &dest, sizeof (dest)) ! = 0 ) PANIC("Connect");

/*---Componer la consulta y enviarla,---~/*I sprintf(buffer, "GET %s HTTP/l ,0\n\n", Strings(2J); send(sd, buffer, strlen(buffer), 0);

f*---Mientras existan datos, leerlos y mostrarlos. ---*/*/ do

{

bytes_read = reev(sd, buffer, sizeof(buffer)-l, 0); buffer[bytesj = 0;

if ( bytes_read > 0

printf("%s", buffer);

while ( bytes_read > 0 );

El programa del Listado 4.2 abre la conexion, envia la consults de la linea de comando y muestra todo 10 que obtiene hasta que el servidor cierra la conexion. Versiones posteriores del protocolo HTTP 0.1 Y el HTTP-NG propuesto) induyen la capacidad de dejar el canal abierto y aprovecharse de la conexi6n TCP. De nuevo, esta caracteristica enfatiza la necesidad de indicar al receptor cuando el emisor ha terminado de emitir, Puede leer mucho mas sabre las nuevas versiones de HTTP en las RFC que se encuentran en www.w3c.or9_

lQue son los sockets sin conexi6n?

Todas las comunicaciones no requieren tener un canal bidircccional abierto entre los peers. Si cl telefono es un ejemplo de conexion de generaci6n de flujo, cl sistema postal representa mejor un sistema basado en el mensaje (0 sin conexiom. Como el sistema postal, UDP compone los mensajes, asigna una direcci6n y 10 envia sin ningun seguimiento del mensaje de c6mo viaja al destino, (5610 reiterar: la falta de credibilidad de un datagrama significa que no ofrece garanhas de reparto. Eso no significa que no funcionc.)

Configurando la direcci6n del socket

La instalaci6n completa de una distribuci6n Linux incluye normalmente herramientas que le permiten enviar y recibir notas de otra estacion de trabajo en la red. Estas herramientas requieren una unica dircccion de maquina y tal vez un nombre de usuario. Puede implernentar este tipo de herramicntas usando un socket UDP. Para hacer esto, necesita observar si el usuario actual es el receptor del mensaje.

Estas herramientas de tipo mensajero. utilizan las dos partes de los datos (nombrc de host y de usuario) para identificar la unidad del receptor. AI no existir datos en flujo, la implernentacion puede usar una interfaz sin conexion.

La interfaz sin conexi6n no realiza la Hamada del sistema cormectt), pero no se puede llamar a sendO o recvO sin tener una conexi6n. De hecho, cl sistema operativo ofrece dos llamadas del sistema de bajo nivel que incluyen la direcci6n de destino: recvfromO y rendtoO. Estas llarnadas actuan de forma similar a recvO y sendt). pem se suministra el destino como parte de Ia Hamada:

#include <sys/socket.h>

#include <resolv.h>

int sendto(int sd, char* buffer, int msg_len, int options, struct sockaddr *addr, lnt addr_len)j

int recvfrom(int sd, char* buffer, int maxsize, int options, struct sockaddr *addr, int *addr_len)j

Los cuatro primeros parametres son los mismos que en recvO y sendf). Incluso las opciones y condiciones de error posibles son las mismas. La llamada del sistema sendtoO afiade la direcci6n del socket del destine. Al enviar un mensaje al destino, rellena Iii estructura addr y llama a sendtof). EI Listado 4.3 muestra un ejemplo:

listado 4.3 Ejemplo de sendtoO

/******************************.***************~******~******J

/*** Ejemplo sendto().

***'

(continua)

Listado 4.3 Ejemplo de sendtoO (continuaci6n)

int sd;

struct sockaddr in addr;

sd = socket(PF_INET, SOCK_DGRAM, 0); bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.Sin_port = htonS(DEST_PORT); inet_aton(DEST_ADDR, &addr.Sin_addr);

sendto(sd, "This is a test", 15,0, &addr, s i zeof t addr-j j ;

Este ejemplo envia un mensaje directamente a DEST _ADDR:DEST _PORT. Par supuesto, puede utilizar datos raw 0 ASCII en el cuerpo del mensaje. No tiene irnportancia.

La Hamada del sistema reevfromO es similar a recvt), y cuando se ejecuta espera hasta que un mensaje Begue de algun emisor.

EI ultimo pararnetro tiene un tipo distinto. Es un puntero a un entero. Los dos ultimos para metros de sendtoO son el destino. Los dos ultimos parametres de recvfromO son la direccion del origen. Ya que Ia familia de estructura sockaddr pueden ser de distintos tarnafios, puede recoger posiblemente un mensaje del arigen que cs dishnto del tipo de socket (por omisi6n es AF _lNET).

~6~·':';~s~;'~:ljit!~;;~ij~!-~--

La Ilamada recvfrom(} (como recv{» pasa el puntero de la longitud de la estructura. Esto es objeto de familias de protocolos distintas, PF _LOCAL. Cuando la llamada finaliza, se necesita conocer cuantos datos addr utiliza la Ilamada. Tarnbien se necesita indicar en la lIamada cuanto espacio esta disponible para usar. De esa manera, el parametro se pasa por referenda con el fin de que la lIamada del sistema pueda devolver el numero de bytes que utiliza actualmente.

Puesto que recvfromO puede cambiar el parametro addr _Ien, necesita establecer el valor cada vez que realice la llamada del sistema. De otra manera, el valor en addr jen puede disminuir potencialmente con cada llamada del sistema. A continuaci6n se muestra un ejernplo del uso de recvfromO:

I***************~******~**********~****************·*********/

/*** Ejemplo recvfrom().

***/

I*************************************~*********·****·*******/

int so j

struct sockaddr_in addrj

sd = socket(PF_INET, SOCK_DGRAM, 0); '*---Enlazar a un puerto particular_---*/*' while (1)

{ int bytes, addr_len=slzeOf(addr)i

bytes = recvfrom(5d, buffer, sizeof(buffer) , 0, &addr, &addr_len) ;

fprintf (log, "Got message from %5: %d (%d bytes) \ n" , inet_ntoa(addr_5in_addr), ntohs(addr.Sin_portj,byteS)i /****Peticion del proceso.****/

sendto(sd, reply, len, 0, addr, addr_len);

En este ejemplo, se crea el socket y se enlaza al puerto. El bucle while espera al mensaje de entrada, registra 1a conexi on, procesa la consulta y responde con el resultado. El bude reinicia e1 valor de addr .Ien as! que el tamafio de addr no parece reducirse con cada Hamada del sistema. Se puede utilizar esta informacion en addr como la direccion devuelta por la respuesta.

Si utiliza la Hamada del sistema recvfrom(), debe suministrar un valor addr y addr_len; no puede establecerlos a NULL (0). Puesto que UDP es sin conexion, necesita conoeer el origcn de la consulta. La forma mas facil de hacer eso es guardar intacto addr mientras se procesa la consulta.

Algunos programas solo necesitan el mensaje

EI protocolo sin conexion simplifica el intercambio de sefiales, TCP requiere un intcrcarnbio de sefiales de tres direcciones: el c1iente cnvia una consulta en la conexi on, el servidor acepta la consulta y envia su propia consults de conexi on, y el cliente acepta la consulta de conexi an del servidor,

UDP, sin conexion, no tiene efectivamente intercarnbio de senates: el mensaje es el mismo la unica colaboracion remota mente compartida. Significa que el protocolo no comprueba la conexion. Casualmente, si el equipo homologo no puede encontrar u ocurre algun error de transmision, se puede obtener un mensaje de error de red. Sin embargo, ese mensaje puede llegar mucho tiempo despues de que la red detecte el error (de uno a cinco minutos),

El protocolo sin intercambio de seftales UDP reduce Ia sobrecarga fija del intercambio de sefiales de TCP_ Para soportar esto, puede observar uno 0 dos paquetes de configuracion en total. Bastante bueno para comunicaciones de alta velocidad.

Transaction Tep (T ITCP): un TCP sin conexion

El intercambio de sefiales de tres direcciones TCP, comparado con el protocolo UDP, requiere hasta 10 paquetes de configuracion, Este arranque es muy lento com-

parado con el generador de peticiones que solo necesita una unrca transaccion. Durante el proceso de arranque, los dos extremes de la conexion verifican cada servicio y la fiabilidad del canal del otro. Similarmente, el proceso de eerrado requiere un intercambio de sefial adicional (vease el Capitulo 3).

TCPv3lRFCl644] anade una caracteristica nueva of red en do algunas de las velocidades de conexion de UDP, mientras se reduce la fiabilidad de TCP. Transaction TCP (T ITCP) hace la conexion, transrnision y cierre en una {mica Hamada del sistema sendtof), lComo 10 hace?

TCP establece la conexion con el uso del intercambio de sefiales de tres direcciones, y cierra 0 apaga la conexion utilizando una serial de intercambio particular. Estos pasos son necesarios para asegurar que el cliente y servidor consigan todos los datos enviados en el orden correcto. Para encontrar ese objetivo, el paquete TCP tiene que utilizar flags para indicar cuando establecer la conexi6n (SYN), acusar recibo de datos (ACK) y cerrar el canal (FIN).

En el Capitulo 3 se describe el formato del paquete TCP. La eabecera del paquete incluye varios campos que pueden parecer estar en exclusion mutua. POf ejemplo, tiene flags separados para SYN, ACK Y FIN. (Por que quiere desperdiciar el espacio preciado de un paquete cuando un solo bit de cada campo esta probablemente activo ala vez?

T ITCr utiliza estos campos simultanearnente, Cuando el cliente T ITCP se conecta, envia el mensaje al servidor mientras demanda la conexi6n (SYN). Tambien establece el flag FIN para cerrar la conexion tan pronto como el servidor terrnine la transaccion. Vease la Figura 4.1.

EI servidor responde con su propia peticion de conexion, una peticion de cierre, y se termina con un acuse de recibo del cliente. (EI acuse de recibo de la peticion de conexion esta implicita.) EI paquete inc1uye los datos que el servidor gcncro, Finalmente, con el acuse de recibo del cliente, el servidor finaliza.

T ITCP puede ser muy rapido. Pew existe un problema: toda la informacion debe ser transmitida can MSS (maximo tarnafio del segrnento) de TCP, 10 cual s610 es 540 bytes. Sin embargo, puede cambiar csa configuraci6n hasta 64KB. Adernas, el programa no se lirnita a enviar un mensaje: puede enviar varios mensajes.

EI programa servidor no tiene que hacer nada, solo tiene que trabajar soportando T ITCr. El algoritmo para una conexion normal TCP sirve para T ITCr tambien, puesto que todos los soportes del lado del servidor estan programados en el subsistema de red. Todo el trabajo esta en el lado del cliente. Puede utilizar el siguicnte algoritmo en el cliente:

I**W*.**.********~***~******~******~**~**********************/

1*** Algoritmo basico T/Tep.

***1

/**************-**.********************************.*.*.***.*/

int f Laq= t ; int sd;

sd socket(PF_INET, SOCK_STREAM, 0);

if setsockopt(Sd, IPPROTO_TCP, TCP_NOPUSH, &f1ag, sizeof(f1ag)) !~ 0 )

PANIC("TCP_NOPUSH not supported"); !****Configurar addr para e1 destino.****/

if ( sendto(sd, buffer, bytes, MSG_FIN, &addr, sizeof(addr)) < 0 )

PANIC( "sendto") j

Cliente

Servidor

syn acl<. fin
T F T <; (esperando
conexi6n)
Datos syn ack fin
(esperando T F T
respuesta) ->
Dsfos syn sck fin
F T F r-, (esperando
respuesta)
Dstos (esperando conexion)

FIGURA 4.1

las seiiales de intercambio de TfTCP abren, envian y cierran un dialoqo en tres paquetes.

Con TITer se tiene que deshabilitar TCP y vaciar rapidamente sus buffers. Eso es 10 que la llamada del sistema setsockoptO hace en el ejemplo. Tambien, se puede enviar tantos mensajes como se desee, pero el ultimo mensaje debe tener MSG_FIN (vease ellistado anterior) en la Hamada del sistema sendtot).

f')Tcp:VhNOX'''''------------------

Linux, desafortunadamente, no so porta actual mente TfTCP. En un futuro sera, pero por ahara, estas tecnicas se pueden utilizar en otros sistemas operatives UNIX. Puede observar algunos flags que indican un trabajo en proceso en el nudeo del Linux (por ejernplo, M5G_EOF y M5G_FIN se definen en linuxlsocket.h). Todavfa, puede poner a prueba los programas TfTCP encontrados en el sitio web.

TCP, como se menciono antes, requiere volver a crear un socket TCF para cada conexion nueva, porque se puede cerrar una conexi6n solo con cerrar el socket. TITer puede tener un lado positivo al no requerir volver a crear un socket como Tep, puesto que la conexion y el cierre estan implfcitos.

T ITCF Ie da la ventaja de tener despliegues cortos de interaccion con cualquier servidor que 10 soportc, mientras se minimizan los tiempos de inicio y de cierre, Las ventajas de TITer ayudan al programa a responder mas rapido a los servidores.

Envio de un mensaje directo

Hasta ahara se ha trabajado con un canal conectado para enviar y recibir mensajes y se ha comparado con el uso de un telefono. Un mensaje dirigido no conlleva conexion, en tanto que no existe intercambio de senales, AI crear un mensaje dirigido (no un canal) a un peer se requiere un ernisor y un receptor. EI emisor transmite el mensaje, y el receptor acepta el rnensaje. Eso es rnuy simple.

Cada mensajc necesita un destino (el ruicleo coloca automaticarnente Ia direcdim de retorno en ol paqucte). sendt) y recv(} asumen que tienen un canal conectado, 10 eual define automaticarnente el destine. En vez de eso, deben utilizar las llarnadas del sistema recvfromO y sendtot), porque arnbas suministran el direccionamiento que cada mensaje requiere.

Antcriorrncnte al cnvio del mcnsaje, sc construyc la direccion de destino, la cual incluye la direccion del hosty el numero de puerto. Como se describi6 en el capitulo anterior, si el programa omite Ia selecd6n del puerto, el sistema operativo asigna aleatoriarncntc uno al socket. No se trata de una buena idea para programas fijos, La Hamada debe conocer cl puerto de dcstino para direccionar currectamente el mensaje,

cO'M~b'~)(2;8~jg~'t:~ii~~~

DE SOCKADDR EN LlNUX -------------~ EI nucleo del Linux sopota varios tipos distintos de protocolos de direccionamiento, pero no todos los protocol os se incluyen directamente en los nucleos de las distribuciones. Por ejemplo, los nucleos de las distribuciones omiten a menudo los protocolos de radio aficionado. 5i se encuentra dudoso de que protocol os asociados so porta el nucleo compilado, ejecute simplemente el programa. Las llamadas

del sistema bindt), sendtot), connect{) y recvfromO visualizan en pantalia un error si reciben un sockaddr que no entienden. Se puede encontrar una lista de los sockaddr soportados en el Apendice A, "Tablas de datos".

Los emisores de TCI-' /UDP deben conocer en que puerto escucha el receptor para que el sistema operative encamine el paquete al programa correcto. Este puerto es normalmente un numero de puerto acordado entre el emisor y el receptor. Por ejemplo el archivo letdservices incluye los ruimeros de puerto publicados que ofrecen los servicios estandar.

Asociaci6n del puerto al socket

Puede requerir un nurnero de puerto especffico dcsde cl sistema operative utilizando la Hamada del sistema bindt). Puede haber vista esta Hamada antes, y lamentablemente muchas paginas de manual UNIX la definen como "nombre de sacker'. Esta definicion se refiere a sockets PF _LOCAL 0 PF _UNIX que utiliza cl sistema de archives. Una descripcion mejor es "asociar un numero de puerto u otra interfaz de publicaci6n al sacker'.

A50C"A~~~~'~,~"N6~1!' ',~~-~~~-

La asignaci6n del puerto y el nombre al socket varian drasticamente entre cada miembro de la familia sockaddr. Algunos, como AF _LOCAL Y AF _AX25, son nombres alfanumericos: otros, como AF _INET Y AF _IPX, utilizan puertos. Los nurneros de puerto deben ser unlcos, por 10 general dos sockets Tep 0 UDP no pueden tener los mismos nurneros de puerto (al menos can AF _INET). Sin embargo, un socket UDP y un socket Tep puede tener com partido el mismo nurnero de puerto. As! es c6mo algunos servicios (en fete/services) Ie ofrecen ambas conexiones.

La definicion prototipo de la Hamada del sistema bindO es: #lnclude <sys/socket.h>

#include <resolv.h>

int bind(int sd, struct sockaddr *addr, int addr_size);

En este apartado se introduce de forma superficial a bindt): para una descripcion mas profunda, se puede consultar el Capitulo 6. El usn es similar a la Hamada del sistema connectO donde sc nccesita iniciar el primer parametro addr:

I*******w~**~*****************~*****************************.j

/*** Ejemplo de bind().

***/

struct sockaddr addrj int sdj

sd = socket(PF_INET, SOCK_STREAM, 0);

bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET;

addr.sin_port = htons(MY_PORT); /* Petici6n de un puerto especifico. */

addr.sin addr_s_addr = INADDR_ANY; /* Cualquler Interfaz IP. */

if ( bind (sd, &addr, sizeof (ador j ) ! = 0

perror ( "bind" ) j

Si se compara este ejemplo de la Hamada del sistema bindO con la llamada del sistema connectO, se debe observar dos diferencias principales: aqui, el codigo recortado esta consultando MY _PORT, Y la direccion es INADDR_ANY. EI pregrama necesita un numero de puerto especifieo para que el equipo se conecte.

INADDR_ANY es uri flag especial (esencialmente 0.0.0.0) que indica que cualquier equipo puede conectarse desdc cualquier interfaz. Algunas computadoras tienen mas de una interfaz fisiea (por ejemplo, des tarjetas LAN, un modem con una tarjeta LAN, direcciones IP con alias). Cada interfaz logica 0 hardware tiene su propia direccion IP. Al usar la Hamada del sistema blndt), puede especificar si servir una 0 todas esas interfaces. Puede utilizar esta caracteristiea para atravesar conversiones 0 filtros por un tirewall, y se aplica a los protocolos TCP 0 UDP. Para indicar una interfaz espccifica, puede utilizar 10 siguiente:

if ( inet_aton("128.48.5.161", &addr.sin_addr) == 0 ) perror("address error");

Esto rcaliza la petic ion de que el puerto de escucha este sobre 128.48.5.161. Pucde utilizar las transformaciones de ordenacion de bytes de red como htonlt):

addr.sin_addr.s_addr = htonl(0x803005A1)j /* 128.48.5.161 */

Funciona 10 misrno de cualquier forma. 5e debe obscrvar que INADDI-{ ANY no utiliza la Hamada de trans formaci on htonlO. No se necesita, puesto que esta todo a cero. y sc garantiza que esta en el ordcn de bytes de red.

Como enviar el mensaje

El envfo y recepci6n de rnensajes UDP se pan~ce un poco al juego de coger en la niebla. Los jugadores sc turnan para lanzar y coger, aunque cllos no pueden verse uno al otro. El emisor es el primero en lanzar el balon. EI receptor debe toner una localizacion y un mimero de puerto conocido, establecido con la Hamada del sistema bindf), EI emisor no necesita estableccr su numero de puerto, porque cada mensaje incluye la direccion de retorno. Para un jugador, el potencial esta al lazar c1 balon a un espacio vacio,

El emisor realiza poca iniciad6n y, a menu do, 5610 una peticion de mensaje, Puede colocar csto en un bucle para lanzar mensajes de una parte a otra. EI codigo para el ernisor esta el Listado 4.4 y en connectionless-sender.c del sitio web.