¿Cuál es la diferencia entre un puerto y un socket?

928

Esta fue una pregunta planteada por uno de los ingenieros de software de mi organización. Estoy interesado en la definición más amplia.

Richard Dorman
fuente
19
Solo para reiterar, los sockets no se limitan a la red IO. Están disponibles en todo tipo de situaciones para transmitir datos entre varias aplicaciones.
Oli

Respuestas:

977

Resumen

Un socket TCP es una instancia de punto final definida por una dirección IP y un puerto en el contexto de una conexión TCP particular o del estado de escucha.

Un puerto es un identificador de virtualización que define un punto final de servicio (a diferencia de un punto final de instancia de servicio, también conocido como identificador de sesión).

Un socket TCP no es una conexión , es el punto final de una conexión específica.

Puede haber conexiones concurrentes a un punto final de servicio , ya que una conexión se identifica por sus puntos finales locales y remotos , lo que permite enrutar el tráfico a una instancia de servicio específica.

Solo puede haber un socket de escucha para una combinación de dirección / puerto dada .

Exposición

Esta fue una pregunta interesante que me obligó a volver a examinar una serie de cosas que creía saber de adentro hacia afuera. Se podría pensar que un nombre como "socket" se explica por sí mismo: obviamente se eligió para evocar imágenes del punto final en el que se conecta un cable de red, habiendo fuertes paralelos funcionales. Sin embargo, en el lenguaje de la red, la palabra "socket" lleva tanto equipaje que es necesario un reexamen cuidadoso.

En el sentido más amplio posible, un puerto es un punto de entrada o salida. Aunque no se utiliza en un contexto de red, la palabra francesa porte literalmente significa puerta o puerta de enlace , enfatizando aún más el hecho de que los puertos son puntos finales de transporte, ya sea que envíe datos o grandes contenedores de acero.

A los fines de esta discusión, limitaré la consideración al contexto de las redes TCP-IP. El modelo OSI está muy bien pero nunca se ha implementado por completo, y mucho menos se ha implementado en condiciones de alto tráfico y alto estrés.

La combinación de una dirección IP y un puerto se conoce estrictamente como un punto final y, a veces, se denomina socket. Este uso se origina con RFC793, la especificación TCP original.

Una conexión TCP se define por dos puntos finales, también conocidos como sockets .

Un punto final (socket) se define por la combinación de una dirección de red y un identificador de puerto . Tenga en cuenta que la dirección / puerto no identifica completamente un socket (más sobre esto más adelante).

El propósito de los puertos es diferenciar múltiples puntos finales en una dirección de red dada. Se podría decir que un puerto es un punto final virtualizado. Esta virtualización posibilita múltiples conexiones concurrentes en una única interfaz de red.

Es el par de sockets (la tupla de 4 consta de la dirección IP del cliente, el número de puerto del cliente, la dirección IP del servidor y el número de puerto del servidor) que especifica los dos puntos finales que identifican de forma única cada conexión TCP en Internet. ( TCP-IP Ilustrado Volumen 1 , W. Richard Stevens)

En la mayoría de los lenguajes derivados de C, las conexiones TCP se establecen y manipulan utilizando métodos en una instancia de una clase Socket. Aunque es común operar en un nivel superior de abstracción, típicamente una instancia de una clase NetworkStream, esto generalmente expone una referencia a un objeto de socket. Para el codificador, este objeto de socket parece representar la conexión porque la conexión se crea y manipula utilizando métodos del objeto de socket.

En C #, para establecer una conexión TCP (a un escucha existente) primero debe crear un TcpClient . Si no especifica un punto final para el constructor TcpClient , utiliza valores predeterminados: de una forma u otra se define el punto final local. Luego invocas el método Connect en la instancia que has creado. Este método requiere un parámetro que describa el otro punto final.

Todo esto es un poco confuso y te lleva a creer que un zócalo es una conexión, que es un bloqueo. Estaba trabajando bajo esta mala interpretación hasta que Richard Dorman hizo la pregunta.

Después de leer y pensar mucho, ahora estoy convencido de que tendría mucho más sentido tener una clase TcpConnection con un constructor que tome dos argumentos, LocalEndpoint y RemoteEndpoint . Probablemente podría admitir un argumento único RemoteEndpoint cuando los valores predeterminados son aceptables para el punto final local. Esto es ambiguo en computadoras con múltiples hogares, pero la ambigüedad se puede resolver utilizando la tabla de enrutamiento seleccionando la interfaz con la ruta más corta al punto final remoto.

La claridad también mejoraría en otros aspectos. Un socket no se identifica por la combinación de dirección IP y puerto:

[...] TCP demultiplexa los segmentos entrantes utilizando los cuatro valores que comprenden las direcciones locales y extranjeras: dirección IP de destino, número de puerto de destino, dirección IP de origen y número de puerto de origen. TCP no puede determinar qué proceso obtiene un segmento entrante mirando solo el puerto de destino. Además, el único de los [diversos] puntos finales en [un número de puerto dado] que recibirá las solicitudes de conexión entrantes es el que está en estado de escucha. (p255, TCP-IP Ilustrado Volumen 1 , W. Richard Stevens)

Como puede ver, no solo es posible, sino que es muy probable que un servicio de red tenga numerosos sockets con la misma dirección / puerto, pero solo un socket de escucha en una combinación particular de dirección / puerto. Las implementaciones de biblioteca típicas presentan una clase de socket, una instancia de la cual se utiliza para crear y administrar una conexión. Esto es extremadamente desafortunado, ya que causa confusión y ha llevado a una fusión generalizada de los dos conceptos.

Hagrawal no me cree (ver comentarios), así que aquí hay una muestra real. Conecté un navegador web a http://dilbert.com y luego corrí netstat -an -p tcp. Las últimas seis líneas de la salida contienen dos ejemplos del hecho de que la dirección y el puerto no son suficientes para identificar de forma exclusiva un socket. Hay dos conexiones distintas entre 192.168.1.3 (mi estación de trabajo) y 54.252.94.236:80 (el 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 un socket es el punto final de una conexión, hay dos sockets con la combinación de dirección / puerto 207.38.110.62:80y dos más con la combinación de dirección / puerto 54.252.94.236:80.

Creo que el malentendido de Hagrawal surge de mi uso muy cuidadoso de la palabra "identifica". Me refiero a "completamente, inequívoca y únicamente identifica". En el ejemplo anterior, hay dos puntos finales con la combinación de dirección / puerto 54.252.94.236:80. Si todo lo que tiene es dirección y puerto, no tiene suficiente información para distinguir estos sockets. No es suficiente información para identificar un socket.

Apéndice

El párrafo dos de la sección 2.7 de RFC793 dice

Una conexión está completamente especificada por el par de enchufes en los extremos. Un conector local puede participar en muchas conexiones a diferentes conectores externos.

Esta definición de socket no es útil desde una perspectiva de programación porque no es lo mismo que un objeto de socket , que es el punto final de una conexión en particular. Para un programador, y la mayoría de la audiencia de esta pregunta son programadores, esta es una diferencia funcional vital.

Referencias

  1. TCP-IP Ilustrado Volumen 1 Los Protocolos , W. Richard Stevens, 1994 Addison Wesley

  2. RFC793 , Instituto de Ciencias de la Información, Universidad del Sur de California para DARPA

  3. RFC147 , The Definition of a Socket, Joel M. Winett, Lincoln Laboratory

Peter Wone
fuente
66
Quizás, una analogía del mundo real con las palabras clave socket y port ayudaría a quienes votaron a favor de la pregunta. Sigue siendo una gran explicación!
rohitverma
55
@rationalcoder - Lee la respuesta completa. Hay una diferencia entre ser definido por algo y ser identificado por él. Por ejemplo, las instancias de una clase están definidas por la clase. Están parcialmente pero no completamente identificados por él.
Peter Wone
66
No voté porque no estoy de acuerdo con esta declaración: " Un socket no se identifica por la combinación de la dirección IP y el puerto: " .. Lea TCP RFC - tools.ietf.org/html/rfc793 .. Está muy claro que socket es combinación de IP y el puerto, si sabes IP y el puerto que se ha identificado un enchufe o punto final, si sabes par de socket es decir, el cliente y el servidor puerto de puerto IP + IP + que se ha identificado una conexión única ..
hagrawal
66
"En la muestra anterior hay dos puntos finales con la combinación de dirección / puerto 54.252.94.236:80. Si todo lo que tiene es dirección y puerto, no tiene suficiente información para distinguir estos sockets. No es suficiente información para identificar un enchufe." ¿No son los mismos sockets, sino diferentes conexiones, entre las dos conexiones tiene 3 sockets, 2 locales y un mismo socket de servidor al que está conectado; o de hecho son dos enchufes diferentes? No habría que distinguirlos porque son iguales, pero para distinguir las conexiones necesitaría los diferentes enchufes locales.
Andrew Clavin
66
-1 Tu respuesta es simplemente incorrecta. Usted: "Un socket TCP es ... el punto final de una conexión específica ". RFC 793 : "un zócalo puede usarse simultáneamente en múltiples conexiones ". No estoy seguro de qué bibliotecas está usando, pero en las bibliotecas que he usado, los objetos de socket han sido definidos de manera única por una IP y un puerto y han generado objetos de conexión para cada socket remoto.
Zaz
187

Un zócalo consta de tres cosas:

  1. Una dirección IP
  2. Un protocolo de transporte
  3. Un número de puerto

Un puerto es un número entre 1 y 65535 inclusive que significa una puerta lógica en un dispositivo. Cada conexión entre un cliente y un servidor requiere un socket único.

Por ejemplo:

  • 1030 es un puerto.
  • (10.1.1.2, TCP, puerto 1030) es un socket.
RT_
fuente
80
No. Un socket consta de cinco cosas: {protocolo, dirección local, puerto local, dirección remota, puerto remoto}.
Marqués de Lorne
19
@EJP No, de nuevo. Vea la respuesta seleccionada para más información.
Kehlan Krumme
2
@KorayTugay Está en el encabezado IP. ¿Qué te hace pensar que la capa TCP no puede ver eso?
Marqués de Lorne
1
@EJP, como puedo ver en la respuesta más votada anteriormente, que un socket NO es la conexión en sí, sino que es el punto final de una conexión, entonces, ¿cómo es que puede incluir puertos locales y remotos y direcciones IP? Un zócalo representará solo un lado de la conexión, es decir, el puerto local y la dirección IP local O el puerto remoto y el acceso remoto a IP. Por favor, corrígeme si me equivoco.
RBT
77
@EJP Still RFC 793: "Un par de zócalos identifica de forma única cada conexión. Es decir, un zócalo puede usarse simultáneamente en múltiples conexiones". Si un enchufe ya constaba de cinco cosas, ¿cómo podría haber "un par de enchufes" en mi cita?
Gab 是 好人
101

Un socket representa una conexión única entre dos aplicaciones de red. Estas dos aplicaciones se ejecutan nominalmente en diferentes computadoras, pero los sockets también se pueden usar para la comunicación entre procesos en una sola computadora. Las aplicaciones pueden crear múltiples sockets para comunicarse entre sí. Los sockets son bidireccionales, lo que significa que cualquier lado de la conexión es capaz de enviar y recibir datos. Por lo tanto, se puede crear un socket teóricamente en cualquier nivel del modelo OSI desde 2 en adelante. Los programadores a menudo usan sockets en la programación de red, aunque indirectamente. Las bibliotecas de programación como Winsock ocultan muchos de los detalles de bajo nivel de la programación de sockets. Los enchufes se han utilizado ampliamente desde principios de la década de 1980.

Un puerto representa un punto final o "canal" para las comunicaciones de red. Los números de puerto permiten que diferentes aplicaciones en la misma computadora utilicen recursos de red sin interferir entre sí. Los números de puerto aparecen más comúnmente en la programación de red, particularmente en la programación de sockets. A veces, sin embargo, los números de puerto se hacen visibles para el usuario casual. Por ejemplo, algunos sitios web que una persona visita en Internet usan una URL como la siguiente:

http://www.mairie-metz.fr:8080/ En este ejemplo, el número 8080 se refiere al número de puerto utilizado por el navegador web para conectarse al servidor web. Normalmente, un sitio web usa el número de puerto 80 y este número no necesita ser incluido con la URL (aunque puede serlo).

En las redes IP, los números de puerto pueden variar teóricamente de 0 a 65535. Sin embargo, las aplicaciones de red más populares usan números de puerto en el extremo inferior del rango (como 80 para HTTP).

Nota: El término puerto también se refiere a varios otros aspectos de la tecnología de red. Un puerto puede referirse a un punto de conexión física para dispositivos periféricos como puertos serie, paralelo y USB. El término puerto también se refiere a ciertos puntos de conexión Ethernet, como los de un concentrador, conmutador o enrutador.

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

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

Galés
fuente
2
La capa 2 en el modelo OSI es una conexión entre nodos, no tiene ningún mecanismo de conexión de procesos. No creo que pueda considerar un socket existente en OSI l2.
Antonio Haley
19
Un circuito es una conexión; un zócalo es un punto final. Una conexión consta de 2 enchufes.
Mark Brackett
" Un socket representa una conexión única entre dos aplicaciones de red " . Eso no coincide con RFC 793, Protocolo de control de transmisión que explica: " Para permitir que muchos procesos dentro de un único Host utilicen las instalaciones de comunicación TCP simultáneamente, el TCP proporciona un conjunto de direcciones o puertos dentro de cada host. Concatenados con la red y las direcciones de host de la capa de comunicación de Internet, esto forma un zócalo. Un par de zócalos identifica de forma única cada conexión. "
Ron Maupin
84

Con alguna analogía

Aunque ya se han dado muchas cosas técnicas para los sockets ... Me gustaría agregar mi respuesta, por si acaso, si alguien aún no pudiera sentir la diferencia entre ip, port y sockets

Considere un servidor S ,

y digamos que la persona X, Y, Z necesita un servicio (por ejemplo, servicio de chat) de ese servidor S

entonces

La dirección IP le dice a -> ¿quién? es ese servidor de chat 'S' que X, Y, Z quieren contactar

bueno, tienes "quien es el servidor"

pero supongamos que el servidor 'S' también proporciona otros servicios a otras personas, digamos que 'S' brinda servicios de almacenamiento a las personas A, B, C

entonces

puerto dice ---> cual? servicio que usted (X, Y, Z) necesita, es decir, servicio de chat y no ese servicio de almacenamiento

está bien ..., haces que el servidor sepa que el "servicio de chat" es lo que quieres y no el almacenamiento

pero

son tres y el servidor puede querer identificar a los tres de manera diferente

ahí viene el zócalo

ahora socket dice -> ¿ cuál? conexión particular

es decir, digamos

enchufe 1 para persona X

enchufe 2 para persona Y

y enchufe 3 para persona Z

Espero que ayude a alguien que todavía estaba confundido :)

eRaisedToX
fuente
Entonces, ¿X, Y, Z se conectarían al mismo puerto, es decir, al mismo servicio, pero tienen diferentes enchufes en el lado del servidor? Entonces, cuando, digamos, X envía un paquete al servidor, va a decir: 'encuéntrame el socket (protocolo, IP de X, puerto de X, IP de S, puerto de S)' y envíalo a la aplicación de chat. Supongo que debe haber un enlace entre algunos objetos específicos de la aplicación y objetos de socket. Por ejemplo, cuando obtengo algunos datos del socket-1, quiero mostrarlos como un mensaje de usuario, pero la aplicación necesita saber que los mensajes del socket A son del Usuario-X.
monolito el
44

En primer lugar, creo que deberíamos comenzar con una pequeña comprensión de lo que constituye obtener un paquete de A a B.

Una definición común para una red es el uso del modelo OSI que separa una red en varias capas según el propósito. Hay algunos importantes, que cubriremos aquí:

  • La capa de enlace de datos . Esta capa es responsable de obtener paquetes de datos de un dispositivo de red a otro y está justo por encima de la capa que realmente transmite. Habla de direcciones MAC y sabe cómo encontrar hosts en función de su dirección MAC (hardware), pero nada más.
  • La capa de red es la capa que le permite transportar datos a través de máquinas y sobre límites físicos, como dispositivos físicos. La capa de red debe admitir esencialmente un mecanismo adicional basado en direcciones que se relacione de alguna manera con la dirección física; ingrese el Protocolo de Internet (IPv4). Una dirección IP puede llevar su paquete de A a B a través de Internet, pero no sabe nada sobre cómo atravesar saltos individuales. La capa anterior maneja esto de acuerdo con la información de enrutamiento.
  • La capa de transporte . Esta capa es responsable de definir la forma en que la información pasa de A a B y cualquier restricción, verificación o error en ese comportamiento. Por ejemplo, TCP agrega información adicional a un paquete, de modo que es posible deducir si se han perdido paquetes.

TCP contiene, entre otras cosas, el concepto de puertos . Estos son efectivamente puntos finales de datos diferentes en la misma dirección IP a la que se AF_INETpuede unir un conector de Internet ( ).

Como sucede, también lo hace UDP y otros protocolos de capa de transporte. Técnicamente no necesitan contar con puertos, pero estos puertos proporcionan una forma para que múltiples aplicaciones en las capas anteriores usen la misma computadora para recibir (y de hecho hacer) conexiones salientes.

Lo que nos lleva a la anatomía de una conexión TCP o UDP. Cada uno presenta un puerto y una dirección de origen, y un puerto y una dirección de destino. Esto es para que en cualquier sesión dada, la aplicación de destino pueda responder, así como recibir, de la fuente.

Por lo tanto, los puertos son esencialmente una forma obligatoria de especificación de permitir múltiples conexiones concurrentes que comparten la misma dirección.

Ahora, tenemos que echar un vistazo a cómo te comunicas desde el punto de vista de una aplicación al mundo exterior. Para hacer esto, debe preguntarle amablemente a su sistema operativo y dado que la mayoría de los sistemas operativos admiten la forma de hacer las cosas de Berkeley Sockets, vemos que podemos crear sockets que involucren puertos desde una aplicación como esta:

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

¡Excelente! Entonces, en las sockaddrestructuras, especificaremos nuestro puerto y bam. ¡Trabajo hecho! Bueno, casi, excepto:

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

También es posible. ¡Urgh, eso es una llave inglesa en proceso!

Ok, en realidad no lo ha hecho. Todo lo que tenemos que hacer es llegar a algunas definiciones apropiadas:

  • Un socket de Internet es la combinación de una dirección IP, un protocolo y su número de puerto asociado en el que un servicio puede proporcionar datos. Entonces, el puerto TCP 80, stackoverflow.com es un socket de internet.
  • Un socket Unix es un punto final IPC representado en el sistema de archivos, por ejemplo /var/run/database.sock.
  • Una API de socket es un método para solicitar que una aplicación pueda leer y escribir datos en un socket.

Voila! Eso arregla las cosas. Entonces en nuestro esquema entonces,

  • Un puerto es un identificador numérico que, como parte de un protocolo de capa de transporte, identifica el número de servicio que debe responder a la solicitud dada.

Entonces, realmente un puerto es un subconjunto de los requisitos para formar un socket de internet. Desafortunadamente, sucede que el significado de la palabra socket se ha aplicado a varias ideas diferentes. Por lo tanto, le recomiendo que nombre su próximo socket de proyecto, solo para agregar a la confusión;)


fuente
Es por eso que las balas no se van y no se van de Powerpoint; ¡trabajan!
Anurag Kalia
Muy buena introducción a tcp-ip y comunicación en red. Principiantes, lean esto primero.
Colin
32

Un socket = Dirección IP + un puerto (dirección numérica)
Juntos identifican un punto final para una conexión de red en una máquina. (¿Acabo de reprobar la red 101?)

Gishu
fuente
77
Creo que puerto tiene un significado más amplio que su definición.
Richard Dorman
2
Y los sockets no solo están sujetos a la pila TCP / IP. Consulte Sockets de dominio UNIX o sockets de comunicación entre procesos en general.
matthias krull
No estoy seguro de esta respuesta. Puede usar HTTP para comunicarse con otro proceso a través de sockets sin asignar un puerto.
SEF
31

En general, obtendrá muchos conceptos teóricos, pero una de las formas más fáciles de diferenciar estos dos conceptos es la siguiente:

Para obtener un servicio, necesita un número de servicio. Este número de servicio se llama puerto. Simple como eso.

Por ejemplo, el HTTP como servicio se ejecuta en el puerto 80.

Ahora, muchas personas pueden solicitar el servicio y se ha establecido una conexión del cliente-servidor. Habrá muchas conexiones. Cada conexión representa un cliente. Para mantener cada conexión, el servidor crea un socket por conexión para mantener a su cliente.

kta
fuente
¿Cada socket requiere su propio puerto?
Lunes
Increíble. La forma más sencilla de presentar un conocimiento de montaña.
Asif Mehmood
55
No estoy seguro si su afirmación: "el servidor crea un socket por conexión para mantener su cliente" es correcta.
Rushi Agrawal
1
@RushiAgrawal Entonces te sugiero que lo busques. Específicamente, ver al hombre aceptar.
Marqués de Lorne
1
Esto implica que para cada socket que el servidor crea por conexión para mantener a su cliente puede tener el mismo número de puerto (como el puerto 80 para la continuación de las conexiones HTTP) pero con diferentes direcciones IP de los clientes desde los cuales se envían las solicitudes de conexiones. ¿Correcto?
Randika Vishman
25

Parece que hay muchas respuestas que equiparan el socket con la conexión entre 2 PC ... lo que creo que es absolutamente incorrecto. Un socket siempre ha sido el punto final en 1 PC, que puede o no estar conectado, seguramente todos hemos usado escuchas o sockets UDP * en algún momento. La parte importante es que es direccionable y activo. Enviar un mensaje a 1.1.1.1:1234 no es probable que funcione, ya que no hay un socket definido para ese punto final.

Los sockets son específicos del protocolo, por lo que la implementación de la unicidad que usan tanto TCP / IP como UDP / IP * (ipaddress: port), es diferente de, por ejemplo, IPX (red, nodo y ... ejem, socket), pero es diferente socket que se entiende por el término general "socket". Los números de socket IPX son equivalentes a los puertos IP). Pero, todos ofrecen un punto final direccionable único.

Como IP se ha convertido en el protocolo dominante, un puerto (en términos de red) se ha vuelto sinónimo con un número de puerto UDP o TCP, que es una parte de la dirección del socket.

  • UDP no necesita conexión, lo que significa que nunca se crea un circuito virtual entre los 2 puntos finales. Sin embargo, todavía nos referimos a los sockets UDP como punto final. Las funciones de API dejan en claro que ambos son tipos de sockets diferentes: SOCK_DGRAMUDP (solo enviando un mensaje) y SOCK_STREAMTCP (creando un circuito virtual).

  • Técnicamente, el encabezado IP contiene la dirección IP, y el protocolo sobre IP (UDP o TCP) contiene el número de puerto. Esto hace posible tener otros protocolos (por ejemplo, ICMP que no tienen números de puerto, pero sí tienen información de direccionamiento IP).

Mark Brackett
fuente
25

Breve respuesta breve.

Un puerto puede describirse como una dirección interna dentro de un host que identifica un programa o proceso.

Un socket se puede describir como una interfaz de programación que permite que un programa se comunique con otros programas o procesos, en Internet o localmente.

Andy
fuente
3
La palabra 'interno' en la descripción del puerto me suena como 'no público'.
Jonas N
Entonces, ¿podríamos decir: Sockets se ejecuta dentro de los puertos? o Puertos corre dentro de Sockets?
Gucho Ca
@GuchoCa No podemos decir que los sockets o los puertos se ejecutan en absoluto, y mucho menos uno dentro del otro. No está claro lo que estás preguntando.
Marqués de Lorne
16

Son términos de dos dominios diferentes: 'puerto' es un concepto de la red TCP / IP, 'socket' es una cosa de API (programación). Se crea un 'socket' (en código) tomando un puerto y un nombre de host o adaptador de red y combinándolos en una estructura de datos que puede usar para enviar o recibir datos.

Roel
fuente
Para la respuesta más general, pulse "hecho tomando un puerto y un nombre de host o adaptador de red y combinándolos en un". Por ejemplo, un socket UNIX es (en código) una estructura de datos (u objeto) que puede usar para enviar o recibir datos.
Josiah Yoder
14

Estos son conceptos básicos de redes, por lo que los explicaré de una manera fácil pero comprensiva para comprender en detalle.

  • Una toma de corriente es como un teléfono (es decir, un dispositivo de comunicación de extremo a extremo)
  • IP es como su número de teléfono (es decir, la dirección de su socket)
  • El puerto es como la persona con la que desea hablar (es decir, el servicio que desea solicitar desde esa dirección)
  • Un socket puede ser un cliente o un socket de servidor (es decir, en una empresa, el teléfono de atención al cliente es un servidor, pero un teléfono en su hogar es principalmente un cliente)

Entonces, un socket en la red es un dispositivo de comunicación virtual unido a un par (ip, puerto) = (dirección, servicio).

Nota:

  • Una máquina, una computadora, un host, un móvil o una PC pueden tener múltiples direcciones, múltiples puertos abiertos y, por lo tanto, múltiples enchufes. Al igual que en una oficina, puede tener varios teléfonos con múltiples números de teléfono y varias personas para hablar.
  • La existencia de un puerto abierto / activo requiere que tenga un socket vinculado a él, porque es el socket el que hace que el puerto sea accesible. Sin embargo, puede tener puertos no utilizados por el momento.
  • También tenga en cuenta que en un socket de servidor puede vincularlo a (un puerto, una dirección específica de una máquina) o a (un puerto, todas las direcciones de una máquina), ya que en el teléfono puede conectar muchas líneas telefónicas (números de teléfono) a un teléfono o una línea telefónica específica a un teléfono y aún puede comunicarse con una persona a través de todas estas líneas telefónicas o mediante una línea telefónica específica.
  • No puede asociar (vincular) un zócalo con dos puertos como en el teléfono, por lo general, no siempre puede tener dos personas usando el mismo teléfono al mismo tiempo.
  • Avanzado: en la misma máquina no puede tener dos sockets con el mismo tipo (cliente o servidor) y el mismo puerto e ip. Sin embargo, si es un cliente, puede abrir dos conexiones, con dos sockets, a un servidor porque el puerto local en cada uno de estos sockets del cliente es diferente)

Espero que te aclare dudas

Mosab Shaheen
fuente
Es interesante ver todos estos entendimientos y analogías de sockets / ports / direcciones ip bajo esta pregunta. Y me gusta esta respuesta.
Bloodmoon
12

Después de leer las excelentes respuestas votadas, descubrí que el siguiente punto necesitaba énfasis para mí, un recién llegado a la programación en red:

Las conexiones TCP-IP son vías bidireccionales que conectan una dirección: combinación de puerto con otra dirección: combinación de puerto. Por lo tanto, cada vez que abre una conexión desde su máquina local a un puerto en un servidor remoto (por ejemplo, www.google.com:80), también está asociando un nuevo número de puerto en su máquina con la conexión, para permitir que el servidor envíe cosas de vuelta a usted, (por ejemplo, 127.0.0.1:65234). Puede ser útil usar netstat para ver las conexiones de su 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
fuente
12

Una dirección de socket es una dirección IP y un número de puerto

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

Se produce una conexión cuando 2 sockets están unidos entre sí.

Zaz
fuente
No hay tal cosa como unir dos enchufes juntos. La palabra 'obligado' significa algo más con puertos.
Marqués de Lorne el
10

Un socket es un tipo especial de identificador de archivo que utiliza un proceso para solicitar servicios de red del sistema operativo. Una dirección de socket es el triple: {protocolo, dirección local, proceso local} donde el proceso local se identifica mediante un número de puerto.

En el conjunto TCP / IP, por ejemplo:

{tcp, 193.44.234.3, 12345}

Una conversación es el enlace de comunicación entre dos procesos, lo que representa una asociación entre dos. Una asociación es la tupla de 5 que especifica completamente los dos procesos que comprenden una conexión: {protocolo, dirección local, proceso local, dirección extranjera, proceso extranjero}

En el conjunto TCP / IP, por ejemplo:

{tcp, 193.44.234.3, 1500, 193.44.234.5, 21}

podría ser una asociación válida

Una media asociación es: {protocolo, dirección local, proceso local}

o

{protocolo, dirección extranjera, proceso extranjero}

que especifican cada mitad de una conexión.

La media asociación también se denomina socket o dirección de transporte. Es decir, un socket es un punto final para la comunicación que puede nombrarse y direccionarse en una red. La interfaz de socket es una de varias interfaces de programación de aplicaciones (API) para los protocolos de comunicación. Diseñado para ser una interfaz de programación de comunicación genérica, fue introducido por primera vez por el sistema 4.2BSD UNIX. Aunque no ha sido estandarizado, se ha convertido en un estándar industrial de facto.

Krishna
fuente
Esta respuesta es la que lo hizo por mí. Supongo que es porque nadie más mencionó la palabra asociación. Buena explicación.
racionalcoder
No hay número de proceso en ninguno de sus ejemplos. La palabra que busca es 'puerto'.
Marqués de Lorne
Lea el primer párrafo ... Se menciona claramente allí. Avíseme de cualquier ambigüedad citando la frase exacta. Sería útil para mí improvisar.
Krishna
7

Un socket es un punto final de comunicación. Un socket no está directamente relacionado con la familia de protocolos TCP / IP, se puede usar con cualquier protocolo que admita su sistema. La API de socket C espera que primero obtenga un objeto de socket en blanco del sistema que luego puede vincular a una dirección de socket local (para recuperar directamente el tráfico entrante para protocolos sin conexión o para aceptar solicitudes de conexión entrantes para protocolos orientados a la conexión) o que puede conectarse a una dirección de socket remota (para cualquier tipo de protocolo). Incluso puede hacer ambas cosas si desea controlar ambas, la dirección de socket local a la que está vinculado un socket y la dirección de socket remota a la que está conectado un socket. Para los protocolos sin conexión, la conexión de un socket es incluso opcional, pero si no lo hace, usted ' También tendrá que pasar la dirección de destino con cada paquete que desee enviar a través del socket, ¿de qué otra manera sabría el socket a dónde enviar estos datos? La ventaja es que puede usar un solo socket para enviar paquetes a diferentes direcciones de socket. Una vez que tenga su socket configurado y tal vez incluso conectado, considérelo como una tubería de comunicación bidireccional. Puede usarlo para pasar datos a algún destino y algún destino puede usarlo para devolverle datos. Lo que escribe en un socket se envía y lo que se ha recibido está disponible para leer. Puede usarlo para pasar datos a algún destino y algún destino puede usarlo para devolverle datos. Lo que escribe en un socket se envía y lo que se ha recibido está disponible para leer. Puede usarlo para pasar datos a algún destino y algún destino puede usarlo para devolverle datos. Lo que escribe en un socket se envía y lo que se ha recibido está disponible para leer.

Los puertos, por otro lado, son algo que solo tienen ciertos protocolos de la pila de protocolos TCP / IP. Los paquetes TCP y UDP tienen puertos. Un puerto es solo un número simple. La combinación de puerto de origen y puerto de destino identifica un canal de comunicación entre dos hosts. Por ejemplo, puede tener un servidor que será ambos, un servidor HTTP simple y un servidor FTP simple. Si ahora llega un paquete para la dirección de ese servidor, ¿cómo sabría si es un paquete para el servidor HTTP o FTP? Bueno, lo sabrá ya que el servidor HTTP se ejecutará en el puerto 80 y el servidor FTP en el puerto 21, por lo que si el paquete llega con un puerto 80 de destino, es para el servidor HTTP y no para el servidor FTP. Además, el paquete tiene un puerto de origen, ya que sin dicho puerto de origen, un servidor solo podría tener una conexión a una dirección IP a la vez. El puerto de origen hace posible que un servidor distinga conexiones idénticas: todas tienen el mismo puerto de destino, por ejemplo, el puerto 80, la misma IP de destino (la IP del servidor) y la misma IP de origen, ya que todas provienen de el mismo cliente, pero como tienen puertos de origen diferentes, el servidor puede distinguirlos entre sí. Y cuando el servidor devuelve respuestas, lo hará al puerto de donde vino la solicitud, de esa manera el cliente también puede distinguir las diferentes respuestas que recibe del mismo servidor.

Mecki
fuente
2
Esto es incorrecto. Un socket no es un punto final. Un socket está definido por dos puntos finales. Cada punto final está definido por una dirección de red y un puerto. El propósito de los puertos es diferenciar múltiples puntos finales en la misma dirección de red, de modo que se puedan admitir múltiples sockets concurrentes.
Peter Wone
1
Noté que RFC793 (especificación TCP original) se refiere a la combinación de una dirección de red y un puerto como un zócalo, por lo que puedo ver de dónde sacó esto, pero todavía es incorrecto en la medida en que un zócalo está necesariamente definido por dos puntos finales.
Peter Wone
2
Al reflexionar, la literatura es contradictoria y pido disculpas. Muy estrictamente hablando, la comunicación no se produce hasta que se establece una conexión TCP entre dos puntos finales (también conocidos como sockets), cada uno de los cuales se identifica mediante una dirección de red y un puerto. Me rindo.
Peter Wone
6

El puerto fue la parte más fácil, es solo un identificador único para un socket. Un socket es algo que los procesos pueden usar para establecer conexiones y comunicarse entre sí. Tall Jeff tenía una gran analogía telefónica que no era perfecta, así que decidí solucionarlo:

  • ip y puerto ~ número de teléfono
  • zócalo ~ dispositivo telefónico
  • conexión ~ llamada telefónica
  • establecer conexión ~ llamar a un número
  • procesos, aplicaciones remotas ~ personas
  • mensajes ~ discurso
inf3rno
fuente
Buena aclaración (especialmente cuando considera el historial de conmutación telefónica que es parte de la base de la terminología de redes ...)
oɔɯǝɹ
Echa un vistazo a una netstatpantalla en algún momento. Todos los sockets aceptados de un socket de escucha comparten el mismo puerto. Ergo un puerto no es un identificador único para un socket.
Marqués de Lorne
6

Una aplicación consta de un par de procesos que se comunican a través de la red (par cliente-servidor). Estos procesos envían y reciben mensajes, hacia y desde la red a través de una interfaz de software llamada socket . Considerando la analogía presentada en el libro "Computer Networking: Top Down Approach". Hay una casa que quiere comunicarse con otra casa. Aquí, la casa es análoga a un proceso y la puerta a un enchufe. El proceso de envío supone que hay una infraestructura al otro lado de la puerta que transportará los datos al destino. Una vez que el mensaje llega al otro lado, pasa a través de la puerta del receptor (toma) hacia la casa (proceso). Esta ilustración del mismo libro puede ayudarlo a:
ingrese la descripción de la imagen aquí
Los sockets son parte de la capa de transporte, que proporciona comunicación lógica a las aplicaciones. Esto significa que desde el punto de vista de la aplicación, ambos hosts están directamente conectados entre sí, a pesar de que hay numerosos enrutadores y / o conmutadores entre ellos. Por lo tanto, un socket no es una conexión en sí misma, es el punto final de la conexión. Los protocolos de capa de transporte se implementan solo en hosts y no en enrutadores intermedios.
PuertosProporcionar medios de direccionamiento interno a una máquina. El objetivo principal es permitir que múltiples procesos envíen y reciban datos a través de la red sin interferir con otros procesos (sus datos). Todos los zócalos cuentan con un número de puerto. Cuando un segmento llega a un host, la capa de transporte examina el número de puerto de destino del segmento. Luego reenvía el segmento al zócalo correspondiente. Este trabajo de entregar los datos en un segmento de capa de transporte al zócalo correcto se llama demultiplexación . Los datos del segmento se envían al proceso adjunto al socket.

Ugnes
fuente
5

Un socket es una estructura en su software. Es más o menos un archivo; Tiene operaciones como leer y escribir. No es una cosa física; Es una forma de que su software se refiera a cosas físicas.

Un puerto es una cosa similar a un dispositivo. Cada host tiene una o más redes (esas son físicas); Un host tiene una dirección en cada red. Cada dirección puede tener miles de puertos.

Un socket solo puede estar usando un puerto en una dirección. El socket asigna el puerto aproximadamente como asignar un dispositivo para E / S del sistema de archivos. Una vez que se asigna el puerto, ningún otro socket puede conectarse a ese puerto. El puerto se liberará cuando se cierre el zócalo.

Eche un vistazo a la terminología TCP / IP .

S.Lott
fuente
3
Esta descripción del zócalo está bastante fuera de lugar. Un socket se trata de la conexión entre un par de tuplas donde una tupla se refiere a un par de ADDR y puerto IP. Además, muchas tomas PUEDEN conectarse al mismo puerto. ¿Cómo crees que un servidor web toma múltiples conexiones en el puerto 80? Esta es una respuesta pobre
Tall Jeff
1
Lo siento. Múltiples sockets no están conectados al puerto 80. Un socket está conectado y genera sockets adicionales donde ocurre la transferencia real. Ver opengroup.org/onlinepubs/009695399/functions/listen.html .
S.Lott
1
En realidad, la descripción en opengroup.org/onlinepubs/009695399/functions/connect.html es mejor. El socket igual devuelto por una conexión NO está en el puerto 80.
S.Lott
1
Esta publicación es incorrecta en varios detalles y engañosa en varios aspectos.
Peter Wone
@ Peter Wone: ¿Qué detalles? Que aspectos Con la esperanza de aprender de mis errores.
S.Lott
5

del tutorial de Oracle Java :

Un socket es un punto final de un enlace de comunicación bidireccional entre dos programas que se ejecutan en la red. Un socket está vinculado a un número de puerto para que la capa TCP pueda identificar la aplicación a la que están destinados los datos.

Yondoo
fuente
Eso es solo un tutorial, y ciertamente no es una referencia normativa.
Marqués de Lorne
"Un socket es un punto final de un enlace de comunicación bidireccional" ¿No es una definición de socket, no un tutorial de Java?
prayagupd
@prayagupd Por supuesto, es una definición, pero es un tutorial, no una especificación.
Marqués de Lorne
4

El puerto y el zócalo se pueden comparar con la sucursal bancaria.

El número de edificio del "Banco" es análogo a la dirección IP. Un banco tiene diferentes secciones como:

  1. Departamento de cuentas de ahorro
  2. Departamento de préstamos personales
  3. Departamento de préstamos hipotecarios
  4. Departamento de quejas

Entonces 1 (departamento de cuentas de ahorro), 2 (departamento de préstamos personales), 3 (departamento de préstamos para la vivienda) y 4 (departamento de reclamos) son puertos.

Ahora déjenos decir que va a abrir una cuenta de ahorros, va al banco (dirección IP), luego va al "departamento de cuentas de ahorro" (número de puerto 1), luego conoce a uno de los empleados que trabajan en el "departamento de cuentas de ahorro". ". Llamemoslo SAVINGACCOUNT_EMPLOYEE1 para abrir una cuenta.

SAVINGACCOUNT_EMPLOYEE1 es su descriptor de socket, por lo que puede haber SAVINGACCOUNT_EMPLOYEE1 para SAVINGACCOUNT_EMPLOYEEN. Todos estos son descriptores de socket.

Del mismo modo, otros departamentos tendrán empleados que trabajan debajo de ellos y son análogos al socket.

Shridhar410
fuente
3

Un socket es un mecanismo de E / S de datos. Un puerto es un concepto contractual de un protocolo de comunicación . Un socket puede existir sin un puerto. Puede existir un puerto sin un socket específico (por ejemplo, si hay varios sockets activos en el mismo puerto, lo que puede estar permitido para algunos protocolos).

Se utiliza un puerto para determinar a qué socket debe enrutar el paquete el paquete, con muchos protocolos, pero no siempre es necesario y la selección del socket de recepción se puede hacer por otros medios: un puerto es una herramienta completamente utilizada por el controlador de protocolo en El subsistema de red. por ejemplo, si un protocolo no usa un puerto, los paquetes pueden ir a todos los zócalos de escucha o cualquier zócalo.

Lijadora
fuente
3

La terminología relativa de TCP / IP, que es lo que supongo está implícita en la pregunta. En términos simples:

Un PUERTO es como el número de teléfono de una casa en particular en un código postal particular. El código postal de la ciudad podría considerarse como la dirección IP de la ciudad y todas las casas en esa ciudad.

Un SOCKET, por otro lado, es más como una llamada telefónica establecida entre teléfonos de un par de casas que se hablan entre sí. Esas llamadas pueden establecerse entre casas en la misma ciudad o dos casas en diferentes ciudades. Es esa vía temporal establecida entre el par de teléfonos que se hablan entre sí que es el SOCKET.

Jeff alto
fuente
2
Un zócalo es un punto final. Existe antes de que se establezca una conexión (TCP), o en ausencia de una conexión (UDP). Ergo, no es en sí la conexión.
Marqués de Lorne
2

En un sentido amplio, Socket - es solo eso, un socket, al igual que su toma de corriente, cable o teléfono. Un punto desde el que pueden salir y entrar "cosas necesarias" (energía, señal, información). Oculta muchas cosas detalladas, que no son necesarias para el uso de las "cosas necesarias". En lenguaje de software, proporciona una forma genérica de definir un mecanismo de comunicación entre dos entidades (esas entidades podrían ser cualquier cosa: dos aplicaciones, dos dispositivos físicamente separados, espacio de usuario y kernel dentro de un sistema operativo, etc.)

Un puerto es un discriminador de punto final. Diferencia un punto final de otro. A nivel de red, diferencia una aplicación de otra, de modo que la pila de red puede transmitir información a la aplicación adecuada.

Harty
fuente
2

Ya se han dado respuestas teóricas a esta pregunta. Me gustaría dar un ejemplo práctico a esta pregunta, que aclarará su comprensión sobre Socket and Port.

Lo encontre aqui

Este ejemplo lo guiará a través del proceso de conexión a un sitio web, como Wiley. Abriría su navegador web (como Mozilla Firefox) y escribiría www.wiley.com en la barra de direcciones. Su navegador web utiliza un servidor del Sistema de nombres de dominio (DNS) para buscar el nombre www.wiley.com para identificar su dirección IP. Para este ejemplo, la dirección es 192.0.2.100.

Firefox se conecta a la dirección 192.0.2.100 y al puerto donde está funcionando el servidor web de la capa de aplicación. Firefox sabe qué puerto esperar porque es un puerto bien conocido. El puerto conocido para un servidor web es el puerto TCP 80.

El socket de destino que Firefox intenta conectar se escribe como socket: puerto, o en este ejemplo, 192.0.2.100:80. Este es el lado del servidor de la conexión, pero el servidor necesita saber dónde enviar la página web que desea ver en Mozilla Firefox, por lo que también tiene un socket para el lado del cliente de la conexión.

La conexión del lado del cliente está compuesta por su dirección IP, como 192.168.1.25, y un número de puerto dinámico elegido al azar. El socket asociado con Firefox se parece a 192.168.1.25:49175. Debido a que los servidores web operan en el puerto TCP 80, estos dos sockets son TCP, mientras que si se conecta a un servidor que opera en un puerto UDP, tanto el servidor como el cliente serían sockets UDP.

Omkar Ramtekkar
fuente
Cita de muy mala calidad. El tercer párrafo hace un mal uso de la palabra 'socket' como si significara 'dirección IP'. No lo hace.
Marqués de Lorne
2

Socket es una abstracción proporcionada por el núcleo a las aplicaciones de usuario para E / S de datos. Un tipo de socket se define por el protocolo que maneja, una comunicación IPC, etc. Por lo tanto, si alguien crea un socket TCP, puede hacer manipulaciones como leer datos en el socket y escribir datos en él mediante métodos simples y el manejo del protocolo de nivel inferior como conversiones TCP y El reenvío de paquetes a los protocolos de red de nivel inferior se realiza mediante la implementación del socket particular en el núcleo. La ventaja es que el usuario no necesita preocuparse por manejar las nitigridades específicas del protocolo y solo debe leer y escribir datos en el socket como un búfer normal. Lo mismo es cierto en el caso de IPC, el usuario simplemente lee y escribe datos en el socket y el kernel maneja todos los detalles de nivel inferior en función del tipo de socket creado.

El puerto junto con IP es como proporcionar una dirección al socket, aunque no es necesario, pero ayuda en las comunicaciones de red.

Navneet Singh
fuente
2

Un solo puerto puede tener uno o más enchufes conectados con diferentes IP externas, como una toma de corriente múltiple.

  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
invitado
fuente
2

Socket es la abstracción SW del punto final de red, que se utiliza como interfaz para la aplicación. En Java, C # está representado por un objeto, en Linux, Unix es un archivo.

El puerto es solo una propiedad de un socket que debe especificar si desea establecer una comunicación. Para recibir el paquete de un socket, debe vincularlo a un puerto local específico y NIC (con dirección IP local) o todos los NIC (INADDR_ANY se especifica en la llamada de enlace). Para enviar paquetes, debe especificar el puerto y la IP del socket remoto.

Dražen G.
fuente
1

Un socket es básicamente un punto final para la comunicación de red, que consiste en al menos una dirección IP y un puerto. En Java / C #, un socket es una implementación de nivel superior de un lado de una conexión bidireccional.

Además, una definición en la documentación de Java .

Erik van Brakel
fuente
En Java Turorial, quieres decir.
Marqués de Lorne
1

Puerto:

Un puerto puede referirse a un punto de conexión física para dispositivos periféricos como puertos serie, paralelo y USB. El término puerto también se refiere a ciertos puntos de conexión Ethernet, como los de un concentrador, conmutador o enrutador.

Enchufe:

Un socket representa una conexión única entre dos aplicaciones de red. Estas dos aplicaciones se ejecutan nominalmente en diferentes computadoras, pero los sockets también se pueden usar para la comunicación entre procesos en una sola computadora. Las aplicaciones pueden crear múltiples sockets para comunicarse entre sí. Los sockets son bidireccionales, lo que significa que cualquier lado de la conexión es capaz de enviar y recibir datos.

balaweblog
fuente
Un puerto TCP o UDP no se refiere a nada físico, ni tampoco a puntos de conexión Ethernet. No has respondido la pregunta.
Marqués de Lorne
1

Un puerto denota un punto final de comunicación en los transportes TCP y UDP para el protocolo de red IP. Un socket es una abstracción de software para un punto final de comunicación comúnmente utilizado en implementaciones de estos protocolos (socket API). Una implementación alternativa es la API XTI / TLI.

Ver también:

Stevens, WR 1998, Programación de redes UNIX: API de redes: Sockets y XTI; Volumen 1, Prentice Hall.
Stevens, WR, 1994, TCP / IP Ilustrado, Volumen 1: Los Protocolos, Addison-Wesley.

VoidPointer
fuente