Comprenda profundamente qué es un puerto (puerto)

Comprenda profundamente qué es un puerto (puerto)

 

Cada vez que veo el currículum de alguien que dice que está familiarizado con protocolos como tcp / ip, http, no puedo evitar preguntarle: ¡Dime cuál es el puerto! Desafortunadamente, pocas personas pueden decírselo a la gente. Satisfecho ... Así que en esta ocasión hablaré del puerto, el familiar desconocido.

En este proceso, también hablaremos de conceptos como la capa indirecta, servicio de nombres, IoC, confiando en la inversión y otros principios, y algunos conocimientos clave del protocolo TCP.

Puertos comunes

En nuestro proceso de desarrollo diario, especialmente el desarrollador de back-end, incluso si realmente no comprende los detalles del puerto, seguirá escuchando todo tipo de puertos. Esto está en casi todas partes, como:

  • El puerto 3306 utilizado por mysql por defecto,
  • puerto 6379 de redis,
  • 8080 puerto utilizado por tomcat de forma predeterminada,
  • puerto 22 para ssh,
  • y muchos más...

Por supuesto, lo que más nos preocupan son los puertos relacionados con la web, que son principalmente puertos 80 y 443. Centrémonos en ellos a continuación.

¿Se requiere el puerto?

En el proceso de desarrollo web local y depuración, es posible que hayamos encontrado puertos, como quizás el puerto 8080 más famoso, generalmente accederemos a programas web locales como este:

localhost: 8080

Pero una vez que el programa web se implementa en el sitio web oficial, el puerto parece desaparecer y el puerto no es necesario en el sitio web oficial. La respuesta es no, el valor predeterminado funciona aquí.

Por ejemplo, si visita mi sitio web: https://xiaogd.net, no parece haber un puerto en esta URL, pero existe. Tiene un valor predeterminado de 443, por lo que el formulario completo se ve así:

https://xiaogd.net:443.

Puede ver esto a través de las herramientas de depuración para desarrolladores de Chrome:

Comprenda profundamente qué es un puerto (puerto)

 

Como puede ver, la dirección IP va seguida de un 443

Si ingresa un puerto incorrecto, como 80, como este: https://xiaogd.net:80, el resultado será inaccesible.

Pero si cambia a http://xiaogd.net:80, se puede acceder de nuevo.

Tenga en cuenta que debido a que el fondo de mi servidor está configurado con un redireccionamiento 301 para http que redirecciona automáticamente a https, el navegador eventualmente redireccionará a https://xiaogd.net:443 nuevamente.

Preste atención a marcar 'Conservar registro' para mantener el registro. Puede ver que la primera solicitud del puerto 80 será respondida a un salto 301 e indicar el objetivo del salto, que es la solicitud https en el campo Ubicación, y el navegador recibe este salto Transfiera las instrucciones y reinicie la solicitud https, que es la segunda solicitud de xiaogd.net en la imagen. Por lo tanto, la barra de direcciones eventualmente se convertirá en https, explique aquí.

Si ingresa http://xiaogd.net:443 en este momento, no se podrá volver a acceder ...

Entonces, ¿cuál es la razón? ¿Has encontrado el patrón?

Tenga en cuenta que uno es http y el otro es https.

Puerto predeterminado del protocolo

Cuando no ingresa explícitamente el puerto en la URL, el navegador realmente especificará un puerto predeterminado para usted de acuerdo con el protocolo utilizado:

  • Si es un protocolo http, use el puerto 80
  • Si es el protocolo https, use el puerto 443

¿Qué pasa si ingresas al puerto tú mismo? Usa el puerto que ingresaste. Será lo que ingreses. Si ingresas mal, es tu responsabilidad si no puedes acceder a él. ¿Quién te hace perder el tiempo?

No tenías que preocuparte por eso, solo quieres quitarte los pantalones y tirarte un pedo, lo que podría ser superfluo y contraproducente.

Por ejemplo, si usa http pero ingresa 443, o usa https pero ingresa 80, no podrá acceder correctamente.

Además, si ingresa un valor aleatorio como 9527, http://xiaogd.net:9527, es naturalmente inaccesible La razón es simple, porque mi servidor no está escuchando en el puerto 9527 en absoluto.

Incluso si escucho en el puerto 9527, es posible que no sea un servicio web. El protocolo utilizado puede no ser http ni https, por lo que puede encontrarse con una pared cuando intente acceder a él con un navegador.

Por supuesto, puedo implementar completamente un servicio web en el puerto 9527 en el servidor, por ejemplo, poner un servidor web como apache o servidor tomcat para escuchar en ese puerto, y luego dejar que el firewall, el grupo de seguridad, etc. También es accesible, es solo que yo no hice eso.

Entonces, ¿por qué la gente no proporciona servicios web en esos puertos extraños? La razón es realmente muy simple, para la conveniencia de los usuarios, pero también para reducir la carga cognitiva de los usuarios.

De hecho, sobre los usuarios, solo necesita recordar dos puntos:

  1. Los usuarios son tontos
  2. Los usuarios son vagos

Con una comprensión profunda de esto, puede convertirse en un buen programador (incluidos, entre otros, gerentes de producto, diseñadores ...)

En realidad, más que omitir el puerto, miras la barra de direcciones actual, no solo se guardan los protocolos http, https, se guarda la barra / al final, e incluso se guarda www ...

Sí, también te salvé www. De hecho, puedes acceder a él a través de https://www.xiaogd.net/, pero si puedes acceder a él a través de https://xiaogd.net/, ¿para qué molestarse en ir? ¿Qué tal ingresar tres datums?

Hay que admitir que la existencia de valores predeterminados es de gran ayuda, lo que en realidad es un progreso; pero por otro lado, estos valores predeterminados a veces pueden causar confusión a los desarrolladores que no lo conocen, como si el puerto no fuera necesario. , Pero este no es el caso.

¿Por qué necesito un puerto?

Entonces, ¿por qué tienes que portar esto? ¿Qué papel juega? Muchos estudiantes quieren entenderlo. Hablemos de por qué. Y un concepto que debe entenderse primero es la comunicación entre procesos (la llamada IPC (comunicación entre procesos) )

Comunicación entre procesos (IPC)

Ingresa el nombre de dominio de un determinado sitio web en la barra de direcciones del navegador, luego presiona Enter y se genera una solicitud, y luego el servidor responde a su solicitud, y el navegador muestra el resultado, y finalmente puede ver una página web.

Si alguna vez ha hecho ping a un nombre de dominio, por ejemplo, si hace ping a mi nombre de dominio xiaogd.net, puede obtener una dirección IP, 118.89.55.54:

Comprenda profundamente qué es un puerto (puerto)

 

Con ip, el navegador puede encontrar mi host de forma natural, pero todavía hay un problema. Hay muchos procesos y muchos servicios ejecutándose en mi host. Además de los servicios web más comunes, también puedo tener servicios ftp y servicios mysql. Espera un minuto.

En pocas palabras, si una solicitud solo tiene la información de la dirección IP, el sistema operativo no sabrá a qué proceso pasar la solicitud. Si está diseñando todo el sistema, imagínese, ¿es cierto?

Si solo ingresa el nombre de dominio, solo puede obtener una dirección IP después de la resolución de DNS.

La llamada solicitud, desde una perspectiva de nivel relativamente bajo, es una comunicación entre procesos.

Comprenda profundamente qué es un puerto (puerto)

 

Puede ser una comunicación entre el cliente Navicat y el servicio de base de datos MySQL, o una comunicación entre el cliente WinScp y el servicio FTP vsftpd, etc.

Tomando el ejemplo específico anterior como ejemplo, se puede decir que es una comunicación entre un proceso en el sistema operativo local del navegador Chrome y un proceso llamado Nginx en mi servidor.

Entonces, el llamado puerto se puede considerar simplemente como el ID del proceso.

Por supuesto, sigue siendo diferente del ID del proceso. Analicémoslo a continuación, o puede pensar que el puerto es la sombra del ID del proceso.

Es decir, si solo hay un nombre de dominio (ip) es imposible ubicar un proceso, el iniciador de la comunicación no solo necesita dar la ip, sino también el puerto, solo así el servidor puede saber a qué proceso responder.

Puerto, una capa indirecta

Entonces surge la pregunta de nuevo, ¿por qué introducir el puerto en lugar de usar directamente el ID del proceso? Esta razón no es difícil de entender después de pensar en ella. Probablemente haya varias razones:

  1. Como cliente, es imposible conocer el ID del proceso correspondiente en el servidor
  2. La ID cambiará después de que se reinicie el proceso correspondiente del servidor
  3. El ID de proceso web de un sitio web es este y el ID de otro sitio web puede ser otro

Naturalmente, hay muchas razones, también enumeré algunas casualmente, es posible que pueda pensar en más. Para resolver estos problemas, se introdujo la dirección indirecta del puerto.

Hay un dicho famoso en el mundo de la informática: cualquier problema de la informática se puede resolver con otra capa de indirección - David Wheeler

Este famoso dicho en realidad tiene la siguiente oración: Pero lo que generalmente creará otro problema (pero generalmente trae otro problema)

El llamado otro problema aquí, como que complicará la estructura jerárquica, reducirá la eficiencia de la interacción, etc. Por supuesto, este es el problema que los arquitectos tienen que sopesar. En muchos casos, la arquitectura se trata del arte del equilibrio. No te matará. Es un extremo introducir cualquier capa indirecta y otro extremo introducir múltiples capas indirectas al principio.

Sin esta capa de indirección, si el cliente quiere comunicarse con el servidor, necesita conocer el ID del proceso correspondiente del servidor, es decir, el cliente es dependiente del servidor:

Evidentemente, este modelo es extremadamente inadecuado para la web, donde un servidor corresponde a un gran número de visitas de clientes. ¡No sabes quién puede visitar tu web! No puedes decírselo en absoluto.

Con la capa indirecta de puerto, para la web, esta dependencia se invierte, el cliente siempre envía peticiones al puerto 80 (o 443), que pasan a formar parte del estándar y requieren que el servidor se adapte a su vez. , El servidor escucha la comunicación del puerto y la procesa, lo que se convierte en una dependencia inversa.

Comprenda profundamente qué es un puerto (puerto)

 

Si un proceso desea proporcionar servicios web, debe vincularse a los puertos relacionados con la web después de iniciarse.

Si el puerto ya está vinculado por otros procesos (es decir, los llamados ocupados), el enlace fallará; o si está ocupado por el proceso anterior que no ha salido por completo, el enlace fallará. Puede encontrar problemas durante el proceso de desarrollo. Para un problema similar, un proceso web no está cerrado, e intenta iniciar otro, y ambos usan el mismo puerto, habrá un conflicto.

Y continúe monitoreando (escuchando) y respondiendo (respondiendo) cuando llegue una solicitud. De esta manera, se resuelve el problema de identificación del proceso:

Esto es similar a una devolución de llamada de interfaz. El navegador solo necesita solicitar servicios de la interfaz sin conocer el proveedor específico del servicio de interfaz. Estos detalles están encapsulados y ocultos por la capa del puerto.

La existencia de la capa indirecta de puerto desacopla la fuerte dependencia entre el cliente y el servidor, y todo el sistema se vuelve muy flexible.

El puerto puede considerarse como una interfaz en el concepto de programación general, y Nginx, apache, tomcat, etc. pueden considerarse como diferentes implementaciones de esta interfaz (Implementación).

Una analogía entre los puertos y el mundo real

Para profundizar su comprensión, puede dar un ejemplo del mundo real. Creo que todos tienen experiencia previa en centros cívicos, como solicitar permisos de residencia, pasaportes, seguro social, etc., generalmente recibirá una pequeña nota pidiéndole que vaya a un determinado Una ventana maneja el negocio correspondiente, esta ventana es realmente similar a un puerto:

Por ejemplo, la ventana 80 corresponde al negocio de pases de Hong Kong, Macao y Taiwán.

Luego, si desea solicitar el pase de Hong Kong, Macao y Taiwán, simplemente se apresura a ir a la ventana 80 y listo. No le pregunte al tío Wang en la oficina de seguridad de la puerta, que se ocupa de este asunto.

Hoy, puede que sea Xiao Ming quien lo esté manejando. Después de unos días, Xiao Ming puede estar lesionado y sangrando, y es el turno de Xiao Hong de manejarlo allí. Después de un tiempo, Xiao Hong también tuvo un accidente, tuvo un aborto espontáneo y el turno de Xiao Zhang fue nuevamente Después de manejar, después de un tiempo, se descubrió que Xiao Zhang estaba haciendo trampa para ganancias personales en el proceso de manejo de negocios y fue exiliado ...

Espere, si su colega le pregunta cómo solicitar el Pase de Hong Kong, Macao y Taiwán, ¿necesita conocer los detalles de estos cambios personales? No, solo debe decirle que vaya a la ventana 80 para solicitarlo ...

Todo el sistema del centro cívico asegurará que haya una persona que pueda manejar estos negocios sentada debajo de esa ventana. Lo único que debe hacer es solicitar el servicio debajo de esa ventana.

Servicio de puertos y nombres

A través del ejemplo de analogía del mundo real anterior, creo que tiene una comprensión más profunda del mecanismo del puerto. En términos generales, la capa del puerto también se puede considerar como un servicio de nombres, que es similar al eureka en la nube de primavera. El mecanismo es esencialmente el mismo, pero el nombre es un número abstracto. Por ejemplo, 80. 80 representa un servicio web. Vincular y escuchar un servidor web como Nginx equivale a registrar el servicio web proporcionado por él mismo. .

El sistema de nombres de dominio DNS es en realidad un servicio de nombres, puede obtener el servicio web que le proporciono a través del nombre (nombre) de xiaogd.net.

De manera similar, JNDI en Java, etc., asocia un nombre con un servicio, por ejemplo, un nombre representa una fuente de datos (conexión de base de datos).

Puerto e IoC (inversión de control)

En términos generales, el mecanismo anterior del puerto también es una manifestación de la idea de inversión de control (Ioc: Inversión de control). Si el cliente necesita conocer el ID de proceso del servidor, en realidad está controlado por el servidor. Después de todo, ¿qué ID es mi servidor? Para brindar servicios, debe enviar su solicitud al DNI correspondiente;

¿Y con la capa intermedia de puerto? Como cliente, siempre envía solicitudes al puerto correspondiente, y requiere que el servidor se vincule y escuche esos puertos y responda. Su servidor a su vez está controlado por mi cliente , A qué puerto envía mi cliente, su servidor debe escuchar y responder en el puerto correspondiente.

Puedes experimentar este cambio Este tipo de diseño o pensamiento es realmente muy importante en el campo de la programación y se refleja en muchos otros lugares.

Debido a que el navegador siempre envía solicitudes web al puerto 80 o 443, requiere un proceso de servidor web para escuchar estos puertos. Por ejemplo, en mi servidor, el servidor web es Nginx, y escuchará los puertos 80 y 443 después de iniciarse. Cualquiera que quiera visitar mi página de inicio no necesita saber cuál es mi ID de proceso Nginx. Con la ayuda de la capa indirecta de puerto, puede comunicarse con mi proceso Nginx y obtener lo que desea.

De hecho, puede pensar que el navegador en realidad solo se está comunicando con el puerto, y la capa del puerto luego delega o envía estas solicitudes al servidor web correspondiente para su procesamiento. La función del puerto es un intermediario, una capa indirecta. .

Revisando el puerto predeterminado

Ahora bien, debemos entender que el port es necesario, claro que para el usuario final no es necesario conocer los detalles de estas implementaciones, para él debe seguir el principio de conocimiento mínimo, y cuanto menos sepa, mejor.

Si debe permitir que el usuario ingrese el puerto al ingresar la URL, o ingrese un www, etc., el usuario arrojará "100,000 por qué" para usted ...

¿Por qué agregar 443?

¿Por qué no 334, qué significa 443?

¿Por qué es 80 por un tiempo y 443 por un tiempo?

¿Por qué agregar un www? ¿Qué quieres decir?

¿Por qué hay una barra al final? ¿Morirá si no?

...

No puedo permitirme provocar ...

¿Recuerdas lo que dije antes, los usuarios son idiotas, los usuarios son holgazanes?

Aquí hay otro dicho famoso en el mundo de la informática: los programadores y Dios apuestan por desarrollar un software más grande y mejor que incluso los tontos pueden usar, pero Dios siempre puede crear tontos más grandes y tontos. Hasta ahora, Dios ha ganado.

Los programadores están en una carrera con el Universo para crear programas más grandes y mejores a prueba de idiotas. El Universo está tratando de crear idiotas más grandes y mejores. Hasta ahora, el universo esta ganando.

Para ser honesto, en muchos casos, el usuario puede recordar que su nombre de dominio es Amitabha, debe quemar el incienso, también quiere que los usuarios recuerden su puerto, realmente quieren más ...

Por otro lado, también deberíamos poder entender cuando hablamos de esto, es decir, en teoría, los servicios web se pueden construir en cualquier puerto. Por ejemplo, cuando se desarrolla localmente, el usuario es solo usted, entonces, por supuesto, puede elegir uno. Port, como 8080, siempre que lo sepa, o como mucho, dígaselo a otro colega de interfaz que trabaje con usted.

De la misma manera, otros servicios no web, como los servicios ftp, no necesariamente tienen que estar en el puerto 21, etc .; el puerto del servicio mysql también se puede ajustar a un puerto que no sea 3306.

O, desea brindar un servicio, pero solo un pequeño grupo de personas sabe que puede elegir un puerto muy parcial, de modo que la gente común solo pierda un nombre de dominio y no pueda acceder a su servicio.

Por ejemplo, algunas personas quieren brindar en secreto algunos servicios, poner algunos videos pequeños que son populares entre el público ... ¡¡La ley penal advierte, las consecuencias son por su cuenta y riesgo !! No digas que no te lo recordé.

Puerto y protocolo TCP / UDP

He estado hablando del puerto 3306, puerto 80 y puerto 443. Estrictamente hablando, el puerto está dividido en puerto TCP y puerto UDP, pero la mayoría de las veces es puerto TCP, pero el puerto TCP 80 y el puerto UDP 80 son Diferentes puertos.

El puerto 80 de UDP, incluido el puerto 443, están realmente reservados, y el protocolo http actual solo se basa en el protocolo TCP.

Por supuesto, teóricamente hablando, no se puede decir que construir http en UDP sea completamente imposible. Después de todo, tanto UDP como TCP están construidos sobre el protocolo IP. En resumen, nada es imposible en el mundo de la informática, y parece que hay personas reales en el mundo. Haga estos intentos, pero esto pertenece a la categoría de dos vaquillas vs. nalgas - una categoría más poderosa, aguas profundas, no entiendo, no diré más.

Otro punto es que la comunicación del puerto entre procesos es realmente simétrica, es decir, la respuesta del servidor primero regresa al puerto del cliente.

Si está utilizando el sistema Windows 10, puede ir a Administrador de tareas> Rendimiento> Abrir monitor de recursos> Red> Conexiones TCP y hacer clic en el puerto remoto para ordenar de pequeño a grande, por lo general, puede ver la conexión relacionada con 443, puede ver Hay una columna de puertos locales a la izquierda. Una conexión TCP siempre tiene un puerto remoto y un puerto local:

Al iniciar una conexión TCP, el cliente primero selecciona aleatoriamente un puerto no utilizado como puerto receptor de la respuesta del servidor, como 38672. En un paquete TCP, ya sea un paquete de reconocimiento o un paquete de datos posterior, la parte del encabezado es la más Hay dos campos importantes, uno es el puerto de origen, como 38672; el otro es el puerto de destino, como 80 o 443.

Se puede ver que la respuesta del servidor primero regresa al puerto de origen, como 38672, y luego el puerto de origen se reenvía al proceso final, como el navegador.

Para un paquete IP, de manera similar, los dos campos más importantes en la parte del encabezado, uno es la IP de origen (IP de origen); el otro es la IP de destino (IP de destino).

El paquete TCP se empaquetará en el paquete IP como el paquete de datos del paquete IP, y un paquete IP realmente contiene el puerto IP +.

IP más puerto más la asociación entre puerto y proceso, los procesos que pertenecen a dos hosts diferentes pueden realizar felizmente la comunicación entre procesos (IPC) a través del protocolo TCP (UDP) / IP.

Por supuesto, los procesos entre el mismo host también pueden usar este mecanismo. Pero hay otras opciones entre el mismo host, dependiendo de si cada sistema operativo proporciona mecanismos relacionados y soporte. TCP / IP es un estándar ampliamente utilizado Acuerdo, que ha sido ampliamente apoyado.

Debido al espacio, no se ampliarán los detalles sobre el protocolo TCP, etc., así como los conceptos que incluyen Socket, conexión y alojamiento virtual, proxy inverso, etc. Si está interesado, deje un mensaje y consideraré escribir más más adelante. Artículo para presentar.

También por razones de espacio y al mismo tiempo, no soy un experto en redes y protocolos informáticos. En cuanto al puerto, si hay algo que no esté en su lugar o sea incorrecto, por favor deje un mensaje para corregirme. La introducción del puerto está aquí.

Supongo que te gusta

Origin blog.csdn.net/python8989/article/details/108502742
Recomendado
Clasificación