sockets - que - ¿Qué es un socket, físicamente?
sockets java (3)
Siempre prefiero el significado pyhsical de un concepto de programación a su significado lógico. Así que aquí viene esta pregunta.
Mientras reviso el paradigma de programación de socket, noté que lo que hacen las funciones bind () , connect () es como sintonizar el socket creado por la función socket () . Así que supongo que lo que hace la función socket () es simplemente crear una estructura de datos (y posiblemente una estructura de datos en el espacio del kernel) para mantener los detalles sobre la configuración de la comunicación de extremo a extremo entre el cliente y el servidor. Y bind (), connect () simplemente completa esa estructura de datos.
No estoy familiarizado con la implementación de la API de socket, por lo que espero que alguien pueda abordar mi preocupación.
Esto es altamente dependiente de la plataforma. El punto de la API es para que NO necesite conocer estos detalles.
Si está realmente interesado en aprender esto (lo cual no debería ser solo para las aplicaciones y la programación de aplicaciones del sistema), puede descargar un archivo fuente del kernel de Linux desde kernel.org y examinar la implementación de TCP / IP de Linux en net / ipv4
Para añadir algo de claridad,
Para transportar datos a través de la red, generalmente cumplimos con los estándares definidos por la Organización Internacional de Estándares. Tienen un estándar llamado modelo OSI, o Interconexión de sistemas abiertos.
Este modelo define 7 capas de abstracción para que las aplicaciones muevan datos a través de una red. Solo hablaré sobre los primeros 4, ya que son los pertinentes para su pregunta.
Capa fisica:
Esta capa define cómo se transmiten los datos a través de los medios. Los proveedores de hardware se adhieren a estándares definidos sobre cómo mover los datos. Los estándares concuerdan con las señales eléctricas y los aspectos electrónicos de los datos en movimiento.
Cómo encaja en el sistema:
Con suerte, se requiere muy poco soporte de software para esta capa. Cualquier programación que se haga aquí es probable que se haga en el módulo y no en el kernel o la aplicación.
Capa de enlace de datos:
Esta es la primera capa que podría decirse que involucra algún tipo de programación. Esta capa define los protocolos de nivel de línea que operan en los enlaces físicos. Ethernet es un protocolo. Frame relay es otro. Token Ring es otro. Cada extremo del enlace debe estar ejecutando el mismo protocolo de enlace de datos. Esta capa combina un estándar de capa física compatible para proporcionar un medio para transferir datos de un host a otro. En muchos aspectos, se puede pensar más en un apéndice de la capa física en lugar de su propia capa, pero como los protocolos de nivel de enlace se definen aquí, no es una gran analogía. Esta capa proporciona direcciones físicas a los nodos en una red.
Cómo encaja en el sistema:
Necesitaría escribir un controlador para hablar con el módulo de interfaz que ejecuta estos protocolos de enlace de datos. Dependiendo del módulo y del sistema, el módulo puede tener todo lo que necesita para funcionar, o puede necesitar ayuda a nivel del sistema. Lo ideal es que cree un conjunto de interfaces de código (tal vez implementadas como estructuras que contienen punteros de función para el manejo adecuado de E / S ... Realmente no lo sé) y cuando instala un nuevo módulo físico, solo necesita un controlador para implementa esas interfaces de código y ahora tu módulo físico es utilizable.
Capa de red
Esta es la capa que proporciona la capacidad de mover datos entre redes (en el caso de TCP / IP). El protocolo de Internet está definido en esta capa. Esta capa proporciona direcciones lógicas a los nodos para que puedan agruparse en redes. Al saber en qué red (el host también se denomina una subred, determinada de forma programática mediante la máscara de subred) está activado, ejecutamos algoritmos que mueven correctamente los datos de una red a otra. Si un host está en la red A en China y un host está en la red B en Australia, los algoritmos a este nivel se encargan de proporcionar una ruta que vincule estas redes y, por lo tanto, estos hosts.
Una cosa importante acerca de la programación para esta capa es que debería poder simplemente "conectar" cualquier capa de enlace de datos para transmitir. Esto significa que una vez que cree un código en su sistema para transmitir a través de Ethernet, Token Ring, 3G o Frame Relay, debe poder usarlos todos sin que la capa de red necesite saber qué tecnología de enlace de datos está utilizando. La lógica de mover datos entre redes no debe depender del enlace físico real en el que está operando.
Esta capa pone sus datos en paquetes, y los paquetes son los que se enrutan a través de Internet.
Cómo encaja en el sistema:
Toda esta capa debe estar codificada como parte del sistema. Es completamente una construcción de software y debe estar lo más aislada posible de la capa de enlace de datos. No soy lo suficientemente experto para decir en la práctica qué tan bien se logra esto. Debido a que la funcionalidad de esta capa está definida por el sistema, tenemos control total sobre lo que el software debe admitir. Esto hace que la construcción de las interfaces de código que permiten el uso de esta capa por protocolos de capa superior sea bastante simple en comparación con las de la capa de enlace de datos.
Capa de transporte:
Esta capa define la segmentación de datos (porque si acaba de enviar datos gigantes de una vez, casi nada lo pondría en orden). Esta capa también define TCP, que proporciona agitación a mano, sumas de comprobación, pedidos de paquetes, tamaños de ventana de datos variables y confiabilidad garantizada. TCP le ofrece la posibilidad de crear múltiples canales lógicos de comunicación a través del mismo enlace físico. Diferencia una cobertura en un enlace de otra conversación en el mismo enlace. UDP también se define en este nivel, y se puede considerar como un TCP extremadamente ligero. UDP no proporcionó casi ninguno de los beneficios de TCP, pero aún así proporciona la multiplexación del canal físico.
Si su capa de transporte está bien escrita, sus aplicaciones no necesitan (hablando desde un punto de vista de arquitectura de código) preocuparse por si la capa de transporte está usando TCP o UDP (solo mencionando estos dos b / c, el más popular en IP). Si bien puede elegir una u otra en función de las necesidades de rendimiento o confiabilidad del tiempo (y en la práctica, las aplicaciones a menudo hacen una suposición sobre cuál están ejecutando), su aplicación no necesita tener un conocimiento exacto de cuál está ejecutando.
Debido a que esta capa se construye sobre la capa de red, no tenemos que preocuparnos de cómo nuestros datos pasarán de un host a otro si están en redes diferentes. Si un enrutador está ejecutando un protocolo de enrutamiento estándar, aumentado por algunas rutas definidas estáticamente, no debemos preocuparnos por eso. Todo está a cargo de nosotros por la capa de red. Si la configuración de la capa de red cambia en el host que estamos ejecutando, no importa. No necesitamos cambiar toda nuestra aplicación para tener en cuenta esto.
Cómo encaja en el sistema:
Muy similar a la capa de red, excepto que proporciona una funcionalidad diferente a la capa de red. Además, estas interfaces se utilizan más en el espacio de usuario que las interfaces de capa de red. Esta es la capa que realmente define los sockets que utiliza en redes TCP / IP.
Espero que esto te ayude y puedas entender por qué tu pregunta es un poco confusa para la mayoría de nosotros.
Mis 2 centavos valen:
Un socket es básicamente consistente de una IP de origen, un Puerto de origen, una IP de destino y un Puerto de destino . (Físicamente, realmente no es nada, este es un concepto basado en software) De esta manera, el sistema operativo puede decir qué Aplicación (a través de su número de puerto) necesita recibir los paquetes o está enviando los paquetes.
La pila de red (modelo TCP / IP o OSI) se implementa de manera diferente según su sistema operativo. Si desea obtener más información sobre cómo se transfieren y procesan los paquetes, estudie el modelo OSI o la pila TCP / IP. Esto le dirá lo que sucede con la información cuando deja que su aplicación se envíe a través de una red.
El sistema operativo se ocupa de manejar los paquetes, por lo que si usted es un programador, como se dijo antes, normalmente no está interesado en estos detalles.
Si tienes curiosidad y quieres saberlo igual que yo, te sugiero que comiences a leer. :)
¿Está familiarizado con el modelo OSI ? bind()
especifica la dirección IP local y el puerto (capa 4) a usar, de modo que cuando el paquete se envía físicamente, especifica esa dirección IP como remitente, y connect()
especifica la dirección IP remota y el puerto para colocar físicamente en esos paquetes
Además, mucha programación es pura "lógica" y no tiene realmente un significado "físico", a menos que "físico" signifique "detalle de implementación", que variará de una plataforma a otra. Si en realidad está preguntando acerca de la implementación física, lo que significa que el "significado" se transforma en señales eléctricas, probablemente sería más feliz como ingeniero informático que como programador.