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.
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.
Respuestas:
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 .
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: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 "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.
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.
Un zócalo consta de tres cosas:
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:
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
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 :)
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í:
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_INET
puede 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 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 inglesa en proceso!
Ok, en realidad no lo ha hecho. Todo lo que tenemos que hacer es llegar a algunas definiciones apropiadas:
/var/run/database.sock
.Voila! Eso arregla las cosas. Entonces en nuestro esquema entonces,
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;)
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?)
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.
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_DGRAM
UDP (solo enviando un mensaje) y SOCK_STREAM
TCP (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).
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.
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.
Estos son conceptos básicos de redes, por lo que los explicaré de una manera fácil pero comprensiva para comprender en detalle.
Entonces, un socket en la red es un dispositivo de comunicación virtual unido a un par (ip, puerto) = (dirección, servicio).
Nota:
Espero que te aclare dudas
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
...
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í.
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.
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.
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:
netstat
pantalla 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.
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:
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.
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 .
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.
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:
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.
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.
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.
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.
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.
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.
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
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.
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 .
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.
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.