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

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

Resumo

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 atendimento.

Uma porta é um identificador de virtualização que define um ponto de extremidade de serviço (como distinto de um identificador de session de ponto de extremidade de instância de serviço, também conhecido como identificador de session).

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

Pode haver conexões simultâneas para um terminal de serviço , porque uma conexão é identificada pelos pontos de extremidade 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 escuta para uma determinada combinação de endereço / porta .

Exposição

Esta foi uma questão interessante que me obrigou a reexaminar uma série de coisas que eu pensava que sabia de dentro para fora. Você pensaria que um nome como “socket” seria autoexplicativo: foi obviamente escolhido para evocar imagens do endpoint no qual você conecta um cabo de rede, existindo paralelos funcionais fortes. No entanto, no jargão da rede, a palavra “socket” carrega tanta bagagem que um reexame cuidadoso é necessário.

No sentido mais amplo possível, uma porta é um ponto de input ou saída. Embora não seja usado em um contexto de rede, a palavra em francês significa literalmente porta ou gateway , enfatizando ainda mais o fato de que os portos são pontos de extremidade de transporte, sejam eles de dados ou grandes contêineres de aço.

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

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

Uma conexão TCP é definida por dois terminais aka sockets .

Um terminal (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 depois).

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

É o par de sockets (a tupla 4 consistindo do 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 1 do TCP-IP , W. Richard Stevens)

Na maioria das linguagens derivadas de C, conexões TCP são estabelecidas e manipuladas usando methods em uma instância de uma class Socket. Embora seja comum operar em um nível mais alto de abstração, geralmente uma instância de uma class NetworkStream, isso geralmente expõe uma referência a um object de soquete. Para o codificador, esse object de soquete parece representar a conexão porque a conexão é criada e manipulada usando methods do object 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 nó de extremidade para o construtor TcpClient, ele usará padrões – de uma forma ou de outra, o nó de extremidade local é definido. Em seguida, você chama o método Connect na instância criada. Este método requer um parâmetro que descreva o outro ponto final.

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

Tendo feito muita leitura e pensando, agora estou convencido de que faria muito mais sentido ter uma class TcpConnection com um construtor que recebesse dois argumentos, LocalEndpoint e RemoteEndpoint . Você provavelmente 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 seria reforçada em outros aspectos também. Um soquete não é identificado pela combinação de endereço IP e porta:

[…] O TCP desmultiplexa os segmentos de input usando todos os quatro valores que compõem 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 recebe um segmento de input, observando 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 input é aquele no estado de escuta. (p255, Volume Ilustrado do TCP-IP 1 , W. Richard Stevens)

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

Hagrawal não acredita em mim (veja os comentários), então aqui está uma amostra real. Eu conectei um navegador da Web a http://dilbert.com e, em seguida, executei o 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.92.236:80

  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 sockets com a combinação endereço / porta 207.38.110.62:80 e outros dois com a combinação endereço / porta 54.252.94.236:80 .

Acho que o mal-entendido de Hagrawal surge do meu uso muito cuidadoso da palavra “identifica”. Quero dizer “completamente, inequivocamente e exclusivamente identifica”. No exemplo acima, existem dois pontos finais com a combinação endereço / porta 54.252.94.236:80 . Se tudo que você tem é endereço e porta, você não tem informações suficientes para separar esses sockets. Não é informação suficiente para identificar um socket.

Termo aditivo

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

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

Essa definição de soquete não é útil de uma perspectiva de programação porque não é o mesmo que um object de soquete, que é o terminal 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 Ilustrado 1 do TCP-IP 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

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, o que significa um gate lógico em um dispositivo. Cada 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.

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

Uma porta representa um ponto final ou “canal” para comunicações de rede. Os números de porta permitem que aplicativos diferentes no mesmo computador utilizem resources de rede sem interferir uns com os outros. Os números de porta aparecem mais comumente na programação de rede, particularmente na programação de soquete. Às vezes, porém, os números das portas são 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 usado pelo navegador da Web para se conectar ao servidor da Web. Normalmente, um site usa o número de porta 80 e esse número não precisa ser incluído com o URL (embora possa ser).

Na rede IP, os números de porta podem, teoricamente, variar de 0 a 65535. No entanto, 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 aqueles em um hub, switch ou roteador.

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

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

Primeiramente, acho que devemos começar com um pouco de compreensão do que constitui a obtenção de um pacote de A para 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. Há alguns importantes, que abordaremos aqui:

  • A camada de enlace 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 faz a transmissão. Ele fala sobre endereços MAC e sabe como encontrar hosts com base em seu endereço MAC (hardware), mas nada mais.
  • A camada de rede é a camada que permite transportar dados entre máquinas e limites físicos, como dispositivos físicos. A camada de rede deve essencialmente suportar um mecanismo baseado em endereço adicional que se relacione de alguma forma ao endereço físico; digite o Protocolo da Internet (IPv4). Um endereço IP pode obter seu pacote de A para B pela Internet, mas não sabe nada sobre como atravessar 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 obtêm 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, de forma que é possível deduzir se os pacotes foram perdidos.

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

O mesmo acontece com o UDP e outros protocolos da camada de transporte. Eles tecnicamente não precisam apresentar portas, mas essas portas fornecem uma maneira de 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 um endereço de origem e uma porta e um endereço de destino. Isso é para que, em qualquer session, o aplicativo de destino possa responder, assim como receber, da origem.

Portanto, as portas são essencialmente uma maneira obrigatória de permitir que várias conexões simultâneas compartilhem o mesmo endereço.

Agora, precisamos dar uma olhada em como você se comunica de um ponto de vista do aplicativo para o mundo exterior. Para fazer isso, você precisa perguntar ao seu sistema operacional e, como a maioria dos SOs suportam a maneira de fazer as coisas do Berkeley Sockets, vemos que podemos criar sockets 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 estruturas de sockaddr , vamos especificar nosso porto e bam! Tarefa concluída! Bem, quase, exceto:

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

também é possível. Urgh, isso é uma chave de fenda nos trabalhos!

Ok, na verdade não aconteceu. Tudo o que precisamos fazer é chegar a 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. Então, tcp port 80, stackoverflow.com é um soquete de internet.
  • Um soquete unix é um endpoint 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, no nosso esquema,

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

Então, realmente uma porta é um subconjunto dos requisitos para formar uma tomada de internet. Infelizmente, acontece que o significado da palavra socket foi aplicado a várias ideias diferentes. Então eu sinceramente aconselho você a nomear seu próximo socket de projeto, apenas para aumentar a confusão;)

Com alguma analogia

Embora muita coisa técnica já seja dada acima para sockets … Eu gostaria de adicionar minha resposta, apenas no caso, se alguém ainda não pudesse sentir a diferença entre ip, porta e sockets

Considere um servidor S ,

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

então

Endereço IP informa -> quem? é aquele servidor de chat ‘S’ que X, Y, Z querem entrar em contato

ok, você tem “quem é o servidor”

mas suponha que o servidor ‘S’ esteja fornecendo alguns outros serviços para outras pessoas, digamos, ‘S’ fornece serviços de armazenamento para a pessoa A, B, C

então

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

ok .., você faz servidor para vir a saber que ‘serviço de chat’ é o que você quer e não o armazenamento

mas

você é três e o servidor pode querer identificar todos os três de forma diferente

lá 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 🙂

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 flunk rede 101?)

Parece haver um monte de respostas igualando socket com a conexão entre 2 PC’s .. o que eu acho que é absolutamente incorreto. Um soquete sempre foi o terminal em 1 PC, que pode ou não estar conectado – com certeza já usamos todos os ouvintes ou sockets UDP * em algum momento. A parte importante é que é endereçável e ativa. Enviar uma mensagem para 1.1.1.1:1234 provavelmente não funcionará, pois não há nenhum soquete definido para esse terminal.

Sockets são específicos do protocolo – assim, a implementação da exclusividade que o TCP / IP e o UDP / IP usam * (ipaddress: port) é diferente de, por exemplo, IPX (Network, Node e … ahem, socket – mas um diferente socket do que se entende pelo termo “socket” geral. Os números de socket IPX são equivalentes às portas IP). Mas todos eles oferecem um endpoint endereçável exclusivo.

Como o IP se tornou o protocolo dominante, uma porta (em termos de rede) tornou-se sinônima 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 terminais já foi criado. No entanto, ainda nos referimos a sockets UDP como o endpoint. As funções da API deixam claro que ambas são apenas tipos diferentes de sockets – SOCK_DGRAM é UDP (apenas envia uma mensagem) e SOCK_STREAM é TCP (criando um circuito virtual).

  • Tecnicamente, o header IP contém o endereço IP e o protocolo no topo do IP (UDP ou TCP) contém o número da porta. Isto 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).

Breve breve resposta.

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, permitindo que um programa se comunique com outros programas ou processos, na Internet ou localmente.

Geralmente você vai ter um monte de teórico, 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. Este 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.

Espero que isso ajude. Obrigado.

Eles são termos de dois domínios diferentes: ‘port’ é um conceito de rede TCP / IP, ‘socket’ é uma coisa de API (programação). Um ‘socket’ é feito (em código) tomando 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.

Depois de ler as excelentes respostas aprovadas, descobri que o seguinte ponto precisava de ênfase para mim, um recém-chegado à programação de rede:

As conexões TCP-IP são caminhos bidirecionais conectando uma combinação de endereço: porta com outro endereço: combinação de porta. Portanto, sempre que você abrir uma conexão da sua máquina local para uma porta em um servidor remoto (por exemplo, http://www.google.com:80), você também está associando um novo número de porta à sua máquina com a 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 examinar 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 ... 

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: {protocol, local-address, local-process} onde o processo local é identificado por um número de porta.

No conjunto de TCP / IP, por exemplo:

{tcp, 193.44.234.3, 12345}

Uma conversa é o elo de comunicação entre dois processos, descrevendo assim uma associação entre dois. Uma associação é a tupla 5 que especifica completamente os dois processos que compõem uma conexão: {protocol, local-address, local-process, foreign-address, foreign-process}

No conjunto de 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 é: {protocol, local-address, local-process}

ou

{protocol, foreign-address, foreign-process}

que especificam cada metade de uma conexão.

A meia associação também é chamada de socket ou endereço de transporte. Ou seja, um soquete é um ponto final para comunicação que pode ser nomeado e endereçado em uma rede. A interface de 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 UNIX 4.2BSD. Embora não tenha sido padronizado, tornou-se um padrão de fato da indústria.

Um endereço de soquete é um endereço IP e um 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 sockets são ligados juntos.

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 uns com os outros. O Jeff alto tinha uma ótima analogia de telefone que não era perfeita, então decidi consertar:

  • ip e porta ~ número de telefone
  • dispositivo soquete ~ telefone
  • conexão ~ telefonema
  • estabelecendo conexão ~ chamando um número
  • processos, aplicações remotas ~ pessoas
  • mensagens ~ discurso

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 é ligado a um número de porta para que a camada TCP possa identificar o aplicativo para o qual os dados serão enviados.

Um soquete é uma estrutura no seu software. É mais ou menos um arquivo; tem operações como ler e escrever. Não é uma coisa física; É uma maneira de o seu software se referir a coisas físicas.

Uma porta é uma coisa parecida com um dispositivo. Cada host possui uma ou mais redes (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 a alocação de um dispositivo para E / S do sistema de arquivos. Quando a porta é alocada, nenhum outro soquete pode se conectar a essa porta. A porta será liberada quando o soquete for fechado.

Dê uma olhada na terminologia TCP / IP .

Um aplicativo consiste em um par de processos que se comunicam pela rede (par cliente-servidor). Esses processos enviam e recebem mensagens de e para a rede por meio de uma interface de software chamada socket . Considerando a analogia apresentada no livro “Redes de Computadores: Top Down Approach”. Há uma casa que quer se comunicar com outra casa. Aqui, house é análogo a um processo e porta a um soquete. O processo de envio pressupõe que existe uma infraestrutura no outro lado da porta que transportará os dados para o destino. Quando a mensagem chega 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 sockets fazem parte da camada de transporte, que fornece comunicação lógica aos aplicativos. Isso significa que, do ponto de vista do aplicativo, ambos os hosts são conectados diretamente uns aos outros, embora existam vários roteadores e / ou switches entre eles. Assim, 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 nos hosts e não nos roteadores intermediários.
Portas fornecem meios de endereçamento interno para uma máquina. O objective principal é permitir que vários processos enviem e recebam dados pela rede sem interferir em outros processos (seus dados). Todos os sockets 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. Este trabalho de entregar os dados em um segmento de camada de transporte para o soquete correto é chamado de multiplexação . Os dados do segmento são então encaminhados para o processo anexado ao soquete.

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

Um PORT é como o número de telefone de uma determinada casa em um CEP específico. O CEP da cidade poderia ser considerado o endereço IP da cidade e todas as casas daquela cidade.

Um SOCKET, 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.

Um soquete é um ponto final de comunicação. Um soquete não está diretamente relacionado à família de protocolos TCP / IP, ele pode ser usado com qualquer protocolo suportado por seu sistema. A API do soquete C espera que você obtenha primeiro um object de soquete em branco do sistema que possa ser vinculado a um endereço de soquete local (para recuperar diretamente o tráfego de input para protocolos sem conexão ou aceitar solicitações de conexão de input para protocolos orientados à conexão) ou que você pode se conectar a um endereço de soquete remoto (para qualquer tipo de protocolo). Você pode até fazer os dois se quiser controlar ambos, o endereço do soquete local ao qual um soquete está vinculado e o endereço do soquete remoto ao qual um soquete está conectado. Para protocolos sem conexão conectando um soquete é mesmo opcional, mas se você não fizer isso, você terá que também passar o endereço de destino com todos os pacotes que você deseja enviar através do soquete como de outra forma o soquete saberia onde enviar esses dados para? A vantagem é que você pode usar um único soquete para enviar pacotes para diferentes endereços de soquete. Uma vez que você tenha seu soquete configurado e talvez até conectado, considere que ele seja um canal de comunicação bidirecional. Você pode usá-lo para passar dados para algum destino e algum destino pode usá-lo para passar os dados de volta 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 apenas determinados protocolos da pilha de protocolos TCP / IP possuem. Pacotes TCP e UDP possuem portas. Uma porta é apenas um número simples. A combinação da porta de origem e da porta de destino identifica um canal de comunicação entre dois hosts. Por exemplo, você pode ter um servidor que deve ser ambos, um servidor HTTP simples e um servidor FTP simples. Se agora um pacote chega para o endereço desse servidor, como ele saberia se isso é um pacote para o servidor HTTP ou FTP? Bem, ele saberá como 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, ele será para o servidor HTTP e não para o servidor FTP. Além disso, o pacote tem uma porta de origem, pois sem essa porta de origem, um servidor só poderia ter uma conexão com um endereço IP por vez. A porta de origem possibilita que um servidor distinga conexões idênticas: todas elas têm a mesma porta de destino, por exemplo, porta 80, o mesmo IP de destino, sempre o mesmo endereço de servidor e o mesmo IP de origem, pois todos são da mesma cliente, mas como eles têm portas de origem diferentes, o servidor pode distingui-los um do outro. E quando o servidor envia de volta as respostas, ele o fará para a porta da qual a solicitação veio, assim o cliente também pode distinguir respostas diferentes que recebe.

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. A port can exist witout a specific socket (eg if several sockets are active on the same port, which may be allowed for some protocols).

A port is used to determine which socket the receiver should route the packet to, with many protocols, but it is not always required and the receiving socket selection can be done by other means – a port is entirely a tool used by the protocol handler in the network subsystem. eg if a protocol does not use a port, packets can go to all listening sockets or any socket.

In a broad sense, Socket – is just that, a socket, just like your electrical, cable or telephone socket. A point where “requisite stuff” (power, signal, information) can go out and come in from. It hides a lot of detailed stuff, which is not required for the use of the “requisite stuff”. In software parlance, it provides a generic way of defining a mechanism of communication between two entities (those entities could be anything – two applications, two physically separate devices, User & Kernel space within an OS, etc)

A Port is an endpoint discriminator. It differentiates one endpoint from another. At networking level, it differentiates one application from another, so that the networking stack can pass on information to the appropriate application.

Already theoretical answers have been given to this question. I would like to give a practical example to this question, which will clear your understanding about Socket and Port.

I found it here

This example will walk you thru the process of connecting to a website, such as Wiley. You would open your web browser (like Mozilla Firefox) and type http://www.wiley.com into the address bar. Your web browser uses a Domain Name System (DNS) server to look up the name http://www.wiley.com to identify its IP address is. For this example, the address is 192.0.2.100.

Firefox makes a connection to the 192.0.2.100 address and to the port where the application layer web server is operating. Firefox knows what port to expect because it is a well-known port . The well-known port for a web server is TCP port 80.

The destination socket that Firefox attempts to connect is written as socket:port, or in this example, 192.0.2.100:80. This is the server side of the connect, but the server needs to know where to send the web page you want to view in Mozilla Firefox, so you have a socket for the client side of the connection also.

The client side connection is made up of your IP address, such as 192.168.1.25, and a randomly chosen dynamic port number. The socket associated with Firefox looks like 192.168.1.25:49175. Because web servers operate on TCP port 80, both of these sockets are TCP sockets, whereas if you were connecting to a server operating on a UDP port, both the server and client sockets would be UDP sockets.

Socket is an abstraction provided by kernel to user applications for data I/O. A socket type is defined by the protocol its handling, an IPC communication etc. So if somebody creates a TCP socket he can do manipulations like reading data to socket and writing data to it by simple methods and the lower level protocol handling like TCP conversions and forwarding packets to lower level network protocols is done by the particular socket implementation in the kernel. The advantage is that user need not worry about handling protocol specific nitigrities and should just read and write data to socket like a normal buffer. Same is true in case of IPC, user just reads and writes data to socket and kernel handles all lower level details based on the type of socket created.

Port together with IP is like providing an address to the socket, though its not necessary, but it helps in network communications.

A single port can have one or more sockets connected with different external IP’s like a multiple electrical outlet.

  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 

Port and socket can be compared to the Bank Branch.

The building number of the “Bank” is analogous to IP address . Bank has got different sections like :1) SAVINGS ACCOUNT DEPARTMENT 2) PERSONAL LOAN DEPARTMENT 3) HOME LOAN DEPARTMENT 4) GRIEVANCE DEPARTMENT .

so 1(SAVINGS ACCOUNT DEPARTMENT) ,2 ( PERSONAL LOAN DEPARTMENT) ,3(HOME LOAN DEPARTMENT) and 4(GRIEVANCE DEPARTMENT) are Ports.

Now let us say you go to open a savings account , you go to Bank(IP address) then you go to “SAVINGS ACCOUNT DEPARTMENT” (Port number 1) then you meet one of the employee working under “SAVINGS ACCOUNT DEPARTMENT” let us call him as SAVINGACCOUNT_EMPLOYEE1 for opening account .

SAVINGACCOUNT_EMPLOYEE1 is your socket descriptor , so there may be SAVINGACCOUNT_EMPLOYEE1 to SAVINGACCOUNT_EMPLOYEEN these are all socket descriptors.

Likewise other departments will be having employess working under them and they are analogous to socket.

Espero que isto ajude !!

A socket is basically an endpoint for network communication, consisting of at least an IP-address and a port. In Java/C# a socket is a higher level implementation of one side of a two-way connection.

Also, a definition in the Java documentation .

Porta:

A port can refer to a physical connection point for peripheral devices such as serial, parallel, and USB ports. The term port also refers to certain Ethernet connection points, s uch as those on a hub, switch, or router.

Socket:

A socket represents a single connection between two network applications. These two applications nominally run on different computers, but sockets can also be used for interprocess communication on a single computer. Applications can create multiple sockets for communicating with each other. Sockets are bidirectional, meaning that either side of the connection is capable of both sending and receiving data.

I know that there are lot of explanations. But, there is one more easy way to understand with practical example. We all can connect to HTTP port 80, but does it mean only one user can connect to that port at a time?. The answer is obviously ‘no’. Multiple users for multiple purposes can access HTTP port 80 but they still get proper response they are waiting for, from the server, can’t they?. Now think about it for a minute, how?. Yes you are correct, its IP address that uniquely identifies different users who contacts for different purposes. If you would have read the previous answers before reaching here, you would know that IP address is a part of information that socket consists. Think about it, is it possible to have a communication without sockets?. The answer is ‘Yes’ but you cannot run more than one application in a port but we know that we are not a ‘Dump’ switch that runs on just hardware.

A port denotes a communication endpoint in the TCP and UDP transports for the IP network protocol. A socket is a software abstraction for a communication endpoint commonly used in implementations of these protocols (socket API). An alternative implementation is the XTI/TLI API.

Veja também:

Stevens, WR 1998, UNIX Network Programming: Networking APIs: Sockets and XTI; Volume 1, Prentice Hall.
Stevens, WR, 1994, TCP/IP Illustrated, Volume 1: The Protocols, Addison-Wesley.

A port is an entity that is used by networking protocols to attain access to connected hosts. Ports could be application-specific or related to a certain communication medium. Different protocols use different ports to access the hosts, like HTTP uses port 80 or FTP uses port 23. You can assign user-defined port numbers in your application, but they should be above 1023.

Ports open up the connection to the required host while sockets are an endpoint in an inter-network or an inter-process communication. Sockets are assigned by APIs(Application Programming Interface) by the system.

A more subtle difference can be made saying that, when a system is rebooted ports will be present while the sockets will be destroyed.