Qual é a diferença entre uma porta e um soquete?

928

Essa foi uma pergunta levantada por um dos engenheiros de software da minha organização. Estou interessado na definição mais ampla.

Richard Dorman
fonte
19
Apenas para reiterar, os soquetes não se limitam às E / S da rede. Eles estão disponíveis em todos os tipos de situações para transmitir dados entre vários aplicativos.
Oli

Respostas:

977

Sumário

Um soquete TCP é uma instância de terminal definida por um endereço IP e uma porta no contexto de uma conexão TCP específica ou do estado de escuta.

Uma porta é um identificador de virtualização que define um terminal em serviço (diferente de um terminal em instância de serviço, também conhecido como identificador de sessão).

Um soquete TCP não é uma conexão , é o ponto final de uma conexão específica.

Pode haver conexões simultâneas com um terminal em serviço , porque uma conexão é identificada pelos terminais locais e remotos , permitindo que o tráfego seja roteado para uma instância de serviço específica.

Só pode haver um soquete de ouvinte para uma determinada combinação de endereço / porta .

Exposição

Essa foi uma pergunta interessante que me forçou a reexaminar uma série de coisas que eu pensava conhecer de dentro para fora. Você pensaria que um nome como "soquete" seria auto-explicativo: obviamente foi escolhido para evocar imagens do terminal no qual você conecta um cabo de rede, com fortes paralelos funcionais. No entanto, na linguagem da rede, a palavra "soquete" carrega tanta bagagem que é necessário um cuidadoso reexame.

No sentido mais amplo possível, uma porta é um ponto de entrada ou saída. Embora não seja usada em um contexto de rede, a palavra francesa porte significa literalmente porta ou gateway , enfatizando ainda mais o fato de que as portas são terminais de transporte, independentemente de você enviar dados ou grandes contêineres de aço.

Para os fins desta discussão, limitarei a consideração ao contexto das redes TCP-IP. O modelo OSI está muito bem, mas nunca foi completamente implementado, muito menos amplamente implantado em condições de alto tráfego e alta tensão.

A combinação de um endereço IP e uma porta é estritamente conhecida como terminal e às vezes é chamada de soquete. Esse uso se origina no RFC793, a especificação TCP original.

Uma conexão TCP é definida por dois pontos de extremidade, também conhecidos como soquetes .

Um ponto final (soquete) é definido pela combinação de um endereço de rede e um identificador de porta . Observe que o endereço / porta não identifica completamente um soquete (mais sobre isso mais adiante).

O objetivo das portas é diferenciar vários pontos de extremidade em um determinado endereço de rede. Você poderia dizer que uma porta é um terminal virtualizado. Essa virtualização possibilita várias conexões simultâneas em uma única interface de rede.

É o par de soquetes (a 4-tupla que consiste no endereço IP do cliente, número da porta do cliente, endereço IP do servidor e número da porta do servidor) que especifica os dois pontos de extremidade que identificam exclusivamente cada conexão TCP em uma Internet. ( Volume ilustrado TCP-IP 1 , W. Richard Stevens)

Na maioria das linguagens derivadas de C, as conexões TCP são estabelecidas e manipuladas usando métodos em uma instância de uma classe Socket. Embora seja comum operar em um nível mais alto de abstração, geralmente uma instância de uma classe NetworkStream, isso geralmente expõe uma referência a um objeto de soquete. Para o codificador, esse objeto de soquete parece representar a conexão porque a conexão é criada e manipulada usando métodos do objeto de soquete.

Em C #, para estabelecer uma conexão TCP (para um ouvinte existente), primeiro você cria um TcpClient . Se você não especificar um terminal para o construtor TcpClient, ele usará os padrões - de uma maneira ou de outra, o terminal local é definido. Em seguida, você invoca o método Connect na instância que você criou. Este método requer um parâmetro que descreve o outro terminal.

Tudo isso é um pouco confuso e leva você a acreditar que um soquete é uma conexão, que é besteira. Eu estava trabalhando sob essa má compreensão até que Richard Dorman fez a pergunta.

Depois de ler e pensar bastante, agora estou convencido de que faria muito mais sentido ter uma classe TcpConnection com um construtor que usa dois argumentos, LocalEndpoint e RemoteEndpoint . Provavelmente, você poderia suportar um único argumento RemoteEndpoint quando os padrões forem aceitáveis ​​para o terminal local. Isso é ambíguo em computadores com hospedagem múltipla, mas a ambiguidade pode ser resolvida usando a tabela de roteamento, selecionando a interface com a rota mais curta para o terminal remoto.

A clareza também seria aprimorada em outros aspectos. Um soquete não é identificado pela combinação de endereço IP e porta:

[...] TCP desmultiplexa segmentos de entrada usando todos os quatro valores que compreendem os endereços local e externo: endereço IP de destino, número da porta de destino, endereço IP de origem e número da porta de origem. O TCP não pode determinar qual processo obtém um segmento de entrada olhando apenas a porta de destino. Além disso, o único dos [vários] pontos de extremidade em [um determinado número de porta] que receberá solicitações de conexão de entrada é aquele no estado de escuta. (p255, TCP-IP Illustrated Volume 1 , W. Richard Stevens)

Como você pode ver, não é apenas possível, mas também muito provável, que um serviço de rede tenha vários soquetes com o mesmo endereço / porta, mas apenas um soquete de ouvinte em uma combinação específica de endereço / porta. As implementações típicas de bibliotecas apresentam uma classe de soquete, cuja instância é usada para criar e gerenciar uma conexão. Isso é extremamente lamentável, pois causa confusão e levou a uma confusão generalizada dos dois conceitos.

Hagrawal não acredita em mim (veja comentários), então aqui está uma amostra real. Conectei um navegador da web a http://dilbert.com e depois corri netstat -an -p tcp. As últimas seis linhas da saída contêm dois exemplos do fato de que endereço e porta não são suficientes para identificar exclusivamente um soquete. Existem duas conexões distintas entre 192.168.1.3 (minha estação de trabalho) e 54.252.94.236:80 (o servidor HTTP remoto)

  TCP    192.168.1.3:63240      54.252.94.236:80       SYN_SENT
  TCP    192.168.1.3:63241      54.252.94.236:80       SYN_SENT
  TCP    192.168.1.3:63242      207.38.110.62:80       SYN_SENT
  TCP    192.168.1.3:63243      207.38.110.62:80       SYN_SENT
  TCP    192.168.1.3:64161      65.54.225.168:443      ESTABLISHED

Como um soquete é o ponto final de uma conexão, existem dois soquetes com a combinação de endereço / porta 207.38.110.62:80e mais dois com a combinação de endereço / porta 54.252.94.236:80.

Acho que o mal-entendido de Hagrawal decorre do meu uso cuidadoso da palavra "identifica". Quero dizer "identifica completamente, sem ambiguidade e unicamente". Na amostra acima, existem dois pontos de extremidade com a combinação de endereço / porta 54.252.94.236:80. Se tudo o que você tem é endereço e porta, você não possui informações suficientes para diferenciar esses soquetes. Não há informações suficientes para identificar um soquete.

Termo aditivo

O parágrafo dois da seção 2.7 da RFC793 diz

Uma conexão é totalmente especificada pelo par de soquetes nas extremidades. Um soquete local pode participar de muitas conexões com diferentes soquetes externos.

Essa definição de soquete não é útil do ponto de vista de programação, pois não é a mesma coisa que um objeto de soquete , que é o ponto final de uma conexão específica. Para um programador, e a maior parte do público dessa pergunta são programadores, essa é uma diferença funcional vital.

Referências

  1. Volume 1 do TCP-IP Illustrated Os protocolos , W. Richard Stevens, 1994 Addison Wesley

  2. RFC793 , Instituto de Ciências da Informação, Universidade do Sul da Califórnia para DARPA

  3. RFC147 , A definição de um soquete, Joel M. Winett, Lincoln Laboratory

Peter Wone
fonte
6
Talvez uma analogia do mundo real com as palavras-chave soquete e porta ajudasse aqueles que votaram positivamente na questão. Ainda é uma ótima explicação!
rohitverma
5
@rationalcoder - Leia a resposta completa. Há uma diferença entre ser definido por algo e ser identificado por ele. Por exemplo, instâncias de uma classe são definidas pela classe. Eles são parcialmente, mas não completamente identificados por ele.
quer
6
Não votei porque não concordo com esta afirmação - " Um soquete não é identificado pela combinação de endereço IP e porta: " .. Leia TCP RFC - tools.ietf.org/html/rfc793 .. É muito claro que socket é uma combinação de IP e porta; se você conhece IP e porta, identificou um soquete ou terminal; se conhece um par de soquetes, ou seja, IP + porta do cliente e IP + do servidor, então identificou uma conexão única ..
hagrawal
6
"No exemplo acima, existem dois pontos de extremidade com a combinação de endereço / porta 54.252.94.236:80. Se tudo o que você tem é endereço e porta, não há informações suficientes para diferenciar esses soquetes. Não há informações suficientes para identificar um tomada ". Não são os mesmos soquetes, mas conexões diferentes, entre as duas conexões às quais você tem 3 soquetes, 2 locais e um mesmo soquete de servidor; ou são de fato dois soquetes diferentes? Não haveria como diferenciá-los porque são iguais, mas para diferenciar as conexões, você precisaria dos diferentes soquetes locais.
Andrew Clavin
6
-1 Sua resposta está simplesmente errada. Você: "Um soquete TCP é ... o ponto final de uma conexão específica ." RFC 793 : "um soquete pode ser usado simultaneamente em várias conexões ". Não tenho certeza de quais bibliotecas você está usando, mas nas bibliotecas que usei, os objetos de soquete foram definidos exclusivamente por um IP e uma porta e geraram objetos de conexão para cada soquete remoto.
Zaz
187

Um soquete consiste em três coisas:

  1. Um endereço IP
  2. Um protocolo de transporte
  3. Um número de porta

Uma porta é um número entre 1 e 65535, inclusive, que significa uma porta lógica em um dispositivo. Toda conexão entre um cliente e um servidor requer um soquete exclusivo.

Por exemplo:

  • 1030 é uma porta.
  • (10.1.1.2, TCP, porta 1030) é um soquete.
RT_
fonte
80
Não. Um soquete consiste em cinco itens: {protocolo, endereço local, porta local, endereço remoto, porta remota}.
Marquês de Lorne
19
@EJP Não, novamente. Veja a resposta selecionada para mais informações.
Kehlan Krumme 10/10
2
@KorayTugay Está no cabeçalho IP. O que faz você pensar que a camada TCP não pode ver isso?
Marquês de Lorne
1
@EJP, como posso ver na resposta mais votada acima, que um soquete NÃO é a conexão em si, mas é o ponto final de uma conexão; por que motivo pode incluir portas e endereços IP locais e remotos? Um soquete representará apenas um lado da conexão, ou seja, porta local e endereço IP local OU porta remota e acesso remoto a ip. Por favor, corrija-me se estiver errado.
RBT
7
@EJP Still RFC 793: "Um par de soquetes identifica exclusivamente cada conexão. Ou seja, um soquete pode ser usado simultaneamente em várias conexões". Se um soquete já consistia em cinco coisas, como poderia haver "um par de soquetes" na minha citação?
Gab是好人
100

Um soquete representa uma conexão única entre dois aplicativos de rede. Esses dois aplicativos são executados nominalmente em computadores diferentes, mas os soquetes também podem ser usados ​​para comunicação entre processos em um único computador. Os aplicativos podem criar vários soquetes para se comunicar. Os soquetes são bidirecionais, o que significa que ambos os lados da conexão são capazes de enviar e receber dados. Portanto, um soquete pode ser criado teoricamente em qualquer nível do modelo OSI de 2 em diante. Os programadores geralmente usam soquetes na programação de rede, embora indiretamente. Bibliotecas de programação como o Winsock ocultam muitos detalhes de baixo nível da programação de soquetes. Os soquetes têm sido amplamente utilizados desde o início dos anos 80.

Uma porta representa um ponto final ou "canal" para comunicações em rede. Os números de porta permitem que aplicativos diferentes no mesmo computador utilizem recursos de rede sem interferir entre si. Os números de porta costumam aparecer na programação de rede, principalmente na programação de soquetes. Às vezes, porém, os números de porta são tornados visíveis para o usuário casual. Por exemplo, alguns sites que uma pessoa visita na Internet usam um URL como o seguinte:

http://www.mairie-metz.fr:8080/ Neste exemplo, o número 8080 refere-se ao número da porta usada pelo navegador da Web para conectar-se ao servidor da Web. Normalmente, um site usa a porta número 80 e esse número não precisa ser incluído na URL (embora possa ser).

Na rede IP, os números de porta podem teoricamente variar de 0 a 65535. Porém, os aplicativos de rede mais populares usam números de porta na extremidade inferior do intervalo (como 80 para HTTP).

Nota: O termo porta também se refere a vários outros aspectos da tecnologia de rede. Uma porta pode se referir a um ponto de conexão físico para dispositivos periféricos, como portas seriais, paralelas e USB. O termo porta também se refere a determinados pontos de conexão Ethernet, como os de um hub, comutador ou roteador.

ref http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm

ref http://compnetworking.about.com/od/itinformationtechnology/l/bldef_socket.htm

Galego
fonte
2
A camada 2 no modelo OSI é uma conexão entre nós, não possui mecanismo de conexão de processos. Não acredito que você considere um soquete existente no OSI l2.
Antonio Haley
18
Um circuito é uma conexão - um soquete é um ponto final. Uma conexão consiste em 2 soquetes.
Mark Brackett
Um soquete representa uma conexão única entre dois aplicativos de rede. ” Isso não corresponde ao RFC 793, Protocolo de Controle de Transmissão que explica: “ Para permitir que muitos processos em um único Host usem os recursos de comunicação TCP simultaneamente, o TCP fornece um conjunto de endereços. ou portas dentro de cada host. Concatenado com os endereços de rede e host da camada de comunicação da Internet, isso forma um soquete. Um par de soquetes identifica exclusivamente cada conexão. "
Ron Maupin 17-17
84

Com alguma analogia

Embora muita coisa técnica já tenha sido dada acima para soquetes ... Gostaria de adicionar minha resposta, caso alguém ainda não consiga sentir a diferença entre ip, porta e soquetes

Considere um servidor S ,

e digamos que a pessoa X, Y, Z precise de um serviço (digamos, serviço de bate-papo) desse servidor S

então

O endereço IP informa -> quem? é o servidor de bate-papo 'S' que X, Y, Z desejam entrar em contato

ok, você tem "quem é o servidor"

mas suponha que o servidor 'S' também esteja fornecendo outros serviços para outras pessoas, digamos 'S' forneça serviços de armazenamento para a pessoa A, B, C

então

porta diz ---> qual? serviço que você (X, Y, Z) precisa, ou seja, serviço de bate-papo e não esse serviço de armazenamento

ok .., você faz com que o servidor saiba que 'serviço de bate-papo' é o que você deseja e não o armazenamento

mas

você tem três anos e o servidor pode querer identificar todos os três de maneira diferente

aí vem a tomada

agora socket diz -> qual? conexão particular

isto é, digamos,

soquete 1 para a pessoa X

soquete 2 para a pessoa Y

e soquete 3 para a pessoa Z

Espero que ajude alguém que ainda estava confuso :)

eRaisedToX
fonte
Então X, Y, Z se conectariam à mesma porta, ou seja, ao mesmo serviço, mas terão soquetes diferentes no lado do servidor? Então, quando, digamos, o X enviar algum pacote para o servidor, ele dirá: 'encontre-me o soquete (protocolo, IP de X, porta de X, IP de S, porta de S)' e envie para o aplicativo de bate-papo. Suponho que deve haver uma ligação entre alguns objetos específicos do aplicativo e objetos de soquete? Por exemplo, quando recebo alguns dados do soquete-1, desejo exibi-los como uma mensagem do usuário, mas o aplicativo precisa saber que as mensagens do soquete A são do Usuário-X.
Monolito
44

Em primeiro lugar, acho que devemos começar com um pouco de compreensão do que constitui obter um pacote de A a B.

Uma definição comum para uma rede é o uso do Modelo OSI que separa uma rede em várias camadas de acordo com a finalidade. Existem alguns importantes que abordaremos aqui:

  • A camada de link de dados . Essa camada é responsável por obter pacotes de dados de um dispositivo de rede para outro e fica logo acima da camada que realmente transmite. Ele fala sobre endereços MAC e sabe como encontrar hosts com base em seus endereços MAC (hardware), mas nada mais.
  • A camada de rede é a camada que permite transportar dados entre máquinas e além dos limites físicos, como dispositivos físicos. A camada de rede deve essencialmente suportar um mecanismo adicional baseado em endereço que se relacione de alguma forma com o endereço físico; digite o Protocolo da Internet (IPv4). Um endereço IP pode levar seu pacote de A a B pela Internet, mas não sabe nada sobre como percorrer saltos individuais. Isso é tratado pela camada acima, de acordo com as informações de roteamento.
  • A camada de transporte . Essa camada é responsável por definir a maneira como as informações passam de A para B e quaisquer restrições, verificações ou erros nesse comportamento. Por exemplo, o TCP adiciona informações adicionais a um pacote para que seja possível deduzir se os pacotes foram perdidos.

O TCP contém, entre outras coisas, o conceito de portas . Esses são pontos de extremidade de dados efetivamente diferentes no mesmo endereço IP ao qual um Socket da Internet ( AF_INET) pode se conectar.

Por acaso, o UDP e outros protocolos da camada de transporte também. Tecnicamente, eles não precisam apresentar portas, mas essas portas fornecem uma maneira para vários aplicativos nas camadas acima usarem o mesmo computador para receber (e de fato fazer) conexões de saída.

O que nos leva à anatomia de uma conexão TCP ou UDP. Cada um possui uma porta e endereço de origem e uma porta e endereço de destino. Isso é feito para que, em qualquer sessão, o aplicativo de destino possa responder e receber da fonte.

Portanto, as portas são essencialmente uma maneira especificada por especificação de permitir várias conexões simultâneas compartilhando o mesmo endereço.

Agora, precisamos dar uma olhada em como você se comunica do ponto de vista do aplicativo para o mundo exterior. Para fazer isso, você precisa perguntar gentilmente ao seu sistema operacional e, como a maioria dos sistemas operacionais oferece suporte à maneira de fazer as coisas nos Berkeley Sockets, vemos que podemos criar soquetes envolvendo portas de um aplicativo como este:

int fd = socket(AF_INET, SOCK_STREAM, 0); // tcp socket
int fd = socket(AF_INET, SOCK_DGRAM, 0); // udp socket
// later we bind...

Ótimo! Então, nas sockaddrestruturas, especificaremos nossa porta e bam! Tarefa concluída! Bem, quase, exceto:

int fd = socket(AF_UNIX, SOCK_STREAM, 0);

também é possível. Urgh, isso jogou uma chave inglesa nos trabalhos!

Ok, bem, na verdade não tem. Tudo o que precisamos fazer é apresentar algumas definições apropriadas:

  • Um soquete de Internet é a combinação de um endereço IP, um protocolo e seu número de porta associado, no qual um serviço pode fornecer dados. Portanto, a porta 80 do tcp, stackoverflow.com, é um soquete de internet.
  • Um soquete unix é um terminal IPC representado no sistema de arquivos, por exemplo /var/run/database.sock.
  • Uma API de soquete é um método de solicitar que um aplicativo possa ler e gravar dados em um soquete.

Voila! Isso arruma as coisas. Então, em nosso esquema, então,

  • Uma porta é um identificador numérico que, como parte de um protocolo da camada de transporte, identifica o número do serviço que deve responder à solicitação especificada.

Realmente, uma porta é um subconjunto dos requisitos para formar um soquete de Internet. Infelizmente, acontece que o significado da palavra soquete foi aplicado a várias idéias diferentes. Por isso, aconselho sinceramente que você nomeie seu próximo soquete do projeto, apenas para aumentar a confusão;)


fonte
É por isso que as balas não saem e não saem do Powerpoint; eles trabalham!
Anurag Kalia 01/03
Muito boa introdução ao TCP-IP e comunicação de rede. Iniciantes, leia isso primeiro.
Colin
32

Um soquete = Endereço IP + uma porta (endereço numérico)
Juntos, eles identificam um ponto final para uma conexão de rede em uma máquina. (Acabei de reprovar a rede 101?)

Gishu
fonte
7
Acredito que port tem um significado mais amplo que sua definição.
Richard Dorman
2
E os soquetes não estão sujeitos apenas à pilha TCP / IP. Consulte soquetes de domínio UNIX ou soquetes de comunicação entre processos em geral.
Matthias krull #
não tenho certeza sobre esta resposta. Você pode usar o HTTP para se comunicar com outro processo por soquetes sem atribuir uma porta.
SeF 13/04
31

Geralmente, você terá muitas teorias, mas uma das maneiras mais fáceis de diferenciar esses dois conceitos é a seguinte:

Para obter um serviço, você precisa de um número de serviço. Esse número de serviço é chamado de porta. Simples assim.

Por exemplo, o HTTP como um serviço está sendo executado na porta 80.

Agora, muitas pessoas podem solicitar o serviço e uma conexão do cliente-servidor foi estabelecida. Haverá muitas conexões. Cada conexão representa um cliente. Para manter cada conexão, o servidor cria um soquete por conexão para manter seu cliente.

kta
fonte
Cada soquete requer sua própria porta?
MondayPaper
Impressionante. A maneira mais simples de apresentar um conhecimento da montanha.
Asif Mehmood
5
Não tenho certeza se a sua declaração: "o servidor cria soquete por conexão para manter seu cliente" está correta.
Rushi Agrawal 6/06/2015
1
@RushiAgrawal Então eu sugiro que você procure. Especificamente, veja o homem aceitar.
Marquês de Lorne
1
Isso implica que para cada soquete que o servidor cria por conexão para manter seu cliente possa ter o mesmo número de porta (como a porta 80 para continuação de conexões HTTP), mas com um endereço IP diferente dos clientes dos quais os pedidos de conexão são enviados. direita?
Randika Vishman 5/09/2015
25

Parece haver muitas respostas que igualam o soquete à conexão entre 2 PCs .. o que eu acho absolutamente incorreto. Um soquete sempre foi o ponto final em 1 PC, que pode ou não estar conectado - certamente todos nós já usamos soquetes listener ou UDP * em algum momento. A parte importante é que é endereçável e ativa. O envio de uma mensagem para 1.1.1.1:1234 provavelmente não funcionará, pois não há soquete definido para esse terminal.

Os soquetes são específicos do protocolo - portanto, a implementação da exclusividade que o TCP / IP e o UDP / IP usa * (endereço ip : porta) é diferente de, por exemplo, IPX (rede, nó e ... ahem, soquete - mas um diferente soquete do que o termo "soquete" geral. Os números de soquete IPX são equivalentes às portas IP). Mas, todos eles oferecem um endpoint endereçável exclusivo.

Desde que o IP se tornou o protocolo dominante, uma porta (em termos de rede) tornou-se sinônoma com um número de porta UDP ou TCP - que é uma parte do endereço do soquete.

  • O UDP é sem conexão - o que significa que nenhum circuito virtual entre os dois pontos finais jamais foi criado. No entanto, ainda nos referimos aos soquetes UDP como o ponto final. As funções da API deixam claro que ambos são apenas tipos diferentes de soquetes - SOCK_DGRAMé UDP (apenas enviando uma mensagem) e SOCK_STREAMTCP (criando um circuito virtual).

  • Tecnicamente, o cabeçalho IP mantém o endereço IP e o protocolo em cima do IP (UDP ou TCP) mantém o número da porta. Isso torna possível ter outros protocolos (por exemplo, ICMP que não possuem números de porta, mas possuem informações de endereçamento IP).

Mark Brackett
fonte
25

Breve resposta breve.

Uma porta pode ser descrita como um endereço interno em um host que identifica um programa ou processo.

Um soquete pode ser descrito como uma interface de programação que permite que um programa se comunique com outros programas ou processos, na Internet ou localmente.

Andy
fonte
3
A palavra 'interno' na descrição da porta soa como 'não público' para mim.
Jonas N
Então, poderíamos dizer: os soquetes são executados dentro das portas? ou portas é executado dentro de soquetes?
Gucho Ca
@GuchoCa Não podemos dizer que soquetes ou portas funcionem, muito menos um dentro do outro. Não está claro o que você está perguntando.
Marquês de Lorne #
16

São termos de dois domínios diferentes: 'porta' é um conceito da rede TCP / IP, 'soquete' é uma coisa de API (programação). Um 'soquete' é criado (no código), pegando uma porta e um nome de host ou adaptador de rede e combinando-os em uma estrutura de dados que você pode usar para enviar ou receber dados.

Roel
fonte
Para a resposta mais geral, marque "feito com uma porta e um nome de host ou adaptador de rede e combinando-os em um". Por exemplo, um soquete UNIX é (no código) uma estrutura de dados (ou objeto) que você pode usar para enviar ou receber dados.
Josiah Yoder 22/09
14

Estes são conceitos básicos de rede, por isso vou explicá-los de uma maneira fácil e abrangente para entender em detalhes.

  • Um soquete é como um telefone (ou seja, dispositivo de ponta a ponta para comunicação)
  • IP é como o seu número de telefone (endereço da sua tomada)
  • Porta é como a pessoa com quem você deseja conversar (ou seja, o serviço que você deseja solicitar nesse endereço)
  • Um soquete pode ser um cliente ou um servidor (ou seja, em uma empresa, o telefone do suporte ao cliente é um servidor, mas um telefone em sua casa é principalmente um cliente)

Portanto, um soquete na rede é um dispositivo de comunicação virtual vinculado a um par (ip, porta) = (endereço, serviço).

Nota:

  • Uma máquina, um computador, um host, um celular ou um PC pode ter vários endereços, várias portas abertas e, portanto, vários soquetes. Como em um escritório, você pode ter vários telefones com vários números de telefone e várias pessoas com quem conversar.
  • A existência de uma porta aberta / ativa requer que você tenha um soquete vinculado a ela, porque é o soquete que torna a porta acessível. No entanto, você pode ter portas não utilizadas por enquanto.
  • Observe também que em um soquete de servidor você pode vinculá-lo a (uma porta, um endereço específico de uma máquina) ou a (uma porta, todos os endereços de uma máquina), pois no telefone você pode conectar várias linhas telefônicas (números de telefone) a um telefone ou uma linha telefônica específica para um telefone e ainda assim você pode alcançar uma pessoa através de todas essas linhas telefônicas ou através de uma linha telefônica específica.
  • Você não pode associar (ligar) um soquete a duas portas, como no telefone, normalmente nem sempre você pode ter duas pessoas usando o mesmo telefone ao mesmo tempo.
  • Avançado: na mesma máquina, você não pode ter dois soquetes com o mesmo tipo (cliente ou servidor) e a mesma porta e ip. No entanto, se você é um cliente, pode abrir duas conexões, com dois soquetes, para um servidor, porque a porta local em cada um dos soquetes desse cliente é diferente)

Espero que tire suas dúvidas

Mosab Shaheen
fonte
É interessante ver todos esses entendimentos e analogias de soquetes / portas / endereços IP sob esta pergunta. E eu gosto desta resposta.
Bloodmoon
12

Depois de ler as excelentes respostas votadas, descobri que o seguinte ponto precisava de ênfase para mim, um novato na programação em rede:

As conexões TCP-IP são caminhos bidirecionais que conectam um endereço: combinação de portas com outro endereço: combinação de portas. Portanto, sempre que você abre uma conexão da sua máquina local com uma porta em um servidor remoto (por exemplo, www.google.com:80), também associa um novo número de porta na sua máquina à conexão, para permitir que o servidor envie coisas de volta para você (por exemplo, 127.0.0.1:65234). Pode ser útil usar o netstat para verificar as conexões da sua máquina:

> netstat -nWp tcp (on OS X)
Active Internet connections
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)    
tcp4       0      0  192.168.0.6.49871      17.172.232.57.5223     ESTABLISHED
...
Colin
fonte
12

Um endereço de soquete é um endereço IP e número de porta

123.132.213.231         # IP address
               :1234    # port number
123.132.213.231:1234    # socket address

Uma conexão ocorre quando dois soquetes são unidos.

Zaz
fonte
Não existe uma ligação entre duas tomadas. A palavra 'bound' significa outra coisa com portas.
Marquês de Lorne
10

Um soquete é um tipo especial de identificador de arquivo usado por um processo para solicitar serviços de rede do sistema operacional. Um endereço de soquete é o triplo: {protocolo, endereço local, processo local} em que o processo local é identificado por um número de porta.

No conjunto TCP / IP, por exemplo:

{tcp, 193.44.234.3, 12345}

Uma conversa é o elo de comunicação entre dois processos, representando uma associação entre dois. Uma associação é a tupla 5 que especifica completamente os dois processos que compõem uma conexão: {protocolo, endereço local, processo local, endereço externo, processo externo}

No conjunto TCP / IP, por exemplo:

{tcp, 193.44.234.3, 1500, 193.44.234.5, 21}

poderia ser uma associação válida.

Uma meia associação é: {protocolo, endereço local, processo local}

ou

{protocolo, endereço estrangeiro, processo estrangeiro}

que especificam cada metade de uma conexão.

A meia associação também é chamada de soquete ou endereço de transporte. Ou seja, um soquete é um ponto final para a comunicação que pode ser nomeada e endereçada em uma rede. A interface do soquete é uma das várias interfaces de programação de aplicativos (APIs) para os protocolos de comunicação. Projetado para ser uma interface de programação de comunicação genérica, foi introduzido pela primeira vez pelo sistema 4.2BSD UNIX. Embora não tenha sido padronizado, tornou-se de fato um padrão da indústria.

Krishna
fonte
Essa resposta é a que fez isso por mim. Acho que é porque ninguém mais mencionou a palavra associação. Boa explicação.
Racionalcoder
Não há número de processo em nenhum dos seus exemplos. A palavra que você está procurando é 'porta'.
Marquês de Lorne
Leia o primeiro parágrafo. É mencionado claramente lá. Informe-me de qualquer ambiguidade citando a frase exata. Seria útil improvisar.
Krishna
7

Um soquete é um terminal de comunicação. Um soquete não está diretamente relacionado à família de protocolos TCP / IP, pode ser usado com qualquer protocolo suportado pelo seu sistema. A API do soquete C espera que você primeiro obtenha um objeto de soquete em branco do sistema, que poderá vincular a um endereço de soquete local (para recuperar diretamente o tráfego de entrada para protocolos sem conexão ou para aceitar solicitações de conexão de entrada para protocolos orientados a conexão) ou que você pode conectar-se a um endereço de soquete remoto (para qualquer tipo de protocolo). Você pode até fazer as duas coisas se quiser controlar as duas, o endereço do soquete local ao qual um soquete está associado e o endereço do soquete remoto ao qual está conectado. Para protocolos sem conexão, conectar um soquete é opcional, mas se você não fizer isso, Também será necessário passar o endereço de destino com todos os pacotes que você deseja enviar pelo soquete, de que outra forma o soquete saberá para onde enviar esses dados? A vantagem é que você pode usar um único soquete para enviar pacotes para diferentes endereços de soquete. Depois de configurar o seu soquete e talvez até conectar, considere-o como um tubo de comunicação bidirecional. Você pode usá-lo para passar dados para algum destino e algum destino pode usá-lo para passar dados de volta para você. O que você escreve em um soquete é enviado e o que foi recebido está disponível para leitura. Você pode usá-lo para passar dados para algum destino e algum destino pode usá-lo para passar dados para você. O que você escreve em um soquete é enviado e o que foi recebido está disponível para leitura. Você pode usá-lo para passar dados para algum destino e algum destino pode usá-lo para passar dados para você. O que você escreve em um soquete é enviado e o que foi recebido está disponível para leitura.

Portas, por outro lado, são algo que somente alguns protocolos da pilha de protocolos TCP / IP possuem. Pacotes TCP e UDP têm portas. Uma porta é apenas um número simples. A combinação de porta de origem e porta de destino identifica um canal de comunicação entre dois hosts. Por exemplo, você pode ter um servidor que seja ambos, um servidor HTTP simples e um servidor FTP simples. Se agora chegar um pacote para o endereço desse servidor, como saberia se é um pacote para o servidor HTTP ou FTP? Bem, ele saberá que o servidor HTTP será executado na porta 80 e o servidor FTP na porta 21; portanto, se o pacote chegar com uma porta de destino 80, será para o servidor HTTP e não para o servidor FTP. Além disso, o pacote possui uma porta de origem, pois, sem essa porta, um servidor pode ter apenas uma conexão com um endereço IP de cada vez. A porta de origem possibilita a um servidor distinguir conexões idênticas: todas elas têm a mesma porta de destino, por exemplo, porta 80, o mesmo IP de destino (o IP do servidor) e o mesmo IP de origem, pois todas elas o mesmo cliente, mas como elas têm portas de origem diferentes, o servidor pode distingui-las. E quando o servidor envia respostas, ele o faz à porta da qual a solicitação veio, assim o cliente também pode distinguir respostas diferentes que recebe do mesmo servidor.

Mecki
fonte
2
Isto está incorreto. Um soquete não é um ponto final. Um soquete é definido por dois pontos de extremidade. Cada terminal é definido por um endereço de rede e uma porta. O objetivo das portas é diferenciar vários pontos de extremidade no mesmo endereço de rede, para que vários soquetes simultâneos possam ser suportados.
Peter Wone
1
Percebo que o RFC793 (especificação TCP original) se refere à combinação de um endereço de rede e uma porta como um soquete, para que eu possa ver onde você conseguiu isso, mas ainda está incorreto, pois um soquete é necessariamente definido por dois pontos de extremidade.
Peter Wone
2
Na reflexão, a literatura é contraditória e peço desculpas. A comunicação muito estrita não ocorre até que uma conexão TCP seja estabelecida entre dois pontos de extremidade (também conhecidos como soquetes), cada um dos quais é identificado por um endereço de rede e uma porta. Desisto.
Peter Wone
6

A porta foi a parte mais fácil, é apenas um identificador exclusivo para um soquete. Um soquete é algo que os processos podem usar para estabelecer conexões e se comunicar. Tall Jeff tinha uma ótima analogia telefônica que não era perfeita, então decidi corrigi-la:

  • IP e porta ~ número de telefone
  • soquete ~ dispositivo de telefone
  • conexão ~ ligação telefônica
  • estabelecendo conexão ~ chamando um número
  • processos, aplicativos remotos ~ pessoas
  • mensagens ~ fala
inf3rno
fonte
Boa esclarecimento (especialmente quando você considera a história de comutação telefônica que é parte da fundação da terminologia de rede ..)
oɔɯǝɹ
Dê uma olhada em uma netstattela por algum tempo. Todos os soquetes aceitos de um soquete de escuta compartilham a mesma porta. Portanto, uma porta não é um identificador exclusivo para um soquete.
Marquês de Lorne
6

Um aplicativo consiste em um par de processos que se comunicam pela rede (par cliente-servidor). Esses processos enviam e recebem mensagens para e da rede através de uma interface de software chamada soquete . Considerando a analogia apresentada no livro "Redes de computadores: abordagem de cima para baixo". Há uma casa que deseja se comunicar com outra casa. Aqui, a casa é análoga a um processo e a porta a uma tomada. O processo de envio pressupõe que exista uma infraestrutura do outro lado da porta que transportará os dados para o destino. Quando a mensagem é recebida do outro lado, ela passa pela porta do receptor (tomada) até a casa (processo). Esta ilustração do mesmo livro pode ajudá-lo:
insira a descrição da imagem aqui
Os soquetes fazem parte da camada de transporte, que fornece comunicação lógica aos aplicativos. Isso significa que, do ponto de vista do aplicativo, os dois hosts estão diretamente conectados entre si, mesmo que haja vários roteadores e / ou switches entre eles. Portanto, um soquete não é uma conexão em si, é o ponto final da conexão. Os protocolos da camada de transporte são implementados apenas em hosts e não em roteadores intermediários.
Portasfornecer meios de endereçamento interno a uma máquina. O objetivo principal é permitir que vários processos enviem e recebam dados pela rede sem interferir em outros processos (seus dados). Todos os soquetes são fornecidos com um número de porta. Quando um segmento chega a um host, a camada de transporte examina o número da porta de destino do segmento. Em seguida, encaminha o segmento para o soquete correspondente. Esse trabalho de entrega de dados em um segmento da camada de transporte para o soquete correto é chamado de desmultiplexação . Os dados do segmento são então encaminhados para o processo anexado ao soquete.

Ugnes
fonte
5

Um soquete é uma estrutura em seu software. É mais ou menos um arquivo; possui operações como leitura e gravação. Não é uma coisa física; é uma maneira do seu software se referir a coisas físicas.

Uma porta é algo semelhante a um dispositivo. Cada host possui uma ou mais redes (essas são físicas); um host tem um endereço em cada rede. Cada endereço pode ter milhares de portas.

Apenas um soquete pode estar usando uma porta em um endereço. O soquete aloca a porta aproximadamente como alocar um dispositivo para E / S do sistema de arquivos. Depois que a porta é alocada, nenhum outro soquete pode se conectar a essa porta. A porta será liberada quando o soquete estiver fechado.

Veja a terminologia TCP / IP .

S.Lott
fonte
3
Esta descrição do soquete é bastante fora da base. Um soquete é sobre a conexão entre um par de tuplas onde uma tupla se refere a um par IP ADDR e porta. Além disso, muitos soquetes PODEM conectar-se à mesma porta. Como você acha que um servidor Web usa várias conexões na porta 80? Esta é uma resposta pobre
Alto Jeff
1
Desculpa. Vários soquetes não estão conectados à porta 80. Um soquete está conectado e gera soquetes adicionais onde a transferência real acontece. Veja opengroup.org/onlinepubs/009695399/functions/listen.html .
S.Lott 30/09/08
1
Na verdade, a descrição em opengroup.org/onlinepubs/009695399/functions/connect.html é melhor. O soquete de ponto retornado por uma conexão NÃO está na porta 80.
S.Lott
1
Esta publicação está incorreta em vários detalhes e enganosa em vários aspectos.
Peter Wone
@ Peter Wone: Quais detalhes? Quais aspectos? Na esperança de aprender com meus erros.
S.Lott 02/10/08
5

do Oracle Java Tutorial :

Um soquete é um ponto final de um link de comunicação bidirecional entre dois programas em execução na rede. Um soquete é vinculado a um número de porta para que a camada TCP possa identificar o aplicativo ao qual os dados estão destinados a serem enviados.

yondoo
fonte
Isso é apenas um tutorial, e certamente não é uma referência normativa.
Marquês de Lorne
"Um soquete é um ponto final de um link de comunicação bidirecional" Isso não é uma definição de soquete, não é um tutorial em java?
prayagupd
@prayagupd Claro que é uma definição, mas é de um tutorial, não de uma especificação.
Marquês de Lorne
4

A porta e o soquete podem ser comparados à agência bancária.

O número do edifício do "Banco" é análogo ao endereço IP. Um banco possui seções diferentes, como:

  1. Departamento de conta poupança
  2. Departamento de empréstimos pessoais
  3. Departamento de empréstimos à habitação
  4. Departamento de queixas

Portanto, 1 (departamento de conta poupança), 2 (departamento de empréstimo pessoal), 3 (departamento de crédito à habitação) e 4 (departamento de queixas) são portos.

Agora, digamos que você vá abrir uma conta poupança, vá ao banco (endereço IP), depois vá ao "departamento de conta poupança" (número da porta 1) e encontre um dos funcionários que trabalha no "departamento de conta poupança" " Vamos chamá-lo de SAVINGACCOUNT_EMPLOYEE1 para abrir a conta.

SAVINGACCOUNT_EMPLOYEE1 é o seu descritor de soquete, portanto, pode haver SAVINGACCOUNT_EMPLOYEE1 para SAVINGACCOUNT_EMPLOYEEN. Todos esses são descritores de soquete.

Da mesma forma, outros departamentos terão funcionários trabalhando sob eles e são análogos ao soquete.

Shridhar410
fonte
3

Um soquete é um mecanismo de E / S de dados. Uma porta é um conceito contratual de um protocolo de comunicação . Um soquete pode existir sem uma porta. Uma porta pode existir sem um soquete específico (por exemplo, se vários soquetes estiverem ativos na mesma porta, o que pode ser permitido para alguns protocolos).

Uma porta é usada para determinar para qual soquete o receptor deve rotear o pacote, com muitos protocolos, mas isso nem sempre é necessário e a seleção do soquete de recebimento pode ser feita por outros meios - uma porta é inteiramente uma ferramenta usada pelo manipulador de protocolo no o subsistema de rede. por exemplo, se um protocolo não usa uma porta, os pacotes podem ir para todos os soquetes de escuta ou qualquer soquete.

Sander
fonte
3

Terminologia TCP / IP relativa, que é o que eu assumo, está implícita na pergunta. Em termos leigos:

Um PORTO é como o número de telefone de uma casa em particular em um código postal específico. O CEP da cidade pode ser considerado o endereço IP da cidade e todas as casas dessa cidade.

Um SOQUETE, por outro lado, é mais como um telefonema estabelecido entre telefones de um par de casas conversando entre si. Essas chamadas podem ser estabelecidas entre casas na mesma cidade ou duas casas em cidades diferentes. É esse caminho temporário estabelecido entre o par de telefones conversando entre si que é o SOCKET.

Tall Jeff
fonte
2
Um soquete é um terminal. Existe antes de uma conexão ser estabelecida (TCP) ou na ausência de uma conexão (UDP). Portanto, não é ela própria a conexão.
Marquês de Lorne
2

Em um sentido amplo, soquete - é exatamente isso, um soquete, assim como sua tomada elétrica, a cabo ou de telefone. Um ponto em que "coisas necessárias" (energia, sinal, informação) podem sair e entrar. Esconde muitas coisas detalhadas, o que não é necessário para o uso das "coisas necessárias". Na linguagem do software, ele fornece uma maneira genérica de definir um mecanismo de comunicação entre duas entidades (essas entidades podem ser qualquer coisa - dois aplicativos, dois dispositivos fisicamente separados, espaço de Usuário e Kernel em um SO, etc.)

Uma porta é um discriminador de terminal. Ele diferencia um ponto final de outro. No nível da rede, ele diferencia um aplicativo de outro, para que a pilha de rede possa passar informações ao aplicativo apropriado.

Harty
fonte
2

Já foram dadas respostas teóricas a esta pergunta. Eu gostaria de dar um exemplo prático para esta pergunta, que esclarecerá sua compreensão sobre soquete e porta.

Eu achei aqui

Este exemplo orientará você no processo de conexão com um site, como o Wiley. Você abriria o navegador da web (como o Mozilla Firefox) e digite www.wiley.com na barra de endereços. Seu navegador da web usa um servidor DNS (Sistema de Nomes de Domínio) para procurar o nome www.wiley.com e identificar o endereço IP. Para este exemplo, o endereço é 192.0.2.100.

O Firefox faz uma conexão com o endereço 192.0.2.100 e a porta na qual o servidor da camada de aplicativos está operando. O Firefox sabe qual porta esperar, porque é uma porta bem conhecida. A porta conhecida para um servidor web é a porta TCP 80.

O soquete de destino que o Firefox tenta conectar é gravado como socket: port ou, neste exemplo, 192.0.2.100:80. Este é o lado do servidor da conexão, mas o servidor precisa saber para onde enviar a página da web que você deseja visualizar no Mozilla Firefox, para que você também tenha um soquete para o lado do cliente da conexão.

A conexão do cliente é composta pelo seu endereço IP, como 192.168.1.25, e um número de porta dinâmica escolhido aleatoriamente. O soquete associado ao Firefox se parece com 192.168.1.25:49175. Como os servidores da Web operam na porta TCP 80, esses dois soquetes são soquetes TCP, enquanto que se você estivesse se conectando a um servidor operando em uma porta UDP, os soquetes do servidor e do cliente seriam soquetes UDP.

Omkar Ramtekkar
fonte
Citação de muito baixa qualidade. O terceiro parágrafo usa incorretamente a palavra 'soquete' como se ela significasse 'endereço IP'. Não faz.
Marquês de Lorne
2

Socket é uma abstração fornecida pelo kernel para aplicativos do usuário para E / S de dados. Um tipo de soquete é definido pelo protocolo de manipulação, comunicação IPC etc. Portanto, se alguém criar um soquete TCP, ele poderá fazer manipulações como ler dados no soquete e gravar dados nele por métodos simples e o protocolo de nível mais baixo, como conversões TCP e o encaminhamento de pacotes para protocolos de rede de nível inferior é feito pela implementação específica do soquete no kernel. A vantagem é que o usuário não precisa se preocupar em lidar com nitigridades específicas do protocolo e deve apenas ler e gravar dados no soquete como um buffer normal. O mesmo acontece no caso do IPC, o usuário apenas lê e grava dados no soquete e o kernel lida com todos os detalhes de nível inferior com base no tipo de soquete criado.

A porta juntamente com o IP é como fornecer um endereço para o soquete, embora não seja necessário, mas ajuda nas comunicações da rede.

Navneet Singh
fonte
2

Uma única porta pode ter um ou mais soquetes conectados com IPs externos diferentes, como uma tomada elétrica múltipla.

  TCP    192.168.100.2:9001     155.94.246.179:39255   ESTABLISHED     1312
  TCP    192.168.100.2:9001     171.25.193.9:61832     ESTABLISHED     1312
  TCP    192.168.100.2:9001     178.62.199.226:37912   ESTABLISHED     1312
  TCP    192.168.100.2:9001     188.193.64.150:40900   ESTABLISHED     1312
  TCP    192.168.100.2:9001     198.23.194.149:43970   ESTABLISHED     1312
  TCP    192.168.100.2:9001     198.49.73.11:38842     ESTABLISHED     1312
hóspede
fonte
2

Socket é uma abstração SW do terminal de rede, usado como interface para o aplicativo. Em Java, C # é representado por objeto, no Linux, Unix, é um arquivo.

Port é apenas uma propriedade de um soquete que você especificou se deseja estabelecer uma comunicação. Para receber o pacote de um soquete, é necessário vinculá-lo à porta local específica e à NIC (com endereço IP local) ou a todas as NICs (INADDR_ANY é especificado na chamada de ligação). Para enviar pacotes, você deve especificar a porta e o IP do soquete remoto.

Dražen G.
fonte
1

Um soquete é basicamente um ponto de extremidade para comunicação em rede, consistindo em pelo menos um endereço IP e uma porta. No Java / C #, um soquete é uma implementação de nível superior de um lado de uma conexão bidirecional.

Além disso, uma definição na documentação Java .

Erik van Brakel
fonte
No Java Turorial, você quer dizer.
Marquês de Lorne
1

Porta:

Uma porta pode se referir a um ponto de conexão físico para dispositivos periféricos, como portas seriais, paralelas e USB. O termo porta também se refere a determinados pontos de conexão Ethernet, como os de um hub, switch ou roteador.

Soquete:

Um soquete representa uma conexão única entre dois aplicativos de rede. Esses dois aplicativos são executados nominalmente em computadores diferentes, mas os soquetes também podem ser usados ​​para comunicação entre processos em um único computador. Os aplicativos podem criar vários soquetes para comunicação entre si. Os soquetes são bidirecionais, o que significa que ambos os lados da conexão são capazes de enviar e receber dados.

balaweblog
fonte
Uma porta TCP ou UDP também não se refere a nada físico ou a pontos de conexão Ethernet. Você não respondeu à pergunta.
Marquês de Lorne
1

Uma porta indica um ponto de extremidade de comunicação nos transportes TCP e UDP para o protocolo de rede IP. Um soquete é uma abstração de software para um terminal de comunicação comumente usado em implementações desses protocolos (API de soquete). Uma implementação alternativa é a API XTI / TLI.

Veja também:

Stevens, WR 1998, UNIX Programação de rede: APIs de rede: Sockets e XTI; Volume 1, Prentice Hall.
Stevens, WR, 1994, TCP / IP Illustrated, Volume 1: The Protocols, Addison-Wesley.

VoidPointer
fonte