Pilha TCP/IP Walter Fetter Lages [email protected] Universidade Federal do Rio Grande do Sul Escola de Engenharia Departamento de Engenharia Elétrica Programa de Pós-Graduação em Engenharia Elétrica ELE00002 Sistemas de Automação Copyright (c) Walter Fetter Lages – p.1 Modelo OSI × TCP/IP • • • Usualmente as camadas físicas e enlace são implementadas através de uma rede Ethernet (IEEE-802.3) Camada de rede: IP Camada de transporte: TCP ou UDP • TCP: Serviço com conexão • UDP: Serviço sem conexão Copyright (c) Walter Fetter Lages – p.2 Conjunto de Protocolos TCP/IP Copyright (c) Walter Fetter Lages – p.3 Protocolos IP: Protocolo de rede TCP: Protocolo de transporte com conexão UDP: Protocolo de transporte sem conexão ICMP: Protocolo de controle IGMP: Protocolo de gerencimanto de multicasting ARP: Protocolo de mapeamento de IP em MAC RARP: Protocolo de mapeamento de MAC em IP Copyright (c) Walter Fetter Lages – p.4 Outros Protocolos Aplicativo Ping Traceroute RIP ICMP √ UDP √ √ TCP √ √ BGP BOOTP √ DHCP √ NTP √ SMTP √ FTP √ HTTP √ DNS √ √ NFS √ √ RPC √ √ Copyright (c) Walter Fetter Lages – p.5 Conexão • Three-way-handshake Copyright (c) Walter Fetter Lages – p.6 Desconexão Copyright (c) Walter Fetter Lages – p.7 Troca de Dados Copyright (c) Walter Fetter Lages – p.8 Endereçamento • • • Na camada IP, cada interface possui um endereço • 32 bits, na versão 4 • 128 bits, na versão 6 • Normalmente escrito na forma QDN Nas camadas TCP ou UDP, os endereços são denominados portas • 32 bits Socket • Ponto inicial e final da troca de dados • Par de endereços IP e TCP ou IP e UDP Copyright (c) Walter Fetter Lages – p.9 Retidores, Pontes e Roteadores Copyright (c) Walter Fetter Lages – p.10 Protocolo IP • • • • • • • Serviço de datagrama não confiável Endereçamento Hierárquico Facilidade de Fragmentação e Remontagem de pacotes Identificação da importância do datagrama e do nível de confiabilidade exigido Identificação da urgência do datagrama Roteamento adaptativo Descarte e controle do tempo de vida dos pacotes Copyright (c) Walter Fetter Lages – p.11 Endereços IP • • • • • Números com 32 bits (IPv6 tem 128 bits) Normalmente escritos como 4 octetos (em decimal) • 143.54.29.90 Podem identificar uma rede ou um host Endereços de rede tem o campo de identificação do host = 0 Difusão para todos os hosts de uma sub-rede: todos os bits do campo de host = 1 Copyright (c) Walter Fetter Lages – p.12 Endereços IP • • Endereço com todos os bits = 1 corresponde a um endereço por difusão para a rede do host origem Endereço 127.0.0.0 é reservado para teste (loopback) e comunicação entre processos na mesma máquina Copyright (c) Walter Fetter Lages – p.13 Classes de Endereços • Classe A 0 rede (7 bits) host (24 bits) • Bit mais significativo é 0 e os outros 7 bits identificam a rede (primeiro campo varia de 0 a 127) • 24 bits restantes identificam o endereço local • 126 redes, 16 M hosts Classe B 10 rede (14 bits) host (16 bits) • Dois octetos para o número da rede e dois para endereços de host • Endereços de rede de 128.1 a 191.255 (16 K redes e 64 K hosts) Copyright (c) Walter Fetter Lages – p.14 Classes de Endereços • Classe C 110 rede (21 bits) host (8 bits) • Três octetos para identificação da rede e um para host • Redes de 192.1.1 a 223.254.254 (endereços acima de 223 foram reservados para uso futuro), ou seja, 2M redes e até 254 hosts Copyright (c) Walter Fetter Lages – p.15 Endereços IP Copyright (c) Walter Fetter Lages – p.16 Endereços IP especiais Copyright (c) Walter Fetter Lages – p.17 Exemplo • Computador A terá endereço IP 200.1.2.1 e também endereço Ethernet (6 bytes, ex: 02:FE:87:4A:8C:A9) Copyright (c) Walter Fetter Lages – p.18 Endereços IP: sub-redes • Uso de máscaras (ex: 255.255.255.196) Copyright (c) Walter Fetter Lages – p.19 Problemas • Número de endereços de estações é muito diferente entre endereços classe C e B: • 254 estações na classe C e 65534 estações na classe C • Como fazer com redes médias ? Copyright (c) Walter Fetter Lages – p.20 Sub-Redes Copyright (c) Walter Fetter Lages – p.21 Mapeamento de Endereços • • Resolução através de vinculação dinâmica usando protocolo ARP (Address Resolution Protocol) • Permite obter o endereço de rede de outro host na mesma sub-rede • Ex: obtenção de endereço Ethernet a partir do endereço IP Protocolo RARP (Reverse Address Resolution Protocol): permite a descoberta de endereços IP Copyright (c) Walter Fetter Lages – p.22 Formato do Datagrama IP Copyright (c) Walter Fetter Lages – p.23 Formato do Datagrama IP vers: Versão do protocolo IP hlen: Tamanho do cabeçalho IP service type: Qualidade do serviço total length: Tamanho do datagrama time to live: Limita o tempo de transmissão protocol: Protocolo de transporte header checksum: CRC do cabeçalho source: IP de origem destination: IP de destino IP options: Informações de segurança, roteamento na origem, relatórios de erro, depuração, etc. Copyright (c) Walter Fetter Lages – p.24 Fragmentação e Remontagem • • Tamanho máximo permitido para pacotes pode variar de uma tecnologia de rede para outra • ex: Ethernet 1500 bytes, Arpanet ˜1000 bytes Campo flags • Bits DF (don’t fragment) e MF (more fragments) • Quando DF=1 roteadores não podem fragmentar Copyright (c) Walter Fetter Lages – p.25 Roteamento • • • • Roteamento inter-redes é a principal função do protocolo IP Roteamento é usualmente feito por gateways (roteadores) Cada computador possui tabela com entradas do tipo endereço de rede/endereço de roteador Roteador default: recebe as mensagens quando rota específica não é encontrada Copyright (c) Walter Fetter Lages – p.26 Roteamento Copyright (c) Walter Fetter Lages – p.27 User Datagram Protocol • Basicamente uma interface para o IP Source Port Destination Port Length Checksum Data Copyright (c) Walter Fetter Lages – p.28 Transmission Control Protocol • • • • Projetado para funcionar com base em um serviço de rede com conexão e com confirmação Interface de processos de aplicação com TCP: chamadas semelhantes a funções de sistemas operacionais TCP é capaz de transmitir uma cadeia de octetos nas duas direções, entre seus usuários Normalmente o TCP decide o momento de parar de agrupar os octetos e transmitir o segmento formado. Isto pode ser influenciado pelo usuário com comando ’push’ Copyright (c) Walter Fetter Lages – p.29 Transmission Control Protocol • • • Cada octeto é transmitido associado a um número de seqüência Cada octeto transmitido carrega o número de seqüência esperado no sentido inverso Segmentos transmitidos são armazenados para eventual retransmissão (caso recepção seja reconhecida, segmento é descartado) Copyright (c) Walter Fetter Lages – p.30 Transmission Control Protocol • • • Receptor pode determinar janela de transmissão (baseada na janela de recepção do receptor) TCP receptor usa numeração para ordenar os quadros recebidos TCP utiliza o conceito de porta. Processos de aplicação sendo atendidos possuem porta associadas Copyright (c) Walter Fetter Lages – p.31 Transmission Control Protocol • • • Para identificação unívoca um endereço TCP: porta + IP = socket Associação de portas a processos pode ser dinâmica, porém processos servidores que são muito usados (ftp, telnet) possuem portas fixas. Conexão é identificada pelo par de sockets de suas extremidades Copyright (c) Walter Fetter Lages – p.32 Transmission Control Protocol • • TCP assume que opera como módulo do sistema operacional e assume que interface com rede é controlada por device driver Interface oferecida baseia-se em funções (open, close, send, receive, ...) Copyright (c) Walter Fetter Lages – p.33 Socket Primitiva Significado SOCKET Cria um novo ponto final de comunicação BIND Associa um endereço local à um soquete LISTEN Anuncia a intenção de aceitar conexões; determina o tamanho da fila ACCEPT Bloqueia até que uma conexão chegue CONNECT Tenta estabelecer uma conexão SEND Envia dados RECEIVE Recebe dados CLOSE Libera a conexão Copyright (c) Walter Fetter Lages – p.34 Socket Copyright (c) Walter Fetter Lages – p.35 Quadro TCP Copyright (c) Walter Fetter Lages – p.36 Quadro TCP • • • • Número de seqüência e confirmação de ’piggyback’: numerar quadros e confirmar recebimento Tamanho do cabeçalho: indica o número de palavras de 32 bits contidas no cabeçalho URG: ponteiro urgente SYN: conexões • pedido: SYN=1 e ACK= 0 • resposta: SYN=1 e ACK=1 Copyright (c) Walter Fetter Lages – p.37 Quadro TCP • • • • • • FIN: liberação conexão RST: reiniciar conexão EOM: fim de mensagem Soma de verificação Tamanho da janela: TCP usa janela deslizante Opções: informar tamanho dos buffers Copyright (c) Walter Fetter Lages – p.38 Exemplo • • Servidor • Aguarda conexão na porta passada como argumento • Aguarda recepção • Imprime a string • Devolve a string passada como argumento • Encerra a conexão Cliente • Conecta-se ao servidor e portas passados como argumento • Envia string passada como argumento • Aguarda resposta • Imprime resposta • Encerra a conexão Copyright (c) Walter Fetter Lages – p.39 Servidor #include #include #include #include #include #include <stdio.h> <stdlib.h> <string.h> <unistd.h> <arpa/inet.h> <sys/socket.h> int main(int argc,char *argv[]) { int listenfd; struct sockaddr_in serveraddr; int connectfd; struct sockaddr_in clientaddr; int len; char buffer[128]; socklen_t clientlen; Copyright (c) Walter Fetter Lages – p.40 Servidor if(argc != 3) { printf("TCP server\n"); printf("Usage: %s tcp_port reply_message\n", argv[0]); return -1; } listenfd=socket(AF_INET,SOCK_STREAM,0); bzero(&serveraddr,sizeof(serveraddr)); serveraddr.sin_family=AF_INET; serveraddr.sin_addr.s_addr=htonl(INADDR_ANY); serveraddr.sin_port=htons(atoi(argv[1])); bind(listenfd,(struct sockaddr *)&serveraddr, Copyright (c) Walter Fetter Lages – p.41 sizeof(serveraddr)); Servidor listen(listenfd,1024); clientlen=sizeof(clientaddr); connectfd=accept(listenfd, (struct sockaddr *)&clientaddr,&clientlen); len=read(connectfd,&buffer,sizeof(buffer)); printf("%.*s\n",len,buffer); write(connectfd,argv[2],strlen(argv[2])); close(connectfd); close(listenfd); return 0; } Copyright (c) Walter Fetter Lages – p.42 Cliente #include #include #include #include #include #include #include #include <errno.h> <netdb.h> <stdio.h> <stdlib.h> <string.h> <unistd.h> <arpa/inet.h> <sys/socket.h> int main(int argc,char *argv[]) { int socketfd; struct sockaddr_in serveraddr; struct hostent *serverent; char buffer[128]; Copyright (c) Walter Fetter Lages – p.43 Cliente if(argc != 4) { printf("TCP client\n"); printf("Usage: %s servername tcpport message\n", argv[0]); return -1; } socketfd=socket(AF_INET,SOCK_STREAM,0); bzero(&serveraddr,sizeof(serveraddr)); serveraddr.sin_family=AF_INET; serverent=gethostbyname(argv[1]); inet_pton(AF_INET,serverent->h_addr, &serveraddr.sin_addr); serveraddr.sin_port=htons(atoi(argv[2])); Copyright (c) Walter Fetter Lages – p.44 Cliente if(connect(socketfd,(struct sockaddr *)&serveraddr, sizeof(serveraddr))) { perror(argv[1]); return -errno; } write(socketfd,argv[3],strlen(argv[3])); read(socketfd,buffer,sizeof(buffer)); printf("%.*s\n",(int)sizeof(buffer),buffer); close(socketfd); return 0; } Copyright (c) Walter Fetter Lages – p.45 Referências [1] W. Buchanan. Computer Busses. Arnold, London, 2000. [2] W. R. Stevens. UNIX Network Programming, volume 1. Prentice Hall PTR, Upper Saddle River, NJ, second edition, 1998. Copyright (c) Walter Fetter Lages – p.46