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
●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
●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
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.
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)
Como Funciona a Internet
G
G
G
G
Internet
(gateways)
obelix
asterix
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)
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
Camada de Rede
Endereçamento e Subredes – IPv4
1100 100100010000100010100000 1010
Hexadecimal
Decimal (QDD)
Binário
192 1541168
c0 9a01a8
Não-especificado
Decimal (QDD)
0.0.0.0
255 0255255
Endereços especiais
Máscara de subrede
1111 0000
Hexadecimal
Binário
ff 00ffff
1111 1111111111111111 0000
Loopback/localhost 127.0.0.1/255.0.0.0
Endereço/comprimento 192.168.1.154/24
Formas de representação
Endereço/máscara 192.168.1.154/255.255.255.0
Endereço (32 bits)
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
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
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.
BSD Sockets (4.2BSD, 1983)
Funções
Cabeçalhos
sys/types.h
sys/socket.h
netdb.h
netinet/in.h
arpa/inet.h
Funções de início/fim
socket(2), close(2),
shutdown(2)
bind(2), connect(2)
listen(2), accept(2)
Funções de envio
send(2), sendto(2),
sendmsg(2), write(2)
Funçoes de recepção
recv(2), recvfrom(2),
recvmsg(2), read(2)
Funçoes auxiliares
fcntl(2), ioctl(2), select(2)
sendfile(2)
inet(3), byteorder(3)
BSD Sockets (4.2BSD, 1983)
Estruturas de Dados
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
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/

Workshop sobre programação em C usando a API Berkeley Sockets - Carlos A. M. dos Santos

  • 1.
    Workshop sobre programaçãoem 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 linguagemC ●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) ●Mestreem 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 destaapresentaçã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 deteoria (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 aInternet G G G G Internet (gateways) obelix asterix
  • 7.
    Modelo Conceitual (Tanenbaum) HTTP, etc TransporteTCP, 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: enviode 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
  • 9.
    Camada de Rede Endereçamentoe Subredes – IPv4 1100 100100010000100010100000 1010 Hexadecimal Decimal (QDD) Binário 192 1541168 c0 9a01a8 Não-especificado Decimal (QDD) 0.0.0.0 255 0255255 Endereços especiais Máscara de subrede 1111 0000 Hexadecimal Binário ff 00ffff 1111 1111111111111111 0000 Loopback/localhost 127.0.0.1/255.0.0.0 Endereço/comprimento 192.168.1.154/24 Formas de representação Endereço/máscara 192.168.1.154/255.255.255.0 Endereço (32 bits)
  • 10.
    Camada de Rede Endereçamentoe 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 Tiposde 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áriaspara 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.
  • 13.
    BSD Sockets (4.2BSD,1983) Funções Cabeçalhos sys/types.h sys/socket.h netdb.h netinet/in.h arpa/inet.h Funções de início/fim socket(2), close(2), shutdown(2) bind(2), connect(2) listen(2), accept(2) Funções de envio send(2), sendto(2), sendmsg(2), write(2) Funçoes de recepção recv(2), recvfrom(2), recvmsg(2), read(2) Funçoes auxiliares fcntl(2), ioctl(2), select(2) sendfile(2) inet(3), byteorder(3)
  • 14.
    BSD Sockets (4.2BSD,1983) Estruturas de Dados
  • 15.
    Prática (baseada no códigofornecido) ● 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/