Workshop sobre programação em C usando a API Berkeley Sockets - Carlos A. M. dos Santos
1. Workshop sobre programação em C
usando a API Berkeley Sockets
Carlos A. M. dos Santos
unixmania at gmail dot com
Workshop TcheLinux de Software Livre
FTEC, Porto Alegre
30 de maio de 2009
2. ●Conhecer a linguagem C
●Experiência básica com a interface do shell
●Saber usar um editor de programas
●Saber compilar um programa :-)
●Saber usar o comando man
●Curiosidade
Requisitos
3. ●Engenheiro Agrícola (UFPEL)
●Mestre em Ciência da Computação (UFRGS)
●1º Contato com Unix em 1989 (EMBRAPA)
●Experiência com diversos “sabores” de Unix
●Experiência com Linux de 1993 a 1999
●(Portuguese-HOWTO, LDP, SGMLtools)
●Usuário de FreeBSD desde 1999
●Ex-administrador de redes, ex-professor, etc.
●Atualmente, desenvolvedor (HP)
Sobre o Apresentador
4. Comunicado
O conteúdo desta apresentação não se refere a
qualquer produto, processo, tecnologia ou
informação pertencente HP.
As opiniões contidas nesta apresentação são de
responsabilidade exclusiva do autor e não refletem
políticas, práticas ou negócios da HP.
5. Conteúdo
Um pouco de teoria (calma, não dói!)
● Como funciona a Internet
– Modelo conceitual da Internet (Tanenbaum)
– Detalhes camada de rede
– Endereçamento e subredes
– Endereços IPv4 e IPv6
● Detalhes da camada de transporte
– Transmissão orientada a conexão (TCP)
– Transmissão orientada a datagrama (UDP)
Prática
● Servidor e cliente orientados a conexão
● Servidor e cliente orientados a datagrama
● Ambientes de pilha dupla (IPv4/IPv6)
6. Como Funciona a Internet
G
G
G
G
Internet
(gateways)
obelix
asterix
7. Modelo Conceitual
(Tanenbaum)
HTTP, etc
Transporte TCP, UDP
obelixasterix
IP
IEEE 802.2
IEEE 802.x
HTTP, etc
TCP, UDP
IP
IEEE 802.2
G
Rede
Enlace de dados
Física
Aplicação
IEEE 802.x
G
Host-to-network
(modelo Internet)
8. Modelo Conceitual
Exemplo: envio de formulário HTTP
Transporte
Rede
Enlace de dados
Física
Aplicação
carga (payload)
carga (payload)
carga (payload)
carga (payload)
origemdestino
origemdestino
origemdestino
...
00:1b:77:0f:32:87
192.168.1.154
80
POST /form.php HTTP/1.1
10. Camada de Rede
Endereçamento e Subredes – IPv6
fec0 00000000baba000ecafebebe 0001Hexadecimal
Endereço (128 bits)
Binário
Localhost/loopback
Hexadecimal + QDD
::1/128
Alguns enrereços especiais
Rede mista IPv6/ IPv4
ffff
c8a8Hexadecimal
192.168.1.2540000 0000000000000000
019a
Não-especificado ::/128
não cabe neste espaço
ffff0000 0000000000000000
Representação/notação
• 8 grupos de 4 dígitos hexadecimais
• zeros à esquerda de um grupo podem ser omitidos
• Um ou mais grupos seguidos de quatro zeros podem ser substituídos por “::”
• os 32 bits mais à direita podem ser representados em QDD
11. Camada de Transporte
Tipos de Transmissão Suportados
Com conexão (TCP)
●Entrega garantida
●Ordem garantida
●Controle de fluxo e
congestionamento
●Início e término do
envio demorados
(handshake)
Sem conexão (UDP)
●Não garante entrega
●Não garante ordem
●Não controla fluxo ou
congestionamento
●Envio imediato
12. Violações do Modelo
(necessárias para melhor desempenho)
Large segment offload (LSO) – delega o envio de
grandes segmentos de dados à placa de rede,
aliviando o processador.
TCP segmentation offload (TSO) – LSO em TCP.
A placa de rede deve possuir um TCP Offload
Engine or (TOE).
Large Receive Offload (LRO) – placas de rede
modernas acumulam pacotes recebidos em “rajada”
e geram uma só interrupção para todos eles. Isso
precisa ser tratado pelo driver.
15. Prática
(baseada no código fornecido)
● Fazer os servidores TCP e UDP receberem o
número da porta na linha de comando
● Fazer o cliente UDP receber o número da porta na
linha de comando
● Fazer os programas operarem em modo não
bloqueante. Dica: fcntl(2)
● Fazer os programas operarem com prazo para
envio/recebimento. Dica: select(2)
● Fazer os programas operarem em modo duplex
(um chat simples)
● Fazer os programas operarem com IPv4 e IPv6
16. Referências
Stevens, W. Richard; Fenner, Bill; Rudoff, Andrew. Unix
Network Programming. Addison-Wesley, 2004.
Tanenbaum, Andrew. Computer Networks, 4th
edition.
Prentice Hall, 2003.
Hall, Brian. Beej's Guide to Network Programming Using
Internet Sockets. http://beej.us/guide/bgnet/
Wikipedia. Berkeley sockets.
http://en.wikipedia.org/wiki/Berkeley_sockets
Wikipedia. Large segment offload
http://en.wikipedia.org/wiki/TCP_segmentation_offloading
TcheLinux. http://www.tchelinux.org/
As pessoas que fazem o TcheLinux.
http://people.tchelinux.org/