Por que um soquete TCP é identificado por uma tupla de 4?

8

Novato em redes aqui. Estou lendo o livro Redes de Computadores (3ª edição) e, na seção 3.2, eles discutem a multiplexação / desmultiplexação para UDP e TCP.

No protocolo UDP, um soquete é identificado exclusivamente pelo IP de origem e pela porta de origem.

No protocolo TCP, o soquete é identificado exclusivamente pelo IP de origem, porta de origem, IP de destino e porta de destino. Por que o protocolo TCP requer duas informações extras para o host de recebimento desmultiplexar corretamente o segmento e enviá-lo ao processo correto?

A única razão pela qual consigo pensar por que isso é necessário é se os clientes sempre enviam o segmento TCP para a mesma porta que o segmento de solicitação de conexão. Por exemplo, meu navegador sempre envia dados para a porta 80 do servidor, mesmo que o servidor tenha estabelecido um soquete TCP especificamente para essa sessão em uma porta diferente. Nesse caso, o TCP precisa usar o IP de origem e as informações da porta de origem para desmultiplexar no soquete correto. Ele não pode confiar apenas nas informações de IP de origem, porque um único host pode estabelecer várias sessões, mas cada sessão deve estar em uma porta diferente.

A razão pela qual o UDP não apresenta esse problema é porque o conjunto de IP / porta de destino identifica o soquete ao qual o processo que manipulará a solicitação está anexado, pois no UDP não há "desova" de vários novos soquetes para solicitações.

Isso está correto ou cheguei à conclusão errada?

Steven L.
fonte
Olá Steven e bem-vindo. Há uma série de livros diferentes chamados "Redes de computadores" em sua terceira edição. Qual deles você está lendo?
jonathanjo
Veja esta resposta para saber o que o RFC para TCP explica sobre soquetes e conexões.
Ron Maupin
Esta resposta no Stack Overflow é a resposta de programação para a pergunta. A resposta correta para este site é encontrada na RFC 793, que é a definição de TCP. De qualquer forma, a resposta da Engenharia de rede é que os soquetes TCP não identificam um soquete TCP por uma " 4 tupla ", apenas por uma combinação de endereço IP e TCP. Acho que você aceitou a resposta errada de Engenharia de rede.
Ron Maupin

Respostas:

3

Infelizmente, as coisas ficam confusas porque existem duas definições diferentes de soquete por aí. O TCP rfc usa o termo soquete para se referir a uma combinação de endereço e porta, mas soquetes berkerly e seus derivados (a API usada por praticamente todas as implementações práticas de IP em uso atualmente) usam o termo soquete para se referir a um tipo de operação objeto de comunicação do sistema.

Por que o protocolo TCP requer duas informações extras para o host de recebimento desmultiplexar corretamente o segmento e enviá-lo ao processo correto?

Não se trata apenas do processo correto, mas do objeto de comunicação correto.

A única razão pela qual consigo pensar por que isso é necessário é se os clientes sempre enviam o segmento TCP para a mesma porta que o segmento de solicitação de conexão. Por exemplo, meu navegador sempre envia dados para a porta 80

Eles fazem.

mesmo que o servidor tenha estabelecido um soquete TCP especificamente para essa sessão em uma porta diferente.

Este parece ser um equívoco comum, provavelmente causado pelas diferentes definições de socket. A aceitação de uma conexão cria um novo objeto de comunicação (soquete no sentido dos soquetes Berkerly do termo), mas não aloca uma nova combinação de ip / porta (soquete no sentido do termo RFC TCP) no servidor.

A razão pela qual o UDP não apresenta esse problema é porque o conjunto de IP / porta de destino identifica o soquete ao qual o processo que manipulará a solicitação está anexado, pois no UDP não há "desova" de vários novos soquetes para solicitações.

Correto (supondo que seu parágrafo esteja usando "socket" no sentido de sockets berkerly).

Peter Green
fonte
7

No protocolo UDP, um soquete é identificado exclusivamente pelo IP de origem e pela porta de origem.

No protocolo TCP, o soquete é identificado exclusivamente pelo IP de origem, porta de origem, IP de destino e porta de destino. Por que o protocolo TCP requer duas informações extras

Nota: para a terminologia TCP, o soquete é o par endereço-porta; um par de soquetes define a conexão . (Por RFC 793 p5)

Receio que você esteja enganado sobre o UDP, que, embora ele realmente não tenha "soquetes" - mesmo que a biblioteca Berkeley Sockets os chame assim, e é razoável chamar um par de endereço-porta - multiplexes em essencialmente da mesma maneira que o TCP.

Uma situação típica em que você pode ver isso é o caso de várias resoluções DNS simultâneas de um host para o mesmo servidor DNS, onde claramente apenas o número da porta de origem é necessariamente diferente. Você pode ver que essa é exatamente a mesma situação que várias conexões TCP simultâneas de um cliente para um único servidor da web.

O UDP possui datagramas sem conexão. O host A envia o datagrama a partir de um par de endereço-porta, direcionado a um par de endereço-porta em B, que normalmente, mas nem sempre, responde da maneira espelhada. Falando mais livremente da "comunicação", ele opera exatamente nas mesmas quatro tuplas que uma conexão TCP.

Às vezes, você verá referência a uma tupla de 5 (procotol, endereço de origem, porta de origem, endereço de destino, porta de destino), onde o protocolo seria 17 para UDP, 6 para TCP etc. É para isso que a maioria dos firewalls, roteadores etc. usa para NAT e operações similares para identificar esse par de comunicação.

mesmo que o servidor tenha estabelecido um soquete TCP especificamente para essa sessão em uma porta diferente

Receio que você também esteja enganado sobre o TCP, possivelmente por causa do conflito de terminologia entre a definição do protocolo TCP (RFC 793) e sua implementação prática mais comum, a Berkeley Sockets Library, usada no Unix, e tudo o que descende. isto.

Se você se concentrar no protocolo, é muito mais claro: não há "porta diferente". O servidor da Web está escutando apenas , por exemplo, 1.1.1.1, porta 80. O cliente envia apenas a partir da ilustração 2.2.2.2, porta 56789. Cada pacote único será 1.1.1.1:80 a 2.2.2.2:56789 ou vice-versa ; facilmente verificada olhando pacotes com tcpdump / wireshark / etc.

(Para resumir brevemente a implementação de Berkeley, uma conexão TCP é representada por um número inteiro chamado tipicamente, mas de maneira confusa sockfd; um soquete TCP é representado por a struct sockaddr. A accept()chamada de sistema fala de maneira muito confusa de fazer um "novo soquete conectado", pelo que significa nova conexãoestrutura no estado conectado. A tupla dessa coisa resultante estaria em nosso exemplo (1.1.1.1, 80, 2.2.2.2, 56789). Com relação ao UDP, a biblioteca permite que você considere o UDP conectado, o que é uma maneira conveniente, embora completamente errada, de descrever a troca de datagramas UDP entre dois processos, e apenas significa que a estrutura lembra o par de endereço-porta remota, o que, em termos de programação, torna o UDP "conexão" se parece com uma TCP. Lembre-se de que a biblioteca de Berkeley não é apenas para IP e tem generalizações de vários sistemas de rede subjacentes diferentes. Se você quiser acompanhar esses termos de programação de rede, sugiro Stack Overflow, que possui muitos programadores de rede muito competentes.)

jonathanjo
fonte
1

No protocolo UDP, um soquete é identificado exclusivamente pelo IP de origem e pela porta de origem.

Por favor, não misture programação de rede (soquetes) com protocolos de rede.

No entanto, no caso do UDP, você também tem essa 4-tupla!

A diferença entre TCP e UDP é que o UDP não usa conexões fixas, portanto, um soquete pode ser usado para enviar dados para computadores diferentes e / ou portas de destino diferentes.

Por esse motivo, o sistema operacional salva apenas 2 elementos da 4-tupla (endereço IP e número da porta da porta local), enquanto os outros 2 elementos (endereço IP e número da porta do outro computador) devem ser fornecidos pelo aplicativo (em a sendto()função).

Por outro lado, o TCP é orientado à conexão e um soquete descreve uma conexão entre dois computadores. Portanto, um soquete pode ser usado apenas para enviar dados para uma determinada porta TCP de um determinado computador (usando a send()função).

Isso significa que todos os 4 elementos (e não apenas 2 deles) da 4-tupla são fixos para o soquete, para que o sistema operacional possa armazenar todos os 4 elementos e o aplicativo não precise fornecer 2 dos 4 elementos.

Martin Rosenau
fonte
0

Se o livro que você está lendo é "Rede de computadores - uma abordagem de cima para baixo", de Jim Kurose, você e eu estamos lendo o mesmo livro. :-) FYI, o livro realmente indica que as duas tuplas que identificam um soquete UDP são baseadas no IP e na porta de destino (não na origem). Pelo menos, é o que afirma a 7ª edição.

Para responder à sua pergunta, o TCP é orientado à conexão, enquanto o UDP é sem conexão. Portanto, quando uma solicitação TCP é estabelecida entre um host e um servidor, cada lado dessa conexão deseja ter certeza de que as solicitações subsequentes usarão a mesma conexão (caso contrário, qual é o sentido de usar um protocolo orientado a conexão como o TCP?). E uma vez que dois segmentos de dados com o mesmo destino IP e porta, mas diferentes IPs de origem e portos vai usar duas separadas tomadas no lado do servidor, a única maneira de garantir que os pedidos subsequentes usar o mesmo soquete como o pedido original é usar tanto a fonte e IP / porta de destino ao combinar segmentos de dados com seus soquetes corretos.

Por outro lado, você pode pensar no UDP como configurando uma nova conexão (e, portanto, um novo soquete) com cada solicitação separada. Como você não precisa se preocupar em usar o mesmo soquete das solicitações anteriores, não há necessidade de incluir o IP / porta de origem ao identificar para qual soquete UDP para o qual rotear o segmento. Portanto, uma dupla-tupla é suficiente.

Richie Thomas
fonte