Baixe o app para aproveitar ainda mais
Prévia do material em texto
Aulas do livro disponíveis em: http://www-net.cs.umass.edu/kurose-ross-ppt-7e/ Camada de transporte TCP Transmission Control Protocol TCP: Visão Geral RFCs: 793,1122,1323, 2018, 2581 § Dados full duplex: • Fluxo de dados bidirecional na mesma conexão • MSS: maximum segment size § Orientado a conexão: • Handshaking (troca de msgs do controle) em seu remetente, estado do receptor antes da troca de dados • Fluxo controlado: • O remetente não irá sobrecarregar o receptor § Ponto a ponto: • Um transmissor, um receptor § Fluxo de bytes confiável e em ordem: • Sem "limites de mensagem” • Limitação: • Congestionamento TCP e controle de fluxo definem tamanho da janela Estrutura do segmento TCP source port # dest port # 32 bits application data (variable length) sequence number acknowledgement number receive window Urg data pointerchecksum FSRPAUhead len not used options (variable length) URG: urgent data (generally not used) ACK: ACK # valid PSH: push data now (generally not used) RST, SYN, FIN: connection estab (setup, teardown commands) # bytes rcvr willing to accept counting by bytes of data (not segments!) Internet checksum (as in UDP) Numero de sequência - ACKs Numeros de sequencia • "número" de primeiro byte nos dados do segmento acknowledgements: • seq # do próximo byte esperado de outro lado • ACK acumulativo Q: Como o receptor lida com segmentos fora de ordem? R: Não especificado em RFC, depende do implementador source port # dest port # sequence number acknowledgement number checksum rwnd urg pointer incoming segment to sender A sent ACKed sent, not- yet ACKed (“in- flight”) usable but not yet sent not usable window size N sender sequence number space source port # dest port # sequence number acknowledgement number checksum rwnd urg pointer outgoing segment from sender Numero de sequência, ACKs User types ‘C’ host ACKs receipt of echoed ‘C’ host ACKs receipt of ‘C’, echoes back ‘C’ Cenário simples de telnet Host BHost A Seq=42, ACK=79, data = ‘C’ Seq=79, ACK=43, data = ‘C’ Seq=43, ACK=80 TCP round trip time, timeout Q: como definir o valor do timeout no TCP? § Maior que RTT • mas RTT varia § Muito curto: tempo de espera prematuro, retransmissões desnecessárias § Muito longo: reação lenta à perda de segmento Q: Como estimar o RTT? § SampleRTT: tempo medido desde a transmissão do segmento até o recebimento ACK (RTT instantâneo) § Ignora retransmissões § SampleRTT : deve variar, usar RTT estimado ”mudança mais suave” • Média de várias medições recentes, e não somente SampleRTT RTT: gaia.cs.umass.edu to fantasia.eurecom.fr 100 150 200 250 300 350 1 8 15 22 29 36 43 50 57 64 71 78 85 92 99 106 time (seconnds) RT T (m illi se co nd s) SampleRTT Estimated RTT EstimatedRTT = (1- a)*EstimatedRTT + a*SampleRTT § Média móvel ponderada exponencial § Influência da amostra do passado diminui exponencialmente rápido § valor típico: a = 0.125 TCP round trip time, timeout RT T (m illi se co nd s) RTT: gaia.cs.umass.edu to fantasia.eurecom.fr sampleRTT EstimatedRTT time (seconds) § Intervalo timeout: EstimatedRTT maior “margem de segurança” • Grande variação em EstimatedRTT -> maior margem de segurança • Estimar o desvio padrão de SampleRTT e EstimatedRTT: DevRTT = (1-b)*DevRTT + b*|SampleRTT-EstimatedRTT| TCP round trip time, timeout (typically, b = 0.25) TimeoutInterval = EstimatedRTT + 4*DevRTT RTT estimado “margem de segurança” * Check out the online interactive exercises for more examples: http://gaia.cs.umass.edu/kurose_ross/interactive/ Transferência de dados confiável (rdt) no TCP § TCP cria serviço rdt em cima do serviço não confiável do IP § Segmentos em paralelo • Acks acumulativos • Temporizador de retransmissão § Retransmissões desencadeadas por: § Eventos de timeout • Acks duplicados Vamos considerar inicialmente remente TCP simplificado : • Ignora acks duplicados • Ignora controle de fluxo e controle de congestionamento rdt: reliable data transfer Eventos remetente TCP Dados recebidos da aplicação: § Cria segmento com numero de sequencia (seq #) § seq # é o fluxo de bytes, numero do primeiro byte no segmento § Iniciar o temporizador se ainda não estiver em execução § Pense no temporizador como no segmento mais antigo § Intervalo de expiração: TimeOutInterval timeout: § Retransmitir segmento que causou timeout § Reiniciar temporizador ack recebido: § Se ack reconhecer segmentos anteriormente não reconhecidos § Atualizar o que é conhecido por ser ACKed § Iniciar o temporizador se ainda houver segmentos não reconhecidos Remente TCP(simplificado) wait for event NextSeqNum = InitialSeqNum SendBase = InitialSeqNum L create segment, seq. #: NextSeqNum pass segment to IP (i.e., “send”) NextSeqNum = NextSeqNum + length(data) if (timer currently not running) start timer data received from application above retransmit not-yet-acked segment with smallest seq. # start timer timeout if (y > SendBase) { SendBase = y /* SendBase–1: last cumulatively ACKed byte */ if (there are currently not-yet-acked segments) start timer else stop timer } ACK received, with ACK field value y TCP: cenários de retransmissões lost ACK scenario Host BHost A Seq=92, 8 bytes of data ACK=100 Seq=92, 8 bytes of data Xtim eo ut ACK=100 premature timeout Host BHost A Seq=92, 8 bytes of data ACK=100 Seq=92, 8 bytes of data tim eo ut ACK=120 Seq=100, 20 bytes of data ACK=120 SendBase=100 SendBase=120 SendBase=120 SendBase=92 TCP: cenários de retransmissões X cumulative ACK Host BHost A Seq=92, 8 bytes of data ACK=100 Seq=120, 15 bytes of data tim eo ut Seq=100, 20 bytes of data ACK=120 TCP geração ACKs [RFC 1122, RFC 2581] Evento no receptor arrival of in-order segment with expected seq #. All data up to expected seq # already ACKed arrival of in-order segment with expected seq #. One other segment has ACK pending arrival of out-of-order segment higher-than-expect seq. # . Gap detected arrival of segment that partially or completely fills gap Ação do receptor TCP delayed ACK. Wait up to 500ms for next segment. If no next segment, send ACK immediately send single cumulative ACK, ACKing both in-order segments immediately send duplicate ACK, indicating seq. # of next expected byte immediate send ACK, provided that segment starts at lower end of gap TCP retransmissão rápida • Período de timeout frequentemente relativamente longo: § Atraso longo antes de reenviar pacotes perdidos § Detectar segmentos perdidos via ACKs duplicados. • O remetente frequentemente envia muitos segmentos • Se o segmento for perdido, provavelmente haverá muitos ACKs duplicados. Se o remetente receber 3 ACKs para os mesmos dados (“triple duplicate ACKs”), Reenvie o segmento não confirmado com o menor # seq •Provável que o segmento não confirmado esteja perdido, por isso não espera por timeout TCP retransmissão rápida X Retransmissão rápida após o remetente receber triplo ACK duplicado Host BHost A Seq=92, 8 bytes of data ACK=100 tim eo ut ACK=100 ACK=100 ACK=100 TCP retransmissão rápida Seq=100, 20 bytes of data Seq=100, 20 bytes of data Controle de Fluxo do TCP application process TCP socket receiver buffers TCP code IP code application OS Pilha de protocolo do receptor Aplicação pode remover dados de buffers de sockets TCP … … mais lento do que o TCP receptor está entregando (o emissor está enviando) from sender receptor controla o remetente, de modo que o remetente não transbordará o buffer do receptor, transmitindo muito rápido Controle de fluxo Controle de Fluxo do TCP buffered data free buffer spacerwnd RcvBuffer TCP segment payloads to application process § Receptor "anuncia" espaço de buffer livre, incluindo o valor rwnd no cabeçalho TCP de segmentos de receptor para remetente § O tamanho do RcvBuffer é definidoatravés de opções de soquete (o padrão padrão é 4096 bytes) § Muitos sistemas operacionais auto ajustam o RcvBuffer § O remetente limita a quantidade de dados não recebidos (”no ar") para o valor de rwnd do receptor § Garante que o buffer do receptor não transbordará receiver-side buffering Gerência de Conexão Antes de trocar dados, "handshake" do emissor / receptor: • Concordam em estabelecer conexão (cada um conhecendo o outro disposto a estabelecer conexão) • Acordo sobre parâmetros de conexão connection state: ESTAB connection variables: seq # client-to-server server-to-client rcvBuffer size at server,client application network connection state: ESTAB connection Variables: seq # client-to-server server-to-client rcvBuffer size at server,client application network Socket clientSocket = newSocket("hostname","port number"); Socket connectionSocket = welcomeSocket.accept(); Q: O handshake em 2 vias sempre irá funcionar em uma rede? § Atrasos variáveis § Mensagens retransmitidas (e.g. req_conn(x)) devido a perda de mensagem § Reordenação de mensagens § Não pode “ver” outro lado Handshake 2 vias : Let’s talk OK ESTAB ESTAB choose x req_conn(x) ESTAB ESTAB acc_conn(x) Concordando em estabelecer uma conexão Concordando em estabelecer uma conexão Cenários de falhas de handshake de 2 vias: retransmit req_conn(x) ESTAB req_conn(x) half open connection! (no client!) client terminates server forgets x connection x completes retransmit req_conn(x) ESTAB req_conn(x) data(x+1) retransmit data(x+1) accept data(x+1) choose x req_conn(x) ESTAB ESTAB acc_conn(x) client terminates ESTAB choose x req_conn(x) ESTAB acc_conn(x) data(x+1) accept data(x+1) connection x completes server forgets x TCP 3-way handshake (troca em 3 vias) SYNbit=1, Seq=x choose init seq num, x send TCP SYN msg ESTAB SYNbit=1, Seq=y ACKbit=1; ACKnum=x+1 choose init seq num, y send TCP SYNACK msg, acking SYN ACKbit=1, ACKnum=y+1 received SYNACK(x) indicates server is live; send ACK for SYNACK; this segment may contain client-to-server data received ACK(y) indicates client is live SYNSENT ESTAB SYN RCVD client state LISTEN server state LISTEN TCP 3-way handshake: FSM closed L listen SYN rcvd SYN sent ESTAB Socket clientSocket = newSocket("hostname","port number"); SYN(seq=x) Socket connectionSocket = welcomeSocket.accept(); SYN(x) SYNACK(seq=y,ACKnum=x+1) create new socket for communication back to client SYNACK(seq=y,ACKnum=x+1) ACK(ACKnum=y+1)ACK(ACKnum=y+1) L TCP: fechando uma conexão § Cliente, servidor cada fechar seu lado de conexão § Enviar segmento TCP com bit FIN = 1 § Responder ao FIN recebido com ACK • Ao receber FIN, o ACK pode ser combinado com o próprio FIN • Trocas simultâneas FIN podem ser manipuladas FIN_WAIT_2 CLOSE_WAIT FINbit=1, seq=y ACKbit=1; ACKnum=y+1 ACKbit=1; ACKnum=x+1 wait for server close can still send data can no longer send data LAST_ACK CLOSED TIMED_WAIT timed wait for 2*max segment lifetime CLOSED TCP: fechando uma conexão FIN_WAIT_1 FINbit=1, seq=xcan no longer send but can receive data clientSocket.close() client state server state ESTABESTAB
Compartilhar