O número de sequência dos cabeçalhos de pacotes TCP é contornado?


16

Fiquei me perguntando, como o número de sequência em um campo de cabeçalho TCP é escolhido aleatoriamente durante o handshake e é gradualmente incrementado à medida que os pacotes são trocados, o que acontece após as transmissões 2 ^ 32 - initial_seq_no? O número da sequência é contornado e se torna 0 ou o valor inicial é reutilizado (ou uma nova conexão foi inicializada de onde o anterior parou)?

Respostas:


19

Ele varia em torno de 0. De acordo com a RFC 793 :

É essencial lembrar que o espaço real do número de sequência é finito, embora muito grande. Esse espaço varia de 0 a 2 ** 32 - 1. Como o espaço é finito, toda aritmética que lida com números de sequência deve ser realizada no módulo 2 ** 32. Essa aritmética não assinada preserva a relação dos números de sequência à medida que passam de 2 ** 32 - 1 a 0 novamente. Existem algumas sutilezas na aritmética do módulo de computador, portanto, deve-se tomar muito cuidado ao programar a comparação desses valores. O símbolo "= <" significa "menor ou igual" (módulo 2 ** 32).


3
Cada número é menor ou igual a todos os outros números, módulo 2 ** 32 ...
user253751

2
@ user20574 É por isso que o tamanho da janela TCP não pode ser maior que 1 GB, e a comparação dos números de sequência precisa ser o mais curto possível (ou seja, a diferença deve estar no intervalo -2 ^ 31 a 2 ^ 31).
kasperd

17

O número da sequência é contornado e se torna 0?

Sim. Todos os detalhes podem ser encontrados na Especificação TCP RFC 793 - Transmission Control Protocol .


Números de sequência

É essencial lembrar que o espaço real do número de sequência é finito, embora muito grande. Esse espaço varia de 0 a 2 32 - 1.

Como o espaço é finito, toda aritmética que lida com números de sequência deve ser realizada no módulo 2 32 . Essa aritmética não assinada preserva a relação dos números de sequência à medida que passam de 2 32 - 1 para 0 novamente.

Existem algumas sutilezas na aritmética do módulo de computador; portanto, deve-se tomar muito cuidado ao programar a comparação desses valores. O símbolo "= <" significa "menor ou igual" (módulo 2 32 ).

Fonte RFC 793 - Protocolo de Controle de Transmissão


11
Não pretendo atirar no mensageiro, mas "menor ou igual (módulo N)"? Claramente, o autor da RFC perdeu as "sutilezas da aritmética do módulo do computador".
Ben Voigt

Nos casos em que a janela máxima será menor que 2 ^ 31, e se xe yforem do tipo uint32_t, é prático definir x<=ycomo significando (uint32_t)(y-x) < 0x80000000.
supercat 02/09

@BenVoigt, mor provável que eles tinham como certo que mais tarde foi descrito em um RFC tools.ietf.org/html/rfc1982
Carsten S

@Carsten que é uma aritmética útil, mas não é "módulo aritmético N"
Ben Voigt

11
@BenVoigt, sim, tanto faz. Aliás, estou ciente de que os grupos Z / (n) não são ordenados, mas também sou capaz de interpretar declarações no contexto.
Carsten S

7

Sim, envolve. Você pode lê-lo na Wikipedia ou no RFC1323 , que mostra como se proteger contra os números de sequência quebrados.

Deixe-me citar:

Os carimbos de data e hora do TCP são usados ​​em um algoritmo conhecido como números de proteção contra sequência encapsulada ou PAWS (consulte a RFC 1323 para obter detalhes). O PAWS é usado quando a janela de recebimento cruza o limite do número de sequência. No caso em que um pacote foi potencialmente retransmitido, ele responde à pergunta: "Esse número de sequência está nos primeiros 4 GB ou no segundo?" E o timestamp é usado para quebrar o empate.

E:

O PAWS usa a mesma opção de registro de data e hora TCP que o mecanismo RTTM descrito anteriormente e assume que todo segmento TCP recebido (incluindo dados e segmentos ACK) contém um registro de data e hora SEG.TSval cujos valores são monótonos e não diminuem no tempo. A idéia básica é que um segmento possa ser descartado como uma duplicata antiga se for recebido com um carimbo de data / hora SEG.TSval menor que um carimbo de data / hora recebido recentemente nesta conexão.

Tanto no mecanismo PAWS quanto no RTTM, os "registros de data e hora" são números inteiros não assinados de 32 bits em um espaço modular de 32 bits. Portanto, "menor que" é definido da mesma maneira que para números de sequência TCP e as mesmas técnicas de implementação se aplicam. Se s e t são valores de carimbo de data / hora, s <t se 0 <(t - s) <2 ** 31, calculado na aritmética de 32 bits não assinada.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.