Capítulo 3: Camada de Transporte Metas do capítulo: compreender os princípios atrás dos serviços da camada de transporte: multiplexação/ demultiplexação transferência confiável de dados controle de fluxo controle de congestionamento aprender os protocolos da camada de transporte da Internet: UDP: transporte sem conexão TCP: transporte orientado a conexões Controle de congestionamento do TCP 3: Camada de Transporte 3a-1 Conteúdo do Capítulo 3 3.1 Serviços da camada de transporte 3.2 Multiplexação e demultiplexação 3.3 UDP: Transporte não orientado a conexão 3.4 Princípios da transferência confiável de dados 3.5 Transporte orientado a conexão: TCP transferência confiável controle de fluxo gerenciamento de conexões 3.6 Princípios de controle de congestionamento 3.7 Controle de congestionamento do TCP 3: Camada de Transporte 3a-2 Serviços e protocolos de transporte provê comunicação lógica entre processos de aplicação executando em hospedeiros diferentes protocolos de transporte executam em sistemas finais: lado transmissor: quebra as mensagens das aplicações em segmentos, repassa-os para a camada de rede lado receptor: remonta as mensagens a partir dos segmentos, repassa-as para a camada de aplicação existem mais de um protocolo de transporte disponível para as aplicações aplicação transporte rede enlace física rede enlace física rede enlace física rede enlace física rede enlace física rede enlace física aplicação transporte rede enlace física Internet: TCP e UDP 3: Camada de Transporte 3a-3 Camadas deTransporte x rede camada de rede: comunicação lógica entre hospedeiros camada de transporte: comunicação lógica entre processos depende de, estende serviços da camada de rede Analogia doméstica: 12 crianças enviando cartas para 12 crianças processos = crianças mensagens da apl. = cartas nos envelopes hospedeiros = casas protocolo de transporte = Ann e Bill protocolo da camada de rede = serviço postal 3: Camada de Transporte 3a-4 Protocolos da camada de transporte Internet entrega confiável, ordenada (TCP) controle de congestionamento controle de fluxo estabelecimento de conexão (“setup”) entrega não confiável, não ordenada: UDP extensão sem “frescuras” do “melhor esforço” do IP serviços não disponíveis: aplicação transporte rede enlace física rede enlace física rede enlace física rede enlace física rede enlace física rede enlace física aplicação transporte rede enlace física garantias de atraso garantias de largura de banda 3: Camada de Transporte 3a-5 Conteúdo do Capítulo 3 3.1 Serviços da camada de transporte 3.2 Multiplexação e demultiplexação 3.3 UDP: Transporte não orientado a conexão 3.4 Princípios da transferência confiável de dados 3.5 Transporte orientado a conexão: TCP transferência confiável controle de fluxo gerenciamento de conexões 3.6 Princípios de controle de congestionamento 3.7 Controle de congestionamento do TCP 3: Camada de Transporte 3a-6 Multiplexação/demultiplexação Multiplexação no transm.: reúne dados de muitos sockets, envelopa os dados com o cabeçalho (usado posteriormente para a demultiplexação) Demultiplexação no receptor: Entrega dos segmentos recebidos ao socket correto = socket aplicação transporte rede = processo P3 P1 P1 aplicação transporte P2 P4 aplicação transporte rede rede enlace enlace enlace física física física host 1 host 2 host 3 3: Camada de Transporte 3a-7 Como funciona a demultiplexação host recebe os datagramas IP cada datagrama possui os endereços IP da origem e do destino cada datagrama transporta 1 segmento da camada de transporte cada segmento possui números das portas origem e destino (lembre: números de portas bem conhecidas para aplicações específicas) host usa os endereços IP e os números das portas para direcionar o segmento ao socket apropriado 32 bits porta remetente porta receptor outros campos do cabeçalho dados da aplicação (mensagem) formato de segmento TCP/UDP 3: Camada de Transporte 3a-8 Demultiplexação sem Conexões Crie sockets com números de porta: DatagramSocket mySocket1 = new DatagramSocket(99111); DatagramSocket mySocket2 = new DatagramSocket(99222); Quando host recebe segmento UDP: verifica no. da porta de destino no segmento encaminha o segmento UDP para o socket com aquele no. de porta socket UDP identificado Datagramas IP com diferentes endereços IP pela dupla: origem e/ou números de (end IP dest, no. da porta destino) porta origem são encaminhados para o mesmo socket 3: Camada de Transporte 3a-9 Demultiplexação sem Conexões (cont) DatagramSocket serverSocket = new DatagramSocket(6428); P2 P1 P1 P3 SP: 6428 SP: 6428 DP: 9157 DP: 5775 SP: 9157 cliente IP: A DP: 6428 SP: 5775 servidor IP: C DP: 6428 Cliente IP:B SP (source port) provê “endereço de retorno” 3: Camada de Transporte 3a-10 Demultiplexação Orientada a Conexões Socket TCP identificado pela 4dupla: endereço IP origem número da porta origem endereço IP destino número da porta destino receptor usa todos os quatro valores para direcionar o segmento para o socket apropriado Servidor pode dar suporte a muitos sockets TCP simultâneos: cada socket é identificado pela sua própria 4-dupla Servidores Web têm sockets diferentes para cada conexão cliente HTTP não persistente terá sockets diferentes para cada pedido 3: Camada de Transporte 3a-11 Demultiplexação Orientada a Conexões (cont) P1 P4 P5 P2 P6 P1P3 SP: 5775 DP: 80 S-IP: B D-IP:C SP: 9157 cliente IP: A DP: 80 S-IP: A D-IP:C SP: 9157 servidor IP: C DP: 80 S-IP: B D-IP:C Cliente IP:B 3: Camada de Transporte 3a-12 Demultiplexação Orientada a Conexões: Servidor Web com Threads P1 P2 P4 P1P3 SP: 5775 DP: 80 S-IP: B D-IP:C SP: 9157 cliente IP: A DP: 80 S-IP: A D-IP:C SP: 9157 servidor IP: C DP: 80 S-IP: B D-IP:C Cliente IP:B 3: Camada de Transporte 3a-13 Conteúdo do Capítulo 3 3.1 Serviços da camada de transporte 3.2 Multiplexação e demultiplexação 3.3 UDP: Transporte não orientado a conexão 3.4 Princípios da transferência confiável de dados 3.5 Transporte orientado a conexão: TCP transferência confiável controle de fluxo gerenciamento de conexões 3.6 Princípios de controle de congestionamento 3.7 Controle de congestionamento do TCP 3: Camada de Transporte 3a-14 UDP: User Datagram Protocol [RFC 768] Protocolo de transporte da Internet mínimo, “sem frescura”, Serviço “melhor esforço”, segmentos UDP podem ser: perdidos entregues à aplicação fora de ordem do remesso sem conexão: não há “setup” UDP entre remetente, receptor tratamento independente de cada segmento UDP Por quê existe um UDP? elimina estabelecimento de conexão (o que pode causar retardo) simples: não se mantém “estado” da conexão no remetente/receptor pequeno cabeçalho de segmento sem controle de congestionamento: UDP pode transmitir o mais rápido possível 3: Camada de Transporte 3a-15 Mais sobre UDP Comprimento em bytes do segmento UDP, muito utilizado para apls. de incluindo meios contínuos (voz, vídeo) cabeçalho tolerantes de perdas sensíveis à taxa de transmissão outros usos de UDP (por 32 bits porta origem porta dest. comprimento checksum quê?): DNS (nomes) SNMP (gerenciamento) transferência confiável com UDP: incluir confiabilidade na camada de aplicação recuperação de erro específica à apl.! Dados de aplicação (mensagem) Formato do segmento UDP 3: Camada de Transporte 3a-16 Checksum UDP Meta: detectar “erro” (e.g., bits invertidos) no segmento transmitido Remetente: trata conteúdo do segmento como seqüência de inteiros de 16-bits campo checksum zerado checksum: soma (adição usando complemento de 1) do conteúdo do segmento remetente coloca complemento do valor da soma no campo checksum Receptor: calcula checksum do segmento recebido verifica se checksum computado é zero: NÃO - erro detectado SIM - nenhum erro detectado. Mas ainda pode ter erros? Veja depois …. de UDP 3: Camada de Transporte 3a-17 Exemplo do Checksum Internet Note Ao adicionar números, o transbordo do bit mais significativo deve ser adicionado o resultado Exemplo: adição de dois inteiros de 16-bits 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 transbordo 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 soma 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 0 checksum 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 3: Camada de Transporte 3a-18 Conteúdo do Capítulo 3 3.1 Serviços da camada de transporte 3.2 Multiplexação e demultiplexação 3.3 UDP: Transporte não orientado a conexão 3.4 Princípios da transferência confiável de dados 3.5 Transporte orientado a conexão: TCP transferência confiável controle de fluxo gerenciamento de conexões 3.6 Princípios de controle de congestionamento 3.7 Controle de congestionamento do TCP 3: Camada de Transporte 3a-19 Princípios de Transferência confiável de dados (rdt) importante nas camadas de transporte, enlace na lista dos 10 tópicos mais importantes em redes! características do canal não confiável determinam a complexidade de um protocolo de transferência confiável de dados (rdt) 3: Camada de Transporte 3a-20 Transferência confiável de dados (rdt): como começar rdt_send(): chamada de cima, (p.ex.,pela apl.). Dados recebidos p/ entregar à camada sup. do receptor send side udt_send(): chamada por rdt, p/ transferir pacote pelo canal ñ confiável ao receptor deliver_data(): chamada por rdt p/ entregar dados p/ camada superior receive side rdt_rcv(): chamada quando pacote chega no lado receptor do canal 3: Camada de Transporte 3a-21 Transferência confiável de dados (rdt): como começar Iremos: desenvolver incrementalmente os lados remetente, receptor do protocolo RDT considerar apenas fluxo unidirecional de dados mas info de controle flui em ambos os sentidos! Usar máquinas de estados finitos (FSM) p/ especificar remetente, receptor evento causador da transição de estado ações executadas ao mudar de estado estado: neste “estado” o próximo estado é determinado unicamente pelo próximo evento estado 1 evento ações estado 2 3: Camada de Transporte 3a-22 Rdt1.0: transferência confiável usando um canal confiável canal subjacente perfeitamente confiável não tem erros de bits não tem perda de pacotes FSMs separadas para remetente e receptor: remetente envia dados pelo canal subjacente receptor recebe dados do canal subjacente Wait for call from above rdt_send(data) packet = make_pkt(data) udt_send(packet) transmissor Wait for call from below rdt_rcv(packet) receptor 3: Camada de Transporte 3a-23 Rdt2.0: canal com erros de bits canal subjacente pode inverter bits no pacote lembre-se: checksum UDP pode detectar erros de bits a questão: como recuperar dos erros? reconhecimentos (ACKs): receptor avisa explicitamente ao reconhecimentos negativos (NAKs): receptor avisa remetente que pacote chegou bem explicitamente ao remetente que pacote tinha erros remetente retransmite pacote ao receber um NAK cenários humanos usando ACKs, NAKs? novos mecanismos em rdt2.0 (em relação ao rdt1.0): detecção de erros realimentação pelo receptor: msgs de controle (ACK,NAK) receptor->remetente 3: Camada de Transporte 3a-24 rdt2.0: especificação da FSM rdt_send(data) snkpkt = make_pkt(data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && isNAK(rcvpkt) Wait for Wait for call from ACK or udt_send(sndpkt) above NAK rdt_rcv(rcvpkt) && isACK(rcvpkt) L transmissor receptor rdt_rcv(rcvpkt) && corrupt(rcvpkt) udt_send(NAK) Wait for call from below rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) extract(rcvpkt,data) deliver_data(data) udt_send(ACK) 3: Camada de Transporte 3a-25 rdt2.0: operação sem erros rdt_send(data) snkpkt = make_pkt(data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && isNAK(rcvpkt) Wait for Wait for call from ACK or udt_send(sndpkt) above NAK rdt_rcv(rcvpkt) && isACK(rcvpkt) L rdt_rcv(rcvpkt) && corrupt(rcvpkt) udt_send(NAK) Wait for call from below rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) extract(rcvpkt,data) deliver_data(data) udt_send(ACK) 3: Camada de Transporte 3a-26 rdt2.0: cenário com erros rdt_send(data) snkpkt = make_pkt(data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && isNAK(rcvpkt) Wait for Wait for call from ACK or udt_send(sndpkt) above NAK rdt_rcv(rcvpkt) && isACK(rcvpkt) L rdt_rcv(rcvpkt) && corrupt(rcvpkt) udt_send(NAK) Wait for call from below rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) extract(rcvpkt,data) deliver_data(data) udt_send(ACK) 3: Camada de Transporte 3a-27 rdt2.0 tem uma falha fatal! O que acontece se ACK/NAK com erro? Remetente não sabe o que se passou no receptor! não se pode apenas retransmitir: possibilidade de pacotes duplicados O que fazer? Lidando c/ duplicação: remetente inclui número de seqüência p/ cada pacote remetente retransmite pacote atual se ACK/NAK recebido com erro receptor descarta (não entrega) pacote duplicado remetente usa ACKs/NAKs p/ ACK/NAK do receptor? E se perder ACK/NAK do remetente? retransmitir, mas pode causar retransmissão de pacote recebido certo! pára e espera Remetente envia um pacote, e então aguarda resposta do receptor 3: Camada de Transporte 3a-28 rdt2.1: remetente, trata ACK/NAKs c/ erro rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || Wait for Wait for isNAK(rcvpkt) ) ACK or call 0 from udt_send(sndpkt) NAK 0 above rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt) rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt) L rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || isNAK(rcvpkt) ) udt_send(sndpkt) L Wait for ACK or NAK 1 Wait for call 1 from above rdt_send(data) sndpkt = make_pkt(1, data, checksum) udt_send(sndpkt) 3: Camada de Transporte 3a-29 rdt2.1: receptor, trata ACK/NAKs com erro rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq0(rcvpkt) rdt_rcv(rcvpkt) && (corrupt(rcvpkt) extract(rcvpkt,data) deliver_data(data) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && (corrupt(rcvpkt) sndpkt = make_pkt(NAK, chksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && not corrupt(rcvpkt) && has_seq1(rcvpkt) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) sndpkt = make_pkt(NAK, chksum) udt_send(sndpkt) Wait for 0 from below Wait for 1 from below rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq1(rcvpkt) extract(rcvpkt,data) deliver_data(data) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && not corrupt(rcvpkt) && has_seq0(rcvpkt) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) 3: Camada de Transporte 3a-30 rdt2.1: discussão Remetente: no. de seq no pacote bastam dois nos. de seq. (0,1). Por quê? deve checar se ACK/NAK recebido tinha erro duplicou o no. de estados Receptor: deve checar se pacote recebido é duplicado estado indica se no. de seq. esperado é 0 ou 1 note: receptor não tem como saber se último ACK/NAK foi recebido bem pelo remetente estado deve “lembrar” se pacote “corrente” tem no. de seq. 0 ou 1 3: Camada de Transporte 3a-31 rdt2.2: um protocolo sem NAKs mesma funcionalidade que rdt2.1, só com ACKs ao invés de NAK, receptor envia ACK p/ último pacote recebido bem receptor deve incluir explicitamente no. de seq do pacote reconhecido ACK duplicado no remetente resulta na mesma ação que o NAK: retransmite pacote atual 3: Camada de Transporte 3a-32 rdt2.2: fragmentos do transmissor e receptor rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || Wait for Wait for isACK(rcvpkt,1) ) ACK call 0 from 0 udt_send(sndpkt) above Fragmento da FSM do transmissor rdt_rcv(rcvpkt) && (corrupt(rcvpkt) || has_seq1(rcvpkt)) udt_send(sndpkt) Wait for 0 from below rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt,0) Fragmento da FSM do receptor L rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq1(rcvpkt) extract(rcvpkt,data) deliver_data(data) sndpkt = make_pkt(ACK1, chksum) 3: Camada de Transporte 3a-33 udt_send(sndpkt) rdt3.0: canais com erros e perdas Nova suposição: canal subjacente também pode perder pacotes (dados ou ACKs) Abordagem: remetente aguarda um tempo “razoável” pelo ACK retransmite se nenhum ACK for recebido neste intervalo se pacote (ou ACK) apenas atrasado (e não perdido): retransmissão será duplicada, mas uso de no. P: como lidar com perdas? de seq. já cuida disto remetente espera até ter receptor deve especificar certeza que se perdeu no. de seq do pacote sendo pacote ou ACK, e então reconhecido retransmite requer temporizador eca!: desvantagens? checksum, no. de seq., ACKs, retransmissões podem ajudar, mas não serão suficientes 3: Camada de Transporte 3a-34 rdt3.0: remetente rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) L rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt,1) rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || isACK(rcvpkt,0) ) timeout udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt,0) stop_timer stop_timer timeout udt_send(sndpkt) start_timer L Wait for ACK0 Wait for call 0from above L rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || isACK(rcvpkt,1) ) Wait for ACK1 Wait for call 1 from above rdt_rcv(rcvpkt) L rdt_send(data) sndpkt = make_pkt(1, data, checksum) udt_send(sndpkt) start_timer 3: Camada de Transporte 3a-35 rdt3.0 em ação 3: Camada de Transporte 3a-36 rdt3.0 em ação 3: Camada de Transporte 3a-37 Desempenho de rdt3.0 rdt3.0 funciona, porém seu desempenho é muito ruim exemplo: enlace de 1 Gbps, retardo fim a fim de 15 ms, pacote de 1KB: Ttransmitir= U sender = 8kb/pacote = 8 microseg 10**9 b/seg L/R RTT + L / R = .008 30.008 = 0.00027 microsec onds pac. de 1KB a cada 30 mseg -> vazão de 33kB/seg num enlace de 1 Gbps protocolo limita uso dos recursos físicos! 3: Camada de Transporte 3a-38 rdt3.0: stop-and-wait operation transmissor receptor transm. do 1º bit do pacote, t = 0 tx último bit do pacote, t = L / R RTT chegada do 1º bit do pacote chegada do último bit, envia ACK chegada do ACK, envia próximo pacote, t = RTT + L / R L/ R 0,008 U tx 0,00027 RT T L / R 30,008 3: Camada de Transporte 3a-39 Protocolos “com paralelismo” (pipelined) Paralelismo (pipelining): remetente admite múltiplos pacotes “em trânsito”, ainda não reconhecidos faixa de números de seqüência deve ser aumentada buffers no remetente e/ou no receptor Duas formas genéricas de protocolos com paralelismo: Go-back-N, retransmissão seletiva 3: Camada de Transporte 3a-40 Paralelismo: maior utilização transmissor receptor transm. do 1º bit do pacote, t = 0 tx do último bit, t = L / R RTT chegada do primeiro bit chegada do último bit, envia ACK cheg. do último bit do 2o pct., envia ACK cheg. do último bit do 3o pct., envia ACK chegada do ACK, envia próximo pacote, t = RTT + L / R Aumenta a utilização por um fator de 3! 3 L / R 0,024 U tx 0,0008 RT T L / R 30,008 3: Camada de Transporte 3a-41 Go-back-N (GBN) Remetente: no. de seq. de k-bits no cabeçalho do pacote admite “janela” de até N pacotes consecutivos não reconhecidos ACK(n): reconhece todos pacotes, até e inclusive no. de seq n - “ACK cumulativo” pode receber ACKs duplicados (veja receptor) temporizador para cada pacote em trânsito timeout(n): retransmite pacote n e todos os pacotes com no. de seq maiores na janela 3: Camada de Transporte 3a-42 GBN: FSM estendida do remetente 3: Camada de Transporte 3a-43 GBN: FSM estendida do receptor expectedseqnum=expectedseqnum+1 receptor simples: usa apenas ACK: sempre envia ACK para pacote recebido bem com o maior no. de seq. em-ordem pode gerar ACKs duplicados só precisa se lembrar do expectedseqnum pacote fora de ordem: descarta (não armazena) -> receptor não usa buffers! manda ACK de pacote com maior no. de seq em-ordem 3: Camada de Transporte 3a-44 GBN em ação 3: Camada de Transporte 3a-45 Retransmissão seletiva receptor reconhece individualmente todos os pacotes recebidos corretamente armazena pacotes no buffer, conforme necessário, para posterior entrega em-ordem à camada superior remetente apenas re-envia pacotes para os quais ACK não recebido temporizador de remetente para cada pacote sem ACK janela do remetente N nos. de seq consecutivos outra vez limita nos. de seq de pacotes enviados, mas ainda não reconhecidos 3: Camada de Transporte 3a-46 Retransmissão seletiva: janelas de remetente, receptor 3: Camada de Transporte 3a-47 Retransmissão seletiva remetente dados de cima: se próx. no. de seq na janela, envia pacote timeout(n): reenvia pacote n, reiniciar temporizador ACK(n) em [sendbase,sendbase+N]: marca pacote n “recebido” se n for menor pacote não reconhecido, avança base da janela ao próx. no. de seq não reconhecido receptor pacote n em [rcvbase, rcvbase+N-1] envia ACK(n) fora de ordem: buffer em ordem: entrega (tb. entrega pacotes em ordem no buffer), avança janela p/ próxima pacote ainda não recebido pacote n em [rcvbase-N,rcvbase-1] ACK(n) senão: ignora 3: Camada de Transporte 3a-48 Retransmissão seletiva em ação 3: Camada de Transporte 3a-49 Retransmissão seletiva: dilema Exemplo: nos. de seq : 0, 1, 2, 3 tam. de janela =3 receptor não vê diferença entre os dois cenários! incorretamente passa dados duplicados como novos em (a) Q: qual a relação entre tamanho de no. de seq e tamanho de janela? 3: Camada de Transporte 3a-50