AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1160855
Accepted
doc_id
doc_id
Asked: 2024-06-12 20:18:19 +0800 CST2024-06-12 20:18:19 +0800 CST 2024-06-12 20:18:19 +0800 CST

Compartilhamento de porta de origem TCP

  • 772

Meu entendimento da conexão TCP é que uma PORTA de origem permanece exclusiva para uma conexão, não importa o destino, portanto o número de conexões da porta local 12345, por exemplo, nunca pode exceder 1.

Li recentemente que uma conexão TCP é identificada por <src IP, src PORT, dst IP, dst PORT>

O TCP permite o compartilhamento da porta de origem entre vários processos, mas cada processo requer uma porta livre para vincular sua conexão

então fui validar esse "compartilhamento de porta entre processos": isso deve significar que a mesma porta de origem pode ser usada para conectar-se a destinos diferentes.

No entanto, ao experimentar isso, tentei estes dois comandos:

nc -v -p 12345 google.com 80

que funciona bem (-v para verboso e -p para especificar a porta de origem como 12345, para meu propósito de aprendizado)

Agora, executando simultaneamente este comando em um shell diferente

nc -v -p 12345 github.com 80

falha com esta mensagem de erro:

nc: falha na conexão x à porta 80 do github.com (tcp): endereço já em uso

o motivo pelo qual especifiquei a mesma porta de origem com -p é para validar que uma porta de origem pode ser compartilhada. Na prática, não há necessidade disso, no cenário do mundo real eu nem me preocuparia com a porta de origem. De acordo com isso, é verdade que uma porta de origem será usada apenas uma vez?

port
  • 4 4 respostas
  • 2051 Views

4 respostas

  • Voted
  1. Best Answer
    nneonneo
    2024-06-13T16:40:50+08:002024-06-13T16:40:50+08:00

    Não há razão para que dois processos não possam usar a mesma porta de origem, desde que ambos não se conectem ao mesmo destino (host, porta). Em muitos sistemas UNIX, configure a SO_REUSEPORTopção para permitir que os processos compartilhem um número de porta; no Windows, defina SO_REUSEADDR. Por exemplo, com socat:

    • processo 1:socat stdio tcp:google.com:80,bind=:12345,reuseport
    • processo 2:socat stdio tcp:bing.com:80,bind=:12345,reuseport

    Esses dois processos podem ser executados simultaneamente e ambos terão a porta de origem 12345 (como você pode confirmar em netstat).

    Observe, no entanto, que você quase certamente terá problemas se os soquetes não estiverem fechados corretamente em ambas as extremidades, pois os soquetes TCP não fechados entrarão em um TIME_WAITestado que fará com que as quatro tuplas (srcaddr, srcport, dstaddr, dstport) sejam vinculadas até que o período de espera expire. Portanto, ao usar uma única porta de origem para múltiplas conexões, você não poderá se reconectar exatamente ao mesmo servidor e porta, a menos que a conexão anterior tenha sido totalmente encerrada ou o TIME_WAITperíodo tenha expirado.

    • 15
  2. Zac67
    2024-06-13T02:21:25+08:002024-06-13T02:21:25+08:00

    Qualquer porta só é alocada para um único processo em qualquer momento. Esse processo pode criar qualquer número de conexões com ele, com a restrição de que o endereço IP de destino ou número da porta varie entre as conexões.

    Por exemplo, o TCP 10.0.0.10:49152 pode conectar-se apenas uma vez ao TCP 10.0.0.2:80, mas pode ao mesmo tempo conectar-se ao TCP 10.0.0.3:80 ou ao TCP 10.0.0.2:8080.

    • 8
  3. Barmar
    2024-06-14T06:45:03+08:002024-06-14T06:45:03+08:00

    Embora o próprio protocolo TCP permita combinações arbitrárias de portas e endereços locais e remotos, a maioria das implementações Unix simplifica o gerenciamento de portas. A razão é que o processo de configuração de soquetes é dividido em etapas separadas.

    • Primeiro você define a porta local com bind(). Esta etapa é necessária ao criar um soquete TCP de escuta (você deve especificar em qual porta ele está escutando), é opcional antes de fazer uma conexão de saída connect()(uma porta local arbitrária será atribuída). Como ainda não sabemos o endereço remoto ou a porta, não é possível dizer se isso é totalmente exclusivo. Portanto, simplesmente verifica se a porta solicitada está disponível. Se o soquete tiver a SO_REUSEADDRopção definida, ele ignorará os soquetes conectados ao verificar se o endereço local está em uso, mas ainda falhará se houver um soquete de escuta na porta.

    • Então, para uma conexão de saída, você chama connect(), especificando o endereço remoto. Você só pode chamar connect()uma vez em um soquete e, como verificamos a porta local durante bind(), isso nunca pode produzir um endereço/porta local/remoto duplicado.

    • Para uma conexão de entrada, você chama accept()o soquete de escuta. Novamente, como verificamos se a porta local do soquete de escuta não está em uso quando a vinculamos, nunca poderá haver uma combinação duplicada.

    Atrasar as verificações das portas até que tenhamos as informações remotas complicaria o tratamento de erros. O design atual apenas verifica a duplicação em um só lugar: bind().

    • 2
  4. doc_id
    2024-06-12T20:40:54+08:002024-06-12T20:40:54+08:00

    Após algumas investigações, descobri que o compartilhamento da porta de origem só é permitido para múltiplas conexões de saída do mesmo processo. O sistema operacional precisa saber para qual processo encaminhar o fluxo de conexão.

    Selecionarei esta resposta em dois dias como política do site.

    • 1

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve