Esses 2 pacotes pertencem ao mesmo soquete tcp?

Dec 15 2020

Digamos que temos dois pacotes Ae B.

A: Possui IP de origem, IP de S1destino D1, porta de origem, porta de SP1destinoDP1

B: Possui IP de origem, IP de S2destino D1, porta de origem, porta de SP2destinoDP1

Ambos são TCP. Ambos os pacotes terão o mesmo soquete agora?


Sobre o UDP, li que seu soquete consiste no IP de destino e no número da porta de destino. Portanto, se isso fosse feito com UDP, os dois pacotes seriam recebidos pelo mesmo soquete.

Mas este exemplo é para TCP e aqui não tenho certeza se ele também passaria pelo mesmo soquete para TCP?

Respostas

12 SteffenUllrich Dec 15 2020 at 00:01

Primeiro, o TCP não se preocupa com pacotes únicos. Se forem apenas pacotes de dados sem nenhum estabelecimento de conexão anterior, eles serão simplesmente descartados, sem soquetes envolvidos. Portanto, estou assumindo que se trata de conexões estabelecidas, ou pacotes iniciais para estabelecer uma conexão. Uma conexão TCP é definida pelo menos pela 4 tupla de (src-ip, src-port, dst-ip, dst-port). Como essas 4 tuplas são obviamente diferentes em ambos os casos, serão necessários soquetes diferentes.

Sobre o UDP, li que seu soquete consiste no IP de destino e no número da porta de destino.

Isso só é verdadeiro para soquetes UDP não conectados . Com os soquetes UDP conectados novamente, a 4-tupla é relevante.

2 MartinRosenau Dec 15 2020 at 15:28

Sobre UDP eu li isso ...

A principal diferença entre TCP e UDP é que o TCP é orientado à conexão, enquanto o UDP é usado para transmitir pacotes únicos.

Um soquete UDP está lidando com todos os pacotes UDP que chegam em uma determinada porta (destino) no computador.

Um soquete TCP está lidando com todos os pacotes pertencentes a uma determinada conexão TCP.

Ambos os pacotes terão o mesmo soquete agora?

É mais complicado do que você pensa:

A situação que você descreve normalmente acontece no "lado do servidor" (no computador que usa a accept()API para lidar com conexões de entrada - como um servidor da web).

Digamos que dois computadores (executando navegadores da web) desejam se conectar ao mesmo servidor da web. Ambos os computadores escolheram a mesma "porta TCP de origem". Neste caso, os pacotes enviados pelos dois computadores ao servidor web satisfazem sua condição: Somente o endereço IP de origem difere nos pacotes enviados pelos dois computadores, enquanto o endereço IP de destino, a porta de destino e a porta de origem são iguais.

No entanto, no "lado do servidor", dois soquetes estão envolvidos no tratamento de uma única conexão TCP :

  1. Um soquete que usa listen()e accept()para aguardar conexões TCP de entrada.
  2. Para cada conexão TCP de entrada, um soquete é retornado por accept().

Quando um pacote TCP é o primeiro pacote de uma conexão TCP, o pacote é "tratado" pelo soquete TCP que está executando um listen()na porta de destino.

Este soquete não se preocupa com o endereço IP de origem nem com a porta TCP de origem - assim como os soquetes UDP. O soquete está lidando com todos os primeiros pacotes de conexões TCP com um determinado endereço IP de destino e uma determinada porta de destino.

Quando o primeiro pacote é recebido, o segundo soquete (manipulando a conexão TCP) é criado e retornado pela access()API.

Este socket lida com uma certa conexão (e portanto todos os pacotes adicionais da conexão TCP).

Como temos duas conexões diferentes no exemplo, com os dois computadores conectados ao mesmo servidor usando a mesma "porta TCP de origem", dois soquetes diferentes manipularão pacotes que diferem apenas na porta TCP de destino.