Redes de Computadores – Uma nova fonte de aquisição de dados para a Guerra Eletrônica Leonardo Fernando Canelossi Rosa - Cap Centro Integrado de Guerra Eletrônica– CIGE – Brasília, DF Resumo - Este artigo tem como objetivo apresentar os modelos de referência empregados na concepção das redes de computadores na transmissão de dados. Para a Guerra Eletrônica este é um novo campo para a aquisição de dados que se descortina e somente estaremos aptos a extrair os dados de interesse se entendermos suas características; suas estruturas; e suas vulnerabilidades, para então, agindo de maneira efetiva obtermos as informações que procuramos. Palavras-chaves – redes de computadores, dados e modelos. I. INTRODUÇÃO O que são e como surgiram as "Redes de Computadores"? Uma rede de computadores consiste de dois ou mais computadores (host) e outros dispositivos ligados entre si e compartilhando recursos de hardware, software e serviços. Existem várias formas e recursos de vários equipamentos que podem ser interligados e compartilhados, mediante meios de acesso, protocolos e requisitos de segurança. As Redes podem ser Locais (LAN), quando o parque de equipamentos interligados está numa mesma estrutura física numa pequena área geográfica, sendo a distância entre os processadores de aproximadamente 1 Km. Quando o parque de equipamentos interligados está dentro de uma mesma cidade, dizemos que a rede é metropolitana (MAN), sendo a distância entre os processadores de aproximadamente 10 Km. Quando o parque de equipamentos extrapola os limites da cidade, está constituída uma Rede Geograficamente Distribuída (WAN), sendo a distância dos processadores de aproximadamente 1.000 Km. Quando esta distância é superada temos então a Internet. Não podemos esquecer também as Redes pessoais, que normalmente ligam dispositivos pessoais (mouse, teclado, impressora, fone sem fio, PDA, etc) a um computador (host). Atualmente, as redes de computadores são o meio comunicação mais moderno que existe. O escopo da comunicação cresceu significativamente na década passada e essa explosão nas comunicações não teria sido possível sem o avanço progressivo das redes de computadores. II. COMPONENTES DE UMA LAN Servidores (Server) → Computadores que disponibilizam recursos aos usuários, em uma rede local. Cliente (Host) → Computador que acessa recursos compartilhados nos servidores em uma rede local. Qualquer computador em uma rede pode ser servidor e/ou cliente, basta que ele disponibilize e/ou acesse recursos. Placas de Rede → Interface que permite a comunicação do computador com a rede local. Ela é responsável pela comunicação e realização de tarefas essenciais para que não haja irregularidades na transmissão dos dados. Cabos → Podem ser coaxial, par trançado (UTP – Unshiled Twisted Pair) ou de fibra ótica. Conectores → Podem se do tipo BNC para cabos coaxiais, RJ-45 para os cabos do tipo UTP ou do tipo ST para os cabos de fibra ótica. Hub → Utilizado para interligar equipamentos através de sua placa de rede. Em um hub, os dados sempre são enviados simultaneamente para todas as suas portas. Switch → Utilizado para interligar equipamentos através de sua placa de rede. Ao contrário do hub, os dados não são transmitidos simultaneamente para todas as suas portas, mas apenas para as que estão participando da comunicação, desta forma há um ganho de desempenho na rede. Roteador → Equipamento que seleciona a melhor rota para envio de dados entre redes. Esses dados, em alguns roteadores, podem ser compactados visando aumentar a taxa de transferência. Um computador pode ser configurado para desempenhar esta função. Gateway → Basicamente é um equipamento que permite que os computadores de uma rede possam se comunicar e serem acessados por outras redes. III. TOPOLOGIAS Barramentos → os computadores são conectados em um único meio físico. Os dados transmitidos são encaminhados para todos os computadores, porém apenas o destinatário acessa aos dados. Estrela → os computadores são conectados a um concentrador (hub ou switch), usando cabos de par trançado. Anel → os computadores são conectados a um único cabo passando por todos os micros e volta ao primeiro. IV. CONCEITOS BÁSICOS DE REDE Endereçamento → Identificador numérico, único, atribuído a cada dispositivo em uma rede. Este endereçamento segue um formato padrão definido, quando em redes roteadas divide-se em duas partes: rede e host. Esta identificação única é chamada de endereço MAC ou endereço físico. Pacotes ou datagramas → São dados divididos em partes e enviados pela rede em forma de blocos. Esses blocos são endereçados de forma individual. Protocolo → É o conjunto de regras que definem como os dados são transmitidos num meio de comunicação (controle de erros e retransmissão de dados, como os computadores são endereçados dentro da rede). Para que dois computadores possam se comunicar através da rede, é preciso que ambos usem o mesmo protocolo de rede. Nós de extremidade → Dispositivos que os usuários utilizam (estações de trabalho, PCs, impressoras, servidores de arquivos e outros). V. O MODELO DE REFERÊNCIA OSI 1 Histórico Os projetos surgiram com a idéia de estruturar a rede em um conjunto de camadas hierárquicas, que interagem com a camada imediatamente inferior e superior, sendo que cada camada ou nível deve ser pensado como um programa ou processo, implementado por hardware ou software, que se comunica com o processo correspondente na outra máquina. Para permitir esse intercâmbio de informações entre computadores de fabricantes distintos, tornou-se necessário definir uma arquitetura única, aberta e pública. Com este objetivo, a ISO (International Standards Organization) definiu um modelo denominado OSI-RM (Open Systems Interconnection - Reference Model), como um primeiro passo em direção à padronização internacional dos protocolos empregados nas diversas camadas (Day e Zimmermann, 1983), sendo revisto em 1995 (Day, 1995). As Camadas OSI são um conjunto de padrões ISO relativo à comunicação de dados, para facilitar o processo de padronização e obter interconectividade entre máquinas de diferentes sistemas operativos. Esse modelo serve de base para qualquer tipo de rede, seja de curta, média ou longa distância, dividido em camadas hierarquizadas, ou seja, cada camada usa as funções da própria camada ou da camada anterior, para esconder a complexidade e transparecer as operações para o usuário, seja ele um programa ou outra camada. 2 As camadas do modelo OSI e suas funções Cada camada do modelo de referência OSI tem um conjunto de funções que deve executar para que os pacotes de dados trafeguem de uma origem a um destino em uma rede. O envio das solicitações acontece entre as camadas. Por exemplo, quando a camada aplicação envia alguma solicitação, esta adiciona o cabeçalho ao pacote e repassa-o para a camada seguinte, que por sua vez também adicionará o seu cabeçalho. Isto se repete até a última camada, a camada física, que envia ao receptor (host). No receptor o pacote percorrerá as camadas em uma ordem inversa com relação ao remetente, primeiro a física, depois enlace até a última (camada de aplicação). Em cada uma será removido o cabeçalho adicionado pela camada de mesmo nível no host remetente. 2.1 A camada Física A camada Física trata da transmissão de bits brutos por um canal de comunicação. O projeto de rede deve garantir que, quando um lado enviar o bit 1 o outro lado o receberá como bit 1. Nesse caso, as questões mais comuns são a voltagem a ser usada para representar um bit 1 e um bit 0, a quantidade de nanossegundos que um bit deve durar, o fato da a transmissão poder ser ou não realizada nos dois sentidos simultaneamente, a forma como a conexão inicial será estabelecida e de que maneira ela será encerrada quando ambos os lados tiverem terminado, e ainda quantos pinos o conector de rede terá e qual será a finalidade de cada pino. 2.2 A camada de Enlace de Dados A principal tarefa da camada de enlace de dados é transformar um canal de transmissão bruto em uma linha que pareça livre de erros de transmissão não detectados para a camada de Rede. Para executar esta tarefa, a camada de enlace de dados faz com que o transmissor divida os dados de entrada em quadros de dados (que, em geral, têm algumas centenas ou alguns milhares de bytes), e os transmita seqüencialmente. Se o serviço for confiável, o receptor confirmará a recepção correta de cada quadro, enviando de volta um quadro de confirmação. Outra questão que surge na camada de enlace de dados (e na maioria das camadas mais altas) é como impedir que um transmissor rápido envie uma quantidade excessiva de dados a um receptor lento. Com freqüência, é necessário algum mecanismo que regule o tráfego para informar ao transmissor quanto espaço o buffer do receptor tem no momento. Muitas vezes esse controle de fluxo e o tratamento dos erros estão integrados. 2.3 A camada de Rede A camada de Rede controla a operação da subrede. Uma questão fundamental de projeto é determinar como os pacotes são roteados da origem até o destino. As rotas podem se basear em tabelas estáticas raramente alteradas, ou podem ser altamente dinâmicas, sendo determinadas para cada pacote. O controle de congestionamento, a qualidade do serviço fornecido (retardo, tempo em trânsito, instabilidade, etc.) também pertence à camada de rede. O endereçamento, o tamanho dos pacotes, os protocolos utilizado pela segunda rede podem ser diferentes do que é empregado pela primeira. Cabendo a camada de rede superar todos esses problemas, a fim de permitir que redes heterogêneas sejam interconectadas. 2.4 A camada de Transporte A função básica da camada de transporte é aceitar dados da camada de sessão, dividi-los em unidades menores caso necessário, repassar essas unidades à camada de rede e assegurar que todos os fragmentos chegarão corretamente à outra extremidade. Além do mais, tudo isso deve ser feito com eficiência e de forma que as camadas superiores fiquem isoladas das inevitáveis mudanças na tecnologia de hardware. A camada de transporte também determina o tipo de serviço que deve ser fornecido à camada de sessão e, em última análise, aos usuários da rede. O tipo de serviço é determinado quando a conexão é estabelecida. (Observe que é impossível conseguir um canal livre de erros; o que realmente se entende por essa expressão é que a taxa de erros é baixa o suficiente para ser ignorada na prática). A camada de transporte é uma verdadeira camada fim a fim, que liga a origem ao destino. Nas camadas inferiores, os protocolos são trocados entre cada uma das máquinas e seus vizinhos imediatos e não entre as máquinas de origem e de destino, que podem estar sepa- radas por muitos roteadores. As camadas de 1 a 3 são encadeadas, e as camadas de 4 a 7 são camadas fim a fim. 2.5 A camada de Sessão A camada de sessão permite que os usuários de diferentes máquinas estabeleçam sessões entre eles. Uma sessão oferece diversos serviços, inclusive o controle de diálogo, o gerenciamento de token (impedindo que duas partes tentem executar a mesma operação crítica ao mesmo tempo) e a sincronização (realizando a verificação periódica de transmissões longas para permitir que elas continuem a partir do ponto em que estavam ao ocorrer uma falha). 2.6 A camada de Apresentação A camada de apresentação está relacionada à sintaxe e à semântica das informações transmitidas. Para tornar possível a comunicação entre computadores com diferentes representações de dados, as estruturas de dados a serem intercambiadas podem ser definidas de maneira abstrata, juntamente com uma codificação padrão. 2.7 A camada de Aplicação A camada de aplicação contém uma série de protocolos, que rodam aplicativos ou programas específicos, comumente necessários para os usuários. intermediárias deixassem de operar repentinamente. Além disso, era necessária uma arquitetura flexível, capaz de se adaptar a aplicações com requisitos divergentes como, por exemplo, a transferência de arquivos e a transmissão de dados de voz em tempo real. Este projeto levou à criação do modelo TCP/IP que se tornou, desde então, o padrão no qual a Internet se desenvolveu, sendo definido pela primeira vez em Cerf e Kahn (1974). Uma nova perspectiva foi oferecida mais tarde em Leiner et al. (1985). A filosofia na qual se baseia o modelo é discutida em Clark (1988). O TCP define como é feita a divisão dos dados em pacotes para serem transmitidos à rede e como esses pacotes devem ser remontados no seu destino. O IP é responsável pela manipulação do endereçamento de cada pacote, garantindo que eles cheguem ao destino correto. 2 Camadas do TCP/IP O modelo TCP/IP foi criado em quatro camadas: as camadas de aplicação, transporte, Internet ou Inter-rede e rede. O TCP/IP, na verdade, não é apenas um, mas a união de diversos protocolos, baseado numa arquitetura cliente/servidor considerada quase perfeita, possibilitando o acesso simultâneo de diversos sistemas operacionais (Macintosh, Unix, Win32, Linux...) na mesma rede. 2.1 A camada de Rede Abaixo da camada Internet, encontra-se a camada de Rede, sendo esta um grande vácuo. O modelo de referência TCP/IP não especifica muito bem o que acontece aqui, exceto o fato de que o host tem de se conectar a rede utilizando algum protocolo para que seja possível enviar pacotes IP. Esse protocolo não é definido e varia de host para host e de rede para rede. Os livros e a documentação que tratam do modelo TCP/IP raramente descrevem esse protocolo. VI. O MODELO DE REFERÊNCIA TCP/IP 1 Conceito do TCP/IP O modelo de referência TCP/IP foi desenvolvido pelo Departamento de Defesa dos Estados Unidos (DoD), para permitir que equipamentos localizados em diversas partes do mundo, utilizando diferentes computadores, sistemas operacionais, conexões e cabeamentos, pudessem se comunicar. Os pacotes de dados são transmitidos independentemente do hardware e software utilizados. Diante da preocupação do DoD de que seus hosts, roteadores e gateways de interconexão de redes fossem destruídos de uma hora para outra, definiu-se também que a rede deveria ser capaz de sobreviver a perda do hardware de sub-redes, com as conversações existente sendo mantidas em atividade. Ou seja, queria que as conexões permanecessem intactas enquanto as máquinas de origem e de destino estivessem funcionando, mesmo que algumas máquinas ou linhas de transmissão 2.2 A camada de Internet As necessidades levantadas no modelo TCP/IP levaram à escolha de uma de comutação de pacotes baseada em uma camada de interligação de redes sem conexões. Essa camada também conhecida como camada inter-redes, integra toda a arquitetura. Sua tarefa é permitir que os hosts injetem pacotes em qualquer rede e garantir que eles trafegarão independentemente do destino (talvez em uma rede diferente). Eles podem chegar até mesmo em uma ordem diferente daquela em que foram enviados, obrigando as camadas superiores a reorganizá-los, se for necessário. A expressão “interredes” é usada em sentido genérico neste caso, muito embora essa camada esteja presente na Internet. A analogia usada nesse caso diz respeito ao sistema de correio (convencional). Uma pessoa pode deixar uma seqüência de cartas internacionais em uma caixa de correio em um país e, com um pouco de sorte, a maioria delas será entregue no endereço correto no país de destino. Provavelmente, as cartas atravessarão um ou mais gateways internacionais ao longo do caminho, mas esse processo é transparente para os usuários. Além disso, o fato de cada país (ou seja, cada rede) ter seus próprios selos, tamanhos de envelope preferidos e regras de entrega ficam ocultos dos usuários. A camada inter-redes define um formato de protocolo chamado IP (Internet Protocol). A tarefa desta camada é entregar pacotes IP onde eles são necessários. O roteamento dos pacotes é uma questão de grande importância nessa camada, assim como a necessidade de evitar o congestionamento. Por esses motivos é muito parecida com a camada de Rede do modelo OSI. 2.3 A camada de Transporte Esta localizada acima da camada inter-redes e tem a finalidade de permitir que as entidades pares de hosts de origem e destino mantenham uma conversação, exatamente como acontece na camada de Transporte do modelo OSI. Dois protocolos fim a fim foram definidos aqui, o TCP (Transmission Control Protocol – Protocolo de Controle de Transmissão) e o UPD (User Datagram Protocol – Protocolo de Datagrama do Usuário). O primeiro deles, o TCP é um protocolo orientado a conexão confiável que permite a entrega sem erros de um fluxo de bytes originário de uma determinada máquina em qualquer computador da inter-rede. Esse protocolo fragmenta o fluxo de bytes de entrada em mensagens discretas e passa cada uma delas para a camada interredes. No destino, o processo TCP receptor volta a montar as mensagens recebidas no fluxo de saída. O TCP também cuida do controle de fluxo, impedindo que um transmissor rápido sobrecarregue um receptor lento, com um volume de mensagens maior do que ele pode manipular. O segundo deles, o UDP é um protocolo não orientado a conexão e não confiável destinado a aplicações que não requerem controle de fluxo nem manutenção da seqüência das mensagens enviadas, e desejam fornecer seus próprios recursos para isso. Ele é amplamente utilizado em consultas e aplicações diretas do tipo cliente/servidor com solicitação/resposta, nas quais a entrega imediata é mais importante do que a entrega precisa, como a transmissão de dados de voz ou de vídeo. 2.4 A camada de Aplicação Acima da camada de transporte, encontramos a camada de aplicação. Ela contém todos os protocolos de níveis mais altos. Dentre eles estão vários protocolos como Telnet, SSH, FTP, DHCP, SMTP, POP3, IMAP, DNS, e o HTTP dentre muitos outros. O modelo TCP/IP não tem as camadas de sessão e apresentação. A experiência com o modelo OSI demonstrou que são pouco usadas na maioria das aplicações. VII. COMPARAÇÃO DO MODELO OSI E TCP/IP Os modelos de referência OSI e TCP/IP têm muito em comum. Os dois se baseiam no conceito de uma pilha de protocolos independentes. Além disso, algumas camadas têm praticamente as mesmas funções. Por exemplo, em ambos os modelos estão presente as camadas que englobam até a camada de transporte para oferecer um serviço de transporte fim a fim independente da rede e processos que desejem se comunicar. Essas camadas formam o provedor de transporte. Mais uma vez, em ambos os modelos, as camadas acima da camada de transporte são usuárias, orientadas a aplicações do serviço de transporte. Apesar dessas semelhanças fundamentais, os dois modelos também têm muitas diferenças. É importante notar que estamos comparando os modelos de referência, e não as pilhas de protocolos correspondentes. Para examinar as semelhanças e as diferenças entre o TCP/IP e o OSI, pode-se consultar Piscitello e Chapin (1993). O modelo OSI tem três conceitos fundamentais: Serviços, Interfaces e Protocolos. Provavelmente, a maior contribuição do modelo OSI seja tornar explícita a distinção entre esses três conceitos. Cada camada executa alguns serviços para a camada acima dela. A definição do serviço informa o que a camada faz, e não a forma como as entidades acima dela o acessam ou como a camada funciona. Essa definição estabelece a semântica da camada. A interface de uma camada informa como os processos acima dela podem acessá-la. A interface especifica quais são os parâmetros e os resultados a serem esperados. Ela também não revela o funcionamento interno da camada. Finalmente, os protocolos utilizados em uma camada são de responsabilidade dessa camada. Em cada camada pode ser usado quaisquer protocolos desde que eles viabilizem a realização das tarefas de uma camada específica. Pode-se também alterar esses protocolos sem influenciar o software das camadas superiores ou inferiores. Essas idéias se adaptam perfeitamente aos novos conceitos da programação orientada a objetos. Um objeto, assim como uma camada, tem um conjunto de métodos (operações) que os processos externos ao objeto podem invocar. A semântica desses métodos define o conjunto de serviços que o objeto oferece. Os parâmetros e os resultados dos métodos formam a interface do objeto. O código interno do objeto é seu protocolo, que não é visível nem interessa aos elementos que estão fora do objeto. Originalmente, o modelo TCP/IP não distinguia com clareza a diferença entre serviço, interface e protocolo, embora as pessoas tenham tentado adaptá-lo ao modelo OSI. Por exemplo, os únicos serviços reais oferecidos pela camada inter-redes são SEND IP PACKET (enviar pacote IP) e RECEIVE IP PACKET (receber pacote IP). Por essa razão, os protocolos do modelo OSI são mais bem encapsulados que os do modelo TCP/IP e podem ser substituídos com relativa facilidade, conforme as mudanças da tecnologia. Um dos principais objetivos das diversas camadas de protocolos é permitir a implementação dessas alterações. O modelo de referência OSI foi concebido antes dos protocolos correspondentes terem sido criados. Isso significa que o modelo não foi desenvolvido com base em um determinado conjunto de protocolos, o que o deixou bastante flexível e genérico. No entanto, por não terem experiência no assunto, os projetistas não tinham muita noção sobre a funcionalidade que deveria ser incluída em cada camada, segundo Tanenbaum (2003). Por exemplo, a camada de enlace de dados lidava originalmente com redes ponto a ponto. Quando surgiram as redes de difusão, foi preciso criar uma nova camada no modelo. Quando as pessoas começaram a criar redes reais com base no modelo OSI e nos protocolos existentes, elas perceberam que as especificações de serviço obrigatórias não eram compatíveis. Portanto, foi necessário enxertar no modelo subcamadas de convergência que permitissem atenuar as diferenças. Por fim, como se acreditava que cada país teria uma rede controlada pelo governo e baseada no modelo OSI, não houve a preocupação adequada com as conexões inter-redes. Ou seja, na prática, tudo aconteceu de maneira muito diferente da teoria. Com o TCP/IP, ocorreu exatamente o contrário: como os protocolos vieram primeiro, o modelo foi criado como uma descrição desses protocolos. Os protocolos não tiveram problemas para se adaptar ao modelo. Foi um casamento perfeito. O único problema foi o fato de o modelo não se adaptar a outras pilhas de protocolos. Conseqüentemente, ele não tinha muita utilidade para descrever outras redes que não faziam uso do protocolo TCP/IP. Deixando a filosofia de lado e entrando em questões mais práticas, uma diferença óbvia entre os dois modelos está no número de camadas: o modelo OSI tem sete camadas e o TCP/IP tem quatro. Ambos têm camadas de (inter-) rede, transporte e aplicação, mas as outras são diferentes. Outra diferença está na área de comunicação sem conexão e da comunicação orientada a conexões. Na camada de rede, o modelo OSI é compatível com a comunicação sem conexão e com comunicação orientada a conexões; no entanto, na camada de transporte, o modelo aceita apenas a comunicação orientada a conexões, onde ela de fato é mais importante (pois o serviço de transporte é visível para os usuários). O modelo TCP/IP só tem um modo de operação de camada de rede (sem conexão), mas aceita ambos os modos na camada de transporte, oferecendo aos usuários a possibilidade de escolha. Essa escolha é especialmente importante para os protocolos simples de solicitação/resposta. Além do mais, o modelo OSI não é realmente rico o suficiente nas camadas mais baixas para capturar a verdadeira divisão de camadas; é necessária uma camada extra (a camada internet) entre as camadas de transporte e de rede. Protocolos específicos para um tipo de rede que rodam em cima de estrutura de hardware básica precisam estar na camada de rede. Exemplos desse tipo de protocolo são ARP e o Spanning Tree Protocol (usado para manter pontes de rede redundantes em "espera" enquanto elas são necessárias). Entretanto, eles são protocolos locais e operam debaixo da funcionalidade internet. Reconhecidamente, colocar ambos os grupos (sem mencionar protocolos que são logicamente parte da camada internet, mas rodam em cima de um protocolo internet, como ICMP) na mesma camada pode ser um tanto confuso, mas o modelo OSI não é complexo o suficiente para apresentar algo melhor. Exemplo da correlação entre o modelo TCP/IP e modelo OSI. Geralmente, as três camadas mais acima do modelo OSI (aplicação, apresentação e sessão) são consideradas como uma única camada (aplicação) no modelo TCP/IP. Isso porque o TCP/IP tem uma camada de ses- são relativamente leve, consistindo de abrir e fechar conexões sobre TCP e RTP (Real Time Protocol - Protocolo de Tempo Real) e fornecer diferentes números de portas para diferentes aplicações sobre TCP e UDP. Se necessário, essas funções podem ser aumentadas por aplicações individuais (ou bibliotecas usadas por essas aplicações). Similarmente, IP é projetado em volta da idéia de tratar a rede abaixo dele como uma caixa preta de forma que ela possa ser considerada como uma única camada para os propósitos de discussão sobre TCP/IP. VIII. CONCLUSÃO Este artigo teve o propósito de apresentar os conceitos básicos, as topologias, os componentes de uma rede de computadores e os modelos de referência OSI e TCP/IP, além de realizar uma comparação entre ambos os modelos. Hoje em dia, cada vez mais se está utilizando sistemas informatizados, seja para gerenciamento ou controle de outros sistemas. Com o crescimento das implementações das redes de computadores para a transmissão de dados ou voz, seja no meio civil ou militar, o conhecimento de tais redes é de fundamental importância para a Guerra Eletrônica, a qual não pode negligenciar este avanço tecnológico que lhe abre outra vertente para a aquisição de dados através dos sinais digitais e somente quando compreendermos seus mecanismos com propriedade é que seremos capazes de extrair de maneira efetiva os dados de interesse ou as informações que procuramos. X. REFERÊNCIAS TANEBAUM, Andrew S. Redes de Computadores. Rio de janeiro, editora campos, 2003. ROESLER, Valter. Teleprocessamento. Apostila da disciplina de Comunicação de Dados, Unisinos, 1995. HUNT, Craig. TCP/IP Network Administration. 2 ed. O’Reilly & Associates, 1997. NAUGLE, Matthew G. Illustrated TCP/IP. Wiley Computer Publishing, 1998.