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


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


730
2017-09-30 10:04


origen


Respuestas:


Resumen

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

Un puerto es un identificador de virtualización definir un punto final del servicio (a diferencia de un servicio) ejemplo punto final también conocido como identificador de sesión).

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

Puede haber conexiones concurrentes a un punto final de servicio, porque una conexión se identifica por tanto su local como remoto puntos finales, permitiendo que el tráfico se enrute a una instancia de servicio específica.

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

Exposición

Esta fue una pregunta interesante que me obligó a volver a examinar una serie de cosas que pensé que sabía de adentro hacia afuera. Uno pensaría que un nombre como "socket" sería autoexplicativo: obviamente fue elegido para evocar imágenes del punto final en el que se conecta un cable de red, existiendo fuertes paralelismos funcionales. Sin embargo, en el lenguaje de la red, la palabra "zócalo" conlleva tanto equipaje que es necesario un cuidadoso reexamen.

En el sentido más amplio posible, un puerto es un punto de entrada o salida. Aunque no se usa en un contexto de redes, la palabra francesa porte literalmente significa puerta o entrada, 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 efectos 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 ampliamente en condiciones de alto estrés y alto tráfico.

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

Un TCP conexión está definido por dos puntos finales aka tomas de corriente.

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

El objetivo de los puertos es diferenciar múltiples puntos finales en una dirección de red determinada. Se podría decir que un puerto es un punto final virtualizado. Esta virtualización hace posibles múltiples conexiones simultáneas en una única interfaz de red.

Es el par de zócalos (la 4-tupla   que consiste en la dirección IP del cliente,   número de puerto del cliente, dirección IP del servidor,   y número de puerto del servidor) que especifica   los dos puntos finales que de manera única   identifica cada conexión TCP en un   Internet. (Volumen ilustrado de TCP-IP 1, W. Richard Stevens)

En la mayoría de los lenguajes derivados de C, las conexiones TCP se establecen y manipulan usando métodos en una instancia de una clase Socket. Aunque es común operar en un nivel superior de abstracción, generalmente una instancia de una clase NetworkStream, esto generalmente expone una referencia a un objeto 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 socket.

En C #, para establecer una conexión TCP (a un oyente existente) primero crea un TcpClient. Si no especifica un punto final al TcpClient constructor utiliza valores predeterminados: de una forma u otra se define el punto final local. Entonces invocas el Conectar  método en la instancia que ha 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 tonto. Estuve trabajando bajo este malentendido hasta que Richard Dorman hizo la pregunta.

Después de haber leído y pensado mucho, ahora estoy convencido de que tendría mucho más sentido tener una clase TcpConnection con un constructor que toma dos argumentos, LocalEndpoint y RemoteEndpoint. Probablemente podrías apoyar un solo argumento RemoteEndpoint cuando los valores predeterminados son aceptables para el punto final local. Esto es ambiguo en computadoras con múltiples hosts, pero la ambigüedad se puede resolver usando la tabla de enrutamiento seleccionando la interfaz con la ruta más corta al punto final remoto.

La claridad también se mejoraría en otros aspectos. Un socket es no identificado 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 puntos finales [varios] en [un número de puerto dado] que recibirá solicitudes de conexión entrantes es el que está en el estado de escucha. (p255, Volumen ilustrado de TCP-IP 1, W. Richard Stevens)

Como puede ver, no solo es posible, sino que es bastante 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 bibliotecas típicas presentan una clase de socket, una instancia de la cual se usa 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 corrió netstat -an -p tcp. Las últimas seis líneas del resultado contienen dos ejemplos del hecho de que la dirección y el puerto no son suficientes para identificar un socket de manera única. Hay dos conexiones distintas entre 192.168.1.3 (mi estación de trabajo) y 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 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:80 y 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 "identificación completa, inequívoca y única". 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 diferenciar estos zócalos. No es suficiente información para identificar un zócalo

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   socket local puede participar en muchas conexiones a diferentes extranjeros   enchufes

Esta definición de socket no es útil desde una perspectiva de programación porque no es lo mismo que un socket objeto, que es el punto final de una conexión 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 Illustrated Volume 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, La definición de un zócalo, Joel M. Winett, Laboratorio Lincoln


804
2017-08-02 17:10



Un socket 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 servidor requiere un socket único.

Por ejemplo:

  • 1030 es un puerto.
  • (10.1.1.2, TCP, puerto 1030) es un zócalo.

154
2017-09-30 10:07



Una toma representa una conexión única entre dos aplicaciones de red. Estas dos aplicaciones funcionan nominalmente en computadoras diferentes, pero las tomas 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 ellos. Los sockets son bidireccionales, lo que significa que cualquier lado de la conexión puede enviar y recibir datos. Por lo tanto, se puede crear un socket teóricamente en cualquier nivel del modelo OSI desde 2 hacia arriba. Los programadores suelen usar 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 socket. Los enchufes se han usado ampliamente desde principios de los años ochenta.

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 la programación de socket. A veces, sin embargo, los números de puerto se hacen visibles para el usuario ocasional. 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 la red IP, los números de puerto pueden oscilar teóricamente entre 0 y 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 tales como puertos serie, paralelo y USB. El término puerto también se refiere a ciertos puntos de conexión Ethernet, como los que se encuentran en un concentrador, conmutador o enrutador.

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

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


85
2018-04-07 20:17



En primer lugar, creo que debemos comenzar con un poco de comprensión de lo que constituye obtener un paquete de A a B.

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

  • los Capa de enlace de datos. Esta capa es responsable de obtener paquetes de datos de un dispositivo de red a otro y está justo 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.
  • los 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 soportar esencialmente un mecanismo adicional basado en dirección que se relacione de algún modo con la dirección física; ingrese el Protocolo de Internet (IPv4). Una dirección IP puede obtener su paquete de A a B a través de Internet, pero no sabe nada sobre cómo atravesar saltos individuales. Esto es manejado por la capa de arriba de acuerdo con la información de enrutamiento.
  • los 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 manera que es posible deducir si se han perdido paquetes.

TCP contiene, entre otras cosas, el concepto de puertos. Estos son puntos finales de datos efectivamente diferentes en la misma dirección IP a la que un zócalo de Internet (AF_INET) puede atar.

Como sucede, también lo hace UDPy otros protocolos de capa de transporte. Técnicamente no necesitar para ofrecer puertos, pero estos puertos proporcionan una forma para que múltiples aplicaciones en las capas anteriores utilicen 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 de origen y dirección, y un puerto y dirección de destino. Esto es para que en cualquier sesión dada, la aplicación de destino pueda responder, así como recibir, desde la fuente.

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

Ahora, debemos analizar cómo se comunica desde el punto de vista de la aplicación al mundo exterior. Para hacer esto, debe preguntar amablemente a su sistema operativo y dado que la mayoría de los SO respaldan la forma de hacer 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...

¡Estupendo! Entonces en el sockaddr estructuras, 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 en mano!

Ok, bueno en realidad no es así. Todo lo que tenemos que hacer es encontrar algunas definiciones apropiadas:

  • Un conector 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, tcp port 80, stackoverflow.com es una toma de internet.
  • Un socket Unix es un punto final IPC representado en el sistema de archivos, p. /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 una conexión a internet. Desafortunadamente, sucede que el significado de la palabra socket se ha aplicado a varias ideas diferentes. Así que le recomiendo encarecidamente que nombre el siguiente socket del proyecto, solo para aumentar la confusión;)


40
2018-06-20 09:57



Con alguna analogía

Aunque muchas cosas técnicas ya se dieron anteriormente para tomas de corriente... Me gustaría agregar mi respuesta, por las dudas, si alguien todavía no podía sentir la diferencia entre ip, puerto y tomas de corriente

Considere un servidor S,

y decir persona X, Y, Z necesita un servicio (digamos servicio de chat) de ese servidor S

entonces

La dirección IP dice -> ¿quien? es ese servidor de chat 'S' con quien X, Y, Z quieren contactar


39
2017-09-30 10:05



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 bloquear la red 101?)


24
2017-09-30 13:26



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

Los zócalos son específicos del protocolo, por lo que la implementación de la singularidad que ambos TCP/IP y UDP/IP usa * (ipaddress: puerto), es diferente de, por ejemplo, IPX (Red, Nodo y ... ejem, socket) pero un socket diferente al término general "socket". Los números de socket IPX son equivalentes a los puertos IP). Pero, todos ellos ofrecen un punto final direccionable único.

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

  • UDP no tiene conexión, lo que significa que nunca se crea un circuito virtual entre los 2 puntos finales. Sin embargo, todavía nos referimos a Sockets UDP como el punto final Las funciones de API dejan en claro que ambos son solo tipos diferentes de conectores: SOCK_DGRAM es UDP (solo envía un mensaje) y SOCK_STREAM es TCP (creando un circuito virtual).

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


22
2018-03-19 01:31



Breve respuesta breve.

UN Puerto puede ser descrito como un dirección interna dentro de un host que identifica un programa o proceso.

UN enchufe se puede describir como interfaz de programación permitiendo que un programa se comunique con otros programas o procesos, en Internet o localmente.


22
2017-12-13 10:09



En general, obtendrá mucha teoría, pero una de las maneras 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, HTTP como servicio se ejecuta en el puerto 80.

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

Espero que esto ayude. Gracias.


20
2017-09-30 10:08