Como o servidor descobre para qual porta cliente enviar?

21

Pelo que entendi, é isso que acontece quando um cliente faz uma solicitação de conexão:

  1. O servidor será ligado a um número de porta específico. O número da porta está sempre ligado a um processo de escuta. Como apenas o servidor está atendendo conexões de entrada, não precisamos nos vincular no lado do cliente
  2. O servidor continuará escutando esse número de porta.
  3. O cliente enviará uma solicitação connect() .
  4. O servidor aceitará a solicitação usando accept() . Assim que o servidor aceitar a solicitação do cliente, o kernel alocará um número de porta aleatório para o servidor por mais send() e receive() , já que o mesmo número de porta no servidor não pode ser usado tanto para envio como para escuta. e a porta anterior ainda está escutando novas conexões

Dado tudo isso, como o servidor descobre em qual porta o cliente está recebendo? Eu sei que o cliente enviará segmentos TCP com uma porta de origem e uma porta de destino, portanto, o servidor usará a porta de origem desse segmento como sua porta de destino, mas qual função o servidor chama para descobrir essa porta? É accept() ?

    
por Subi Suresh 07.05.2013 / 18:51

4 respostas

26

Faz parte do cabeçalho TCP (ou UDP, etc.) do pacote. Então o servidor descobre porque o cliente diz isso. Isso é semelhante a como ele descobre o endereço IP do cliente (que faz parte do cabeçalho IP).

Por exemplo, todo pacote TCP inclui um cabeçalho IP (com IP de origem, IP de destino e protocolo [TCP], pelo menos). Em seguida, há um cabeçalho TCP (com porta de origem e destino, além de mais).

Quando o kernel recebe um pacote SYN (o início de uma conexão TCP) com um IP remoto de 10.11.12.13 (no cabeçalho IP) e uma porta remota de 12345 (no cabeçalho TCP), ele então conhece o remoto IP e porta. Envia de volta um SYN | ACK. Se obtiver um ACK de volta, a chamada listen retornará um novo soquete, configurado para essa conexão.

Um soquete TCP é identificado exclusivamente pelos quatro valores (IP remoto, IP local, porta remota, porta local). Você pode ter várias conexões / soquetes, desde que pelo menos uma delas seja diferente.

Normalmente, a porta local e o IP local serão os mesmos para todas as conexões com um processo do servidor (por exemplo, todas as conexões com o sshd estarão em local-ip: 22). Se uma máquina remota fizer várias conexões, cada uma utilizará uma porta remota diferente. Assim, tudo, menos a porta remota, será o mesmo, mas tudo bem - apenas um dos quatro deve ser diferente.

Você pode usar, por exemplo, wirehsark para ver o pacote e rotular todos os dados para você. Aqui está a porta de origem destacada (observe-a destacada no pacote decodificado, bem como o dump hexadecimal na parte inferior):

    
por 07.05.2013 / 19:06
2

A "solicitação de conexão (a chamada de sistema connect() do programa cliente, normalmente) causa um handshake de três vias

Você pode ver isso em um artigo sobre os pacotes Nmap x Natural SYN . A decodificação do pacote Nmap SYN tem a frase "source.60058 > dest.22". A decodificação "legitimate SYN packet" tem a frase "source.35970 > dest.80". Os dois pacotes SYN informam ao kernel remoto que os pacotes são da porta TCP 60058 e 35970, respectivamente.

    
por 07.05.2013 / 19:06
1

O soquete TCP é um soquete orientado a fluxo. Os dois descritores de soquete (pertencentes a você e seu par) são conectados de maneira confiável. Então você não precisa se preocupar com a porta do cliente - apenas escreva seu descritor de soquete!

Além disso, sinta-se à vontade para getsockname (2) se você realmente quiser saber disso (para registrar talvez).

    
por 08.10.2013 / 16:51
0

A conexão é definida por uma tupla (IP de origem, porta de origem, IP de destino, porta de destino). Respostas vão no sentido inverso.

    
por 07.05.2013 / 18:54

Tags