Prévia do material em texto
Redes de
Computadores
e Internet
R
ed
es d
e
C
o
m
p
u
tad
o
res
e In
tern
et
Redes de
Computadores
e Internet
CONTEÚDO ONLINE
Douglas E. ComerDouglas E. Comer
D
o
u
g
las E
. C
o
m
er
6ª EDIÇÃO
6ª EDIÇÃO
6
ª E
D
IÇ
Ã
O
R
ed
es d
e
C
o
m
p
u
tad
o
res e In
tern
et
Redes e Internet
D
o
u
g
las E
. C
o
m
er
6ª ED.
Escrito por um dos maiores especialistas em redes no mundo,
Douglas E. Comer, este livro apresenta, de forma ampla e sistemática,
os mais importantes conceitos, princípios e tecnologias das redes de
computadores e da Internet. De fácil leitura, não requer experiência
prévia com sistemas operacionais ou redes nem conhecimento
avançado de matemática. Além disso, combina o melhor das
abordagens top-down e bottom-up, permitindo aos professores
adaptar o conteúdo às suas necessidades em sala de aula. Totalmente
revisada e atualizada, esta nova edição inclui IPv4 e IPv6 em todos os
capítulos e traz ainda tópicos emergentes e tendências, como a
Internet das Coisas e as Redes Definidas por Software (SDN).
Acesse o nosso site, www.grupoa.com.br,
cadastre-se gratuitamente, encontre a página
do livro por meio do campo de busca e clique
no link Conteúdo Online para fazer download
do código para a API simplificada e de materiais
extras para alunos e professores (em inglês).
www.grupoa.com.br
0800 703 3444
A Bookman Editora é um dos selos
editoriais do Grupo A Educação,
empresa que oferece soluções em
conteúdo, tecnologia e serviços
para a educação acadêmica e
profissional.
COMPUTAÇÃO E TI
www.grupoa.com.br
BAEZA-YATES, R.; RIBEIRO-NETO, B.
Recuperação de Informação – Conceitos e Tecnologia das
Máquinas de Busca – 2.ed.
COMER, D. E.
Redes de Computadores e Internet – 6.ed.
COULOURIS, G.; DOLLIMORE, J.; KINDBERG, T.; BLAIR, G.
Sistemas Distribuídos – Conceitos e Projeto – 5.ed.
FOROUZAN, B. A.
Comunicação de Dados e Redes de Computadores – 4.ed.
FOROUZAN, B. A.; FEGAN, S. C.
Protocolo TCP/IP - 3.ed
FOROUZAN, B. A.; MOSHARRAF, F.
Redes de Computadores – Uma Abordagem Top-Down
GOODRICH, M. T.; TAMASSIA, R.
Introdução à Segurança de Computadores
MCCARTHY, N. K.
Resposta a Incidentes de Segurança em Computadores –
Planos para Proteção de Informação em Risco
MCCLURE, S.; SCAMBRAY, J.; KURTZ, G.
Hackers Expostos 7 – Segredos e Soluções para a
Segurança de Redes – 7.ed.
WRIGHTSON, T.
Segurança de Redes Sem Fio – Guia do Iniciante
Catalogação na publicação: Poliana Sanchez de Araujo – CRB 10/2094
C732r Comer, Douglas E.
Redes de computadores e internet [recurso eletrônico] /
Douglas E. Comer ; tradução: José Valdeni de Lima, Valter
Roesler. – 6. ed. – Porto Alegre : Bookman, 2016.
Editado como livro impresso em 2016.
ISBN 978-85-8260-373-4
1. Redes de computadores. 2. Internet. I. Título.
CDU 004.7
O autor
Dr. Douglas Comer é um internacionalmente reconhecido especialista em redes de com-
putadores, protocolos TCP/IP e Internet. Foi um dos pesquisadores que contribuíram
com a formação da Internet no fim dos anos 1970 e nos anos 1980, sendo membro do In-
ternet Architecture Board, o grupo responsável por guiar o desenvolvimento da Internet.
Também foi presidente do comitê técnico CSNET, membro do comitê executivo CSNET
e presidente do Distributed Systems Architecture Board da DARPA (Defense Advanced
Research Projects Agency). Foi ainda Vice-Presidente de Pesquisa na Cisco Systems.
Comer é consultor de projeto de redes de computadores para empresas e palestran-
te frequente em ambientes acadêmicos e profissionais ao redor do mundo. Seu sistema
operacional, Xinu, e a implementação de protocolos TCP/IP (ambos documentados em
seus livros) são utilizados em produtos comerciais. É professor honorário de Ciências
da Computação na Purdue University, onde leciona redes de computadores, redes de
internet, arquitetura de computadores e sistemas operacionais. Lá desenvolveu labora-
tórios de informática inovadores que dão aos alunos a oportunidade de ter experiências
práticas na operação de sistemas, redes de computadores e protocolos.
Além de escrever livros técnicos best-sellers, já traduzidos para 16 idiomas, atuou
como editor norte-americano do periódico Software – Practice and Experience por 20
anos. Comer é membro da ACM. Informações adicionais podem ser encontradas em:
w ww.cs.purdue.edu/homes/comer.
http://www.cs.purdue.edu/homes/comer.
Capítulo 3 Programação em redes e aplicações da Internet 33
o esquema evita manter os dados em um servidor central. Conceitualmente, dados são
distribuídos igualmente por N servidores, e cada requisição de cliente é enviada para
o servidor mais apropriado. Como um determinado servidor somente fornece 1/N dos
dados, a quantidade de tráfego entre o servidor e a Internet é 1/N quando comparado
à arquitetura de servidor único. A ideia principal é que o software do servidor pode
rodar no mesmo computador dos clientes. Se cada usuário concordar em localizar 1/N
dos dados em seu computador, não serão necessários servidores especiais. A Figura 3.6
ilustra a arquitetura. O exemplo mostra somente quatro computadores. Em um sistema
p2p real, o tráfego em um computador pode ser extremamente pequeno, pois N pode ser
extremamente grande (dezenas de milhares).
Internet
1/N de todo o tráfego
Figura 3.6 Interação exemplo em um sistema peer-to-peer.
3.13 Programação em redes e API de sockets
A interface utilizada pelas aplicações para comunicação na Internet é conhecida como
interface de programas de aplicação (API, Application Program Interface)3. Embora os
detalhes exatos de uma API dependam do sistema operacional, uma API particular tem
emergido como um padrão de fato para softwares que se comunicam via Internet. Co-
nhecida como API de sockets e comumente abreviada como sockets, a API está disponí-
vel para muitos sistemas operacionais, como Microsoft Windows, Apple OS-X, Android
e vários sistemas UNIX, incluindo o Linux. Em resumo:
A API de sockets, que se tornou o padrão de fato para comunicação via Inter-
net, está disponível na maioria dos sistemas operacionais.
O restante do capítulo descreve funções na API de sockets; leitores que não são progra-
madores podem pular os detalhes.
3.14 Sockets, descritores e E/S de rede
Pelo fato de ter sido desenvolvida originalmente como parte do sistema operacional
UNIX, a API de sockets é integrada com a E/S (Entrada/Saída ou I/O, Input/Output).
Em particular, quando uma aplicação cria um socket para comunicação na Internet, o
sistema operacional retorna um pequeno descritor inteiro que identifica o socket. A apli-
cação então passa o descritor como um argumento quando ele chama funções para fazer
3 O Apêndice 1 contém uma API simplificada (com somente sete funções) e um código-exemplo que demons-
tra como tal API pode ser utilizada para criar aplicações na Internet, incluindo um servidor Web funcional.
Comer_03.indd 33Comer_03.indd 33 29/10/15 14:4629/10/15 14:46
mmedeiros
Text Box
mmedeiros
Text Box
34 Parte I Introdução a redes e aplicações da Internet
a operação no socket (por exemplo, transferir dados através da rede ou receber dados
que estão chegando).
Em muitos sistemas operacionais, descritores de sockets são integrados com ou-
tros descritores de E/S. Como resultado, uma aplicação pode utilizar as operações read e
write tanto para E/S nos sockets quanto para E/S em arquivo. Para resumir:
Quando uma aplicação cria um socket, o sistema operacional retorna um pe-
queno descritor inteiro que a aplicação utiliza para referenciar o socket.
3.15 Parâmetros e API de sockets
Programação em sockets é diferente da E/S convencional, porque uma aplicação pre-
cisa especifica muitos detalhes, como o endereço do computador remoto, um número
de porta para o protocolo e se a aplicação vai agir como cliente ou servidor (i.e., se vai
iniciar a conexão). Para evitar uma única função de sockets com muitos parâmetros,
os projetistas da API preferiram definirmuitas funções. Essencialmente, uma aplica-
ção cria o socket e então invoca as funções para especificar os detalhes. A vantagem
da abordagem do socket é que a maioria das funções possui três ou quatro parâme-
tros; a desvantagem é que o programador deve lembrar-se de chamar múltiplas fun-
ções quando utiliza sockets. A Figura 3.7 resume as funções-chave da API de sockets.
Nome Usado por Signifi cado
accept servidor Aceita uma chamada entrante
bind servidor Especifi ca endereço IP e porta para o protocolo
close ambos Termina a comunicação
connect cliente Conecta com a aplicação remota
getpeername servidor Obtém o endereço IP do cliente
getsockopt servidor Obtém as opções atuais do socket
listen servidor Prepara o socket para uso do servidor
recv ambos Recebe dados ou mensagens entrantes
recvmsg ambos Recebe dados (no paradigma de mensagem)
recvfrom ambos Recebe uma mensagem e o endereço do transmissor
send ambos Envia mensagem ou dados
sendmsg ambos Envia uma mensagem
sendto ambos Envia uma mensagem (variante do sendmsg)
setsockopt ambos Muda as opções do socket
shutdown ambos Termina a conexão
socket ambos Cria o socket
Figura 3.7 Resumo das principais funções da API de sockets.
Capítulo 3 Programação em redes e aplicações da Internet 35
3.16 Chamadas de sockets em um cliente e em um servidor
A Figura 3.8 ilustra a sequência das chamadas de sockets efetuadas por típicos clientes
e servidores que utilizam conexão via fluxo (confiável). Na figura, o cliente envia os
dados primeiro e o servidor espera para recebê-los. Na prática, algumas aplicações são
configuradas para que o servidor envie dados antes (i.e., send e recv são chamados na
ordem inversa).
LADO DO CLIENTE LADO DO SERVIDOR
socket
connect
send
recv
close
socket
bind
listen
accept
recv
send
close
Figura 3.8 Ilustração da sequência das funções de socket chamadas por um cliente e um
servidor usando o paradigma de fluxo (confiável).
3.17 Funções de sockets utilizadas em clientes e
em servidores
3.17.1 A função socket
A função socket cria um socket e retorna um descritor inteiro.
descritor = socket(domain, type, protocol)
O argumento domain especifica a família de endereços que o socket vai utilizar. O iden-
tificador AF_INET especifica a versão 4 dos protocolos da Internet (IPv4) e o identifica-
dor AF_INET6 especifica a versão 6. O argumento type especifica o tipo de comunica-
ção que o socket vai utilizar: transferência de dados via fluxo (confiável) é especificada
com SOCK_STREAM, e transferência de mensagens não orientada à conexão é especifi-
cada com o valor SOCK_DGRAM.
O argumento protocol especifica um protocolo particular de transporte que o so-
cket usa. Ter um argumento protocol além do argumento type permite a um único con-
junto de protocolos incluir dois ou mais protocolos para o mesmo serviço. Os valores
que podem ser utilizados com o argumento protocol dependem da família de protocolos.
Tipicamente, IPPROTO_TCP é utilizado com SOCK_STREAM, e IPPROTO_UDP é
utilizado com SOCK_DGRAM.
Comer_03.indd 35Comer_03.indd 35 29/10/15 14:4629/10/15 14:46
36 Parte I Introdução a redes e aplicações da Internet
3.17.2 A função send
Tanto clientes como servidores utilizam a função send para transmitir dados. Tipicamen-
te, um cliente envia uma requisição e o servidor envia uma resposta. Send tem quatro
argumentos:
send (socket, data, length, flags)
O argumento socket é o descritor do socket a utilizar. O argumento data é o en-
dereço na memória do dado a enviar. O argumento length é um inteiro especificando
o número de bytes de dados a transmitir. O argumento flags contém bits que solicitam
opções especiais4.
3.17.3 A função recv
Tanto clientes como servidores utilizam a função recv para obter dados que foram envia-
dos pelo outro. A função tem o formato:
recv (socket, buffer, length, flags)
O argumento socket é o descritor do socket através do qual o dado será recebido. O
argumento buffer especifica o endereço na memória onde serão colocados os dados
entrantes. O argumento length especifica o tamanho do buffer. Finalmente, o argu-
mento flags permite ao chamador controlar alguns detalhes (por exemplo, permitir
que uma aplicação extraia uma cópia da mensagem que chega sem remover a mensa-
gem do socket). Recv bloqueia a aplicação até o dado chegar e então coloca até length
bytes de dados no buffer (a função retorna o número de bytes que foram extraídos do
pacote que chegou).
3.17.4 As funções read e write com sockets
Em alguns sistemas operacionais, como o Linux, as funções read e write podem ser
utilizadas em vez de recv e send. Read possui três argumentos que são idênticos aos
três primeiros da função recv, e write possui três argumentos que são idênticos aos três
primeiros da função send.
A grande vantagem de utilizar read e write é a generalização – uma aplicação
pode ser criada com o objetivo de transferir dados para ou a partir de um descritor
sem saber se o mesmo corresponde a um arquivo ou um socket. Dessa forma, um
programador pode utilizar um arquivo no disco local para testar um cliente ou um
servidor antes de tentar se comunicar através da rede. A grande desvantagem de usar
read e write é que o programa perde a portabilidade quando é compilado em outro
sistema operacional.
4 Muitas opções são para depuração do sistema e não estão disponíveis para aplicações cliente-servidor con-
vencionais.
Capítulo 3 Programação em redes e aplicações da Internet 37
3.17.5 A função close
A função close avisa ao sistema operacional que ele deve encerrar o socket5. Possui a
forma:
close (socket)
onde socket é o descritor do socket sendo encerrado. Se a conexão está aberta, close a
termina (ou seja, informa ao interlocutor remoto). Fechar um socket interrompe seu uso
imediatamente – o descritor é liberado, impedindo a aplicação de transmitir ou receber
dados.
3.18 A função connect utilizada somente pelo cliente
O cliente chama a função connect a fim de estabelecer uma conexão com um servidor
específico. A forma é:
connect (socket, saddress, saddresslen)
O argumento socket é o descritor do socket a utilizar na conexão. O argumento saddress
é a estrutura sockaddr, que especifica o endereço do servidor (IP e porta)6. O argumento
saddresslen especifica o tamanho do endereço do servidor medido em bytes.
Para um socket que utiliza o paradigma de fluxo (confiável), connect inicia a cone-
xão de nível de transporte com o servidor especificado. O servidor deve estar esperando
a conexão (ver função accept descrita a seguir).
3.19 Funções de socket utilizadas somente pelo servidor
3.19.1 A função bind
Quando é criado, o socket não contém informações sobre o endereço IP local ou remoto
e o número de porta. Um servidor chama bind para fornecer um número de porta no qual
ele vai ficar esperando o contato. Bind possui três argumentos:
bind (socket, localaddr, addrlen)
O argumento socket é o descritor do socket em uso. O argumento localaddr é uma estru-
tura que especifica o endereço local a ser atribuído ao socket. O argumento addrlen é um
inteiro que especifica o tamanho do endereço.
Como um socket pode ser utilizado com qualquer protocolo, o formato do endere-
ço depende do protocolo utilizado. A API de socket define uma forma genérica utiliza-
da para representar endereços, e então exige que cada família de protocolos especifique
5 No sistema operacional Microsoft Windows, o nome da função é closesocket em vez de close.
6 A combinação de endereço IP e porta é algumas vezes chamada de endereço de endpoint (ponto de origem
ou destino).
Comer_03.indd 37Comer_03.indd 37 29/10/15 14:4629/10/15 14:46
38 Parte I Introdução a redes e aplicações da Internet
como seus endereços de protocolos vão utilizar a forma genérica. O formato genérico
para representar um endereço é definido na estrutura sockaddr. Embora muitas versões
tenham sido liberadas, a maioria dos sistemas define a estrutura sockaddr com três
campos:
structsockaddr {
u_char sa_len; /* tamanho total do endereço */
u_char sa_family; /* família do endereço */
char sa_data[14]; /* o endereço em si */
};
O campo sa_len consiste em um único octeto que especifica o tamanho do ende-
reço. O campo sa_family especifica a família à qual o endereço pertence (a constante
simbólica AF_INET é utilizada para IPv4 e AF_INET6 para IPv6). Finalmente, o campo
sa_data contém o endereço.
Cada família de protocolos define o formato exato usado no campo sa_data da
estrutura sockaddr. Por exemplo, IPv4 utiliza a estrutura sockaddr_in para definir um
endereço.
struct sockaddr_in {
u_char sin_len; /* tamanho total do endereço */
u_char sin_family; /* família do endereço */
u_short sin_port; /* número da porta do protocolo */
struct in_addr sin_addr;/* endereço IPv4 do computador */
char sin_zero[8]; /* não utilizado (configurado para zero) */
};
Os primeiros dois campos da estrutura sockaddr_in correspondem exatamente aos
primeiros dois campos da estrutura genérica sockaddr. Os últimos três campos definem
a forma exata do endereço IP. Vale a pena ressaltar dois pontos. Primeiro, cada campo
identifica o computador e a porta do protocolo naquele computador. O campo sin_addr
contém o endereço IP do computador e o campo sin_port contém o número da porta.
Segundo, embora somente 6 bytes sejam necessários para armazenar um endereço IPv4
e uma porta, a estrutura genérica sockaddr reserva 14 bytes. Assim, o campo final da
estrutura sockaddr_in é um vetor de 8 bytes preenchido com zeros, que deixa a estrutura
sockaddr_in do mesmo tamanho que sockaddr.
Nós dissemos que um servidor chama bind para especificar a porta na qual vai
esperar as comunicações; entretanto, além da porta, a estrutura sockaddr_in contém
o número IP do servidor. Embora ele possa utilizar um IP específico, fazer isso pode
causar problemas quando o computador possui múltiplas conexões de rede, pois nes-
se caso ele tem também múltiplos endereços IP. A fim de permitir a um servidor ope-
rar em uma máquina com múltiplas conexões de rede, a API de sockets inclui uma
constante simbólica especial, INADDR_ANY, que permite ao computador especificar
um número de porta e estabelecer contato em qualquer um dos seus endereços IP.
Resumindo:
Embora a estrutura sockaddr_in inclua um campo de endereço IP, a API de so-
cket fornece uma constante simbólica que permite ao servidor especificar uma
porta de protocolo para qualquer um dos seus endereços IP no computador.
Capítulo 3 Programação em redes e aplicações da Internet 39
3.19.2 A função listen
Após utilizar bind para especificar uma porta, o servidor chama listen para colocar o
socket no modo passivo, tornando-o pronto para esperar contato dos clientes. Listen
possui dois argumentos:
listen (socket, queuesize)
O argumento socket é o descritor do socket. O argumento queuesize especifica um com-
primento para a fila de requisições de conexão do socket. Um sistema operacional cria
filas de requisições separadas para cada socket. Inicialmente, a fila está vazia. Conforme
as requisições chegam dos clientes, cada uma é inserida na fila. Quando o servidor soli-
cita recuperar uma requisição entrante no socket, o sistema extrai a próxima requisição
da fila. O tamanho da fila é importante: se ela estiver cheia quando a requisição chegar,
o sistema rejeita esta última.
3.19.3 A função accept
Um servidor chama accept para estabelecer uma conexão com o cliente. Se uma requisi-
ção de conexão está presente na fila, accept retorna imediatamente; se ainda não existem
conexões, o sistema bloqueia o servidor até um cliente enviar uma requisição de cone-
xão. Uma vez que a conexão tenha sido aceita, o servidor a utiliza para interagir com o
cliente. Após finalizar a comunicação, o servidor encerra a conexão.
A função accept tem a forma:
newsock = accept (socket, caddress, caddresslen)
O argumento socket é o descritor do socket que o servidor criou e associou (via bind)
com uma porta específica. O argumento caddress é o endereço de uma estrutura do tipo
sockaddr e caddresslen é um ponteiro para um inteiro. Accept preenche campos do ende-
reço caddress com o endereço do cliente que solicitou a conexão e configura caddresslen
com o comprimento desse endereço. Finalmente, accept cria um novo socket para a cone-
xão e retorna o descritor do novo socket. O servidor utiliza o novo socket para se comu-
nicar com o cliente e fecha o socket quando finalizada a conexão. Enquanto isso, o socket
original do servidor permanece sem modificações – após encerrar a comunicação com um
cliente, o servidor utilizar o socket original para aceitar a próxima conexão de um cliente.
Assim, o socket original é usado somente para aceitar as requisições de conexão, e toda co-
municação com um cliente ocorre por meio de um novo socket criado pela função accept.
3.20 Funções de socket utilizadas com o paradigma
de mensagem
As funções de socket utilizadas para enviar e receber mensagens são mais complicadas
do que as utilizadas com o paradigma de fluxo (confiável), porque muitas opções estão
disponíveis. Por exemplo, um transmissor pode escolher se armazena o endereço do
receptor no socket e somente envia dados ou se especifica o endereço do receptor a cada
vez que uma mensagem é transmitida. Além disso, uma função permite ao transmissor
Comer_03.indd 39Comer_03.indd 39 29/10/15 14:4629/10/15 14:46
40 Parte I Introdução a redes e aplicações da Internet
colocar o endereço e a mensagem em uma estrutura e passar o endereço da estrutura
como um argumento, e outra função permite ao transmissor passar o endereço e a men-
sagem como argumentos separados.
3.20.1 Funções de socket sendto e sendmsg
As funções sendto e sendmsg permitem ao cliente ou servidor enviar uma mensagem
utilizando um socket no paradigma de mensagens (sem conexão). Ambas requerem que
o chamador especifique o destino. Sendto usa argumentos separados para a mensagem
e endereço de destino:
sendto (socket, data, length, flags, destaddress, addresslen)
Os primeiros quatro argumentos correspondem aos quatro argumentos da função send;
os últimos dois especificam o endereço de destino e o tamanho desse endereço. O ar-
gumento destaddress corresponde a uma estrutura do tipo sockaddr (especificamente,
sockaddr_in).
A função sendmsg faz a mesma operação que sendto, mas abrevia os argumentos
definindo uma estrutura. Uma lista menor de argumentos pode facilitar a legibilidade em
programas que utilizem sendmsg:
sendmsg (socket, msgstruct, flags)
O argumento msgstruct é uma estrutura que contém informação sobre o endereço de
destino, o tamanho do endereço, a mensagem a ser enviada e o tamanho da mensagem.
struct msgstruct { /* estrutura usada por sendmsg */
struct sockaddr *m_saddr; /* ponteiro para endereço de destino */
struct datavec *m_dvec; /* ponteiro para mensagem (vetor) */
int m_dvlength; /* número de itens do vetor */
struct access *m_rights; /* ponteiro para acessar a lista de direitos */
int m_alength; /* número de itens na lista */
};
Os detalhes da estrutura acima não são importantes – devem ser vistos como uma
forma de combinar muitos argumentos em uma única estrutura. A maioria das aplica-
ções utiliza somente os três primeiros campos, que especificam o endereço de destino,
uma lista de itens que constituem a mensagem e o número de itens dessa lista.
3.20.2 Funções recvfrom e recvmsg
Um socket no paradigma de mensagens (sem conexão) pode ser utilizado para receber
mensagens de um conjunto arbitrário de clientes. Em tais casos, o sistema retorna o
endereço do transmissor junto com cada mensagem que chega (o receptor utiliza esse
endereço para enviar a resposta). A função recvfrom tem argumentos que especificam a
localização da próxima mensagementrante e o endereço do transmissor.
recvfrom (socket, buffer, length, flags, sndraddr, saddrlen)
Capítulo 3 Programação em redes e aplicações da Internet 41
Os primeiros quatro argumentos são os mesmos da função recv; os dois argumentos
adicionais, sndraddr e saddrlen, são utilizados para guardar o endereço IP do transmis-
sor, bem como seu tamanho. O argumento sndraddr é um ponteiro para uma estrutura
do tipo sockaddr na qual o sistema escreve o endereço do transmissor. O argumento
saddrlen é um ponteiro para um inteiro onde o sistema escreve o tamanho do endereço.
Note que recvfrom guarda o endereço do transmissor na forma exata que o sendto espe-
ra, tornando fácil transmitir a resposta.
A função recvmsg, que é a contraparte do sendmsg, opera da mesma forma que o
recvfrom, mas requer menos argumentos. Ela tem a forma:
recvmsg (socket, msgstruct, flags)
O argumento msgstruct dá o endereço da estrutura que armazena o endereço para uma
mensagem entrante, bem como a localização do endereço IP do transmissor. A msgstruct
gravada pela recvmsg usa exatamente o mesmo formato que a estrutura requerida pelo
sndmsg, tornando fácil receber uma requisição, gravar o endereço do transmissor e então
usar o endereço gravado para enviar uma resposta.
3.21 Outras funções de sockets
A API de sockets contém uma variedade de funções menores não descritas acima. Por
exemplo, depois que um servidor aceita uma conexão, ele pode chamar getpeername
para obter o endereço do cliente remoto que iniciou a conexão. Um cliente ou um servi-
dor pode também chamar gethostname para obter informações sobre o computador no
qual está rodando.
Duas funções de objetivo geral são utilizadas para manipular opções de socket. A
função setsockopt configura as opções de socket, enquanto getsockopt obtém as confi-
gurações atuais. As opções são utilizadas principalmente para lidar com casos especiais
(por exemplo, para aumentar o tamanho interno de buffer).
Duas funções fornecem tradução entre endereços de Internet e nomes de compu-
tadores. A função gethostbyname retorna o endereço IP de um computador a partir do
seu nome. Clientes geralmente chamam gethostbyname para traduzir um nome digitado
por um usuário em seu endereço IP correspondente. A função gethostbyaddr fornece o
mapeamento inverso – dado um endereço IP para um computador, retorna o nome desse
computador. Clientes e servidores podem utilizar gethostbyaddr para traduzir um ende-
reço IP em um nome que o usuário possa entender.
3.22 Sockets, threads e herança
A API de sockets trabalha com servidores concorrentes. Embora os detalhes dependam
do sistema operacional, as implementações de sockets aderem ao seguinte princípio da
herança:
Cada nova thread que é criada herda da thread que a criou uma cópia de todos
os sockets abertos.
Comer_03.indd 41Comer_03.indd 41 29/10/15 14:4629/10/15 14:46
42 Parte I Introdução a redes e aplicações da Internet
A implementação de socket utiliza um mecanismo de contagem de referência para
controlar cada socket. Quando um socket é criado pela primeira vez, o sistema configura
a contagem de referência desse socket para 1, e o socket existe enquanto essa contagem
permanecer positiva. Quando o programa cria uma thread adicional, esta herda um pon-
teiro para cada socket aberto existente no programa, e o sistema incrementa a contagem
de referência de cada socket em 1. Quando uma thread chama close, o sistema decremen-
ta a contagem de referência do socket; se a contagem chegar a zero, o socket é fechado.
Em termos de servidores concorrentes, a thread principal possui o socket utilizado
para aceitar conexões. Quando uma solicitação de conexão chega, o sistema cria um
novo socket para a nova conexão, e a thread principal cria uma nova thread para lidar
com a conexão. Imediatamente após a thread ser criada, ambas as threads têm acesso ao
socket original e também ao novo socket, e a contagem de referência de cada socket é 2.
A thread original chama close para o novo socket, e a thread de serviço chama close para
o socket original, reduzindo a contagem de referência deles para 1. Finalmente, quando
termina de interagir com um cliente, a thread de serviço chama close no novo socket,
reduzindo a contagem de referência para zero e causando o encerramento do socket.
Dessa forma, o tempo de vida dos sockets num servidor concorrente pode ser resumido
da seguinte forma:
O socket original utilizado para aceitar conexões existe enquanto a thread prin-
cipal está sendo executada; um socket utilizado para uma conexão específica
existe somente enquanto existir a thread que trata daquela conexão.
3.23 Resumo
Na Internet, todos os serviços são fornecidos por aplicações que utilizam ou o paradig-
ma de fluxo ou o paradigma de mensagem para se comunicar. O paradigma de fluxo
garante a entrega dos bytes na ordem correta, mas pode escolher quantos bytes vai pas-
sar ao receptor de cada vez. O paradigma de mensagem preserva os limites do pacote,
porém permite que mensagens sejam perdidas, duplicadas, atrasadas ou entregues fora
de ordem.
O modelo de comunicação básico utilizado pelas aplicações de rede é conhecido
como modelo cliente-servidor. O programa que espera passivamente pelo contato é cha-
mado de servidor e o programa que inicia contato ativamente com o servidor é chamado
de cliente.
Cada computador tem um endereço único, e cada serviço, tal como e-mail ou aces-
so Web, tem um identificador único conhecido como número de porta do protocolo.
Quando um servidor inicia a execução, ele especifica o número da porta; quando for
contatar o servidor, o cliente deve especificar tanto o endereço do servidor como o nú-
mero da porta do serviço.
Um único cliente pode acessar mais de um serviço, tanto em um servidor como em
servidores localizados em múltiplas máquinas. Além disso, um servidor de um serviço
pode se tornar um cliente de outros serviços. Projetistas e programadores devem ter cui-
dado para evitar dependências circulares entre servidores.
Uma interface de programa de aplicação (API, Application Program Interface)
especifica os detalhes de como um programa de aplicação interage com a pilha de pro-
mmedeiros
Text Box
Encerra aqui o trecho do livro disponibilizado para
esta Unidade de Aprendizagem. Na Biblioteca Virtual
da Instituição, você encontra a obra na íntegra.
Capa
Iniciais
Ficha catalográfica / O autor