计算机网络中的OSI七层模型
计算机网络中的OSI(Open Systems Interconnection)七层模型
Es un marco teórico para describir el proceso de comunicación de datos en redes informáticas. El modelo OSI 计算机网络通信
divide el proceso en siete niveles, y cada nivel tiene sus funciones y protocolos específicos. Esta estructura en capas es útil para la investigación y la comprensión de las redes informáticas 通信原理
. Las siguientes son las diversas capas del modelo OSI de siete capas y sus funciones principales:
应用层
Es la séptima capa del modelo OSI y también es la interfaz entre 网络应用程序
y . 网络协议
La capa de aplicación es principalmente responsable de proporcionar a los usuarios diversos servicios de aplicaciones, como transferencia de archivos, correo electrónico y navegación web.
表示层
Es la sexta capa del modelo OSI, que se encarga principalmente de procesar la representación de los datos transmitidos en la red, como los datos 加密、解密、压缩、解压缩
. La capa de presentación asegura la comunicación entre diferentes sistemas 数据兼容性
.
会话层
Es la quinta capa del modelo OSI y es principalmente responsable de establecer, mantener y finalizar sesiones de comunicación entre aplicaciones. La capa de sesión proporciona mecanismos de sincronización y confirmación para el intercambio de datos.
传输层
Es la cuarta capa del modelo OSI, que es principalmente responsable de proporcionar servicios de transmisión de datos confiables de extremo a extremo entre el host de origen y el host de destino. La capa de transporte logra una transmisión de datos confiable al segmentar, encapsular y volver a ensamblar los datos. Los protocolos comunes de la capa de transporte incluyen TCP(传输控制协议)
y UDP(用户数据报协议)
.
网络层
Es la tercera capa del modelo OSI, que es la principal responsable de 数据包从源主机路
enviar hosts al host de destino. La capa de red es la principal responsable 逻辑寻址、路由选择和分组转发
. Los protocolos de capa de red comunes incluyen IP(互联网协议)
y ICMP(互联网控制报文协议)
.
数据链路层
Es la segunda capa del modelo OSI y se encarga principalmente de encapsular los paquetes de datos de la capa de red en tramas y transmitirlos en la misma LAN. La capa de enlace de datos es principalmente responsable del direccionamiento físico, tramas de datos, detección de errores y control de flujo. Los protocolos comunes de la capa de enlace de datos incluyen, 以太网(Ethernet)、令牌环(Token Ring)和无线局域网(Wi-Fi)
etc.
物理层
Es la primera capa del modelo OSI y es principalmente responsable de la transmisión transparente de flujos de bits en medios físicos. La capa física se centra principalmente en cuestiones como las interfaces de hardware, las características eléctricas, las fibras ópticas y la transmisión inalámbrica.
El modelo OSI de siete capas proporciona un marco general para ayudar a estudiar y comprender los principios de comunicación en las redes informáticas. En aplicaciones prácticas solemos utilizar TCP/IP四层模型
, incluye 应用层、传输层、网络层和链路层
, y tiene cierta correspondencia con el modelo OSI.
La necesidad de un framework HTML
HTML框架
La razón principal del diseño en capas es mejorar la legibilidad, el mantenimiento y la reutilización del código. Las capas HTML框架
pueden mejorar la estructura y la lógica del proyecto general, lo que facilita a los desarrolladores comprender y modificar mejor el código. Un diseño en capas tiene las siguientes ventajas:
- Mejore la legibilidad: al dividir el marco HTML en diferentes capas, la estructura del código se puede aclarar, lo que ayuda a los desarrolladores a comprender rápidamente la función del código.
- Facilidad de mantenimiento: el diseño en capas ayuda a modularizar las funciones, de modo que un módulo se puede modificar o reemplazar fácilmente sin afectar otras partes del código. Esto ayuda a mejorar la mantenibilidad del proyecto.
- Reutilización: la superposición del marco HTML puede extraer partes comunes en componentes reutilizables, de modo que estos componentes puedan reutilizarse en diferentes proyectos y mejorar la eficiencia del desarrollo.
- Adaptabilidad: el diseño en capas puede hacer que el marco HTML sea más fácil de adaptar a diferentes dispositivos y tamaños de pantalla, mejorando la compatibilidad del proyecto.
- Facilidad de colaboración: en proyectos grandes, a menudo hay varios desarrolladores involucrados. A través del diseño en capas, los desarrolladores pueden concentrarse en sus propios módulos, lo que reduce los conflictos de código y los costos de comunicación.
HTML框架的组成
El marco HTML incluye Application层``middleware层``route层``codec层``transport层
Application层
La capa de aplicación generalmente incluye código relacionado con la lógica comercial, como el controlador (Controller), la vista (View) y el modelo (Model) de una aplicación web. La función principal de la capa de aplicación es procesar las solicitudes de los usuarios y devolver las respuestas correspondientes.
Middleware层
La capa de middleware es una capa entre la capa de aplicación y el marco subyacente, responsable de manejar algunas funciones comunes, como autenticación, autorización, almacenamiento en caché, registro, etc. La capa de middleware ayuda a separar la lógica comercial de las funciones comunes, lo que hace que la capa de aplicación sea más concisa y fácil de mantener.
Route层
La capa de enrutamiento es responsable de procesar las URL y los métodos HTTP (como GET, POST, etc.) de las solicitudes HTTP y enviar las solicitudes a los controladores y métodos correspondientes. La función principal de la capa de enrutamiento es ubicar códigos de función específicos de acuerdo con el mapeo de URL.
Codec层
La capa de códec es responsable de codificar y decodificar datos. En el desarrollo web, la codificación y la decodificación suelen implicar el procesamiento de tecnologías front-end como HTML, CSS y JavaScript, así como el procesamiento de formatos de intercambio de datos como JSON y XML. La función principal de la capa de códec es convertir los datos a un formato específico para su transmisión y procesamiento entre diferentes capas.
Transport层
La capa de transporte es responsable de manejar la comunicación de red subyacente, como el uso de protocolos como TCP y UDP. En el desarrollo web, la capa de transporte suele implicar el procesamiento del protocolo HTTP, incluida la creación, el envío y la recepción de solicitudes y respuestas. La función principal de la capa de transporte es garantizar la transmisión confiable de datos y el enrutamiento correcto en la red.
Estas capas pueden variar en diferentes marcos y escenarios en aplicaciones reales. Sin embargo, a juzgar por la descripción que proporcionó, son respectivamente responsables de manejar diferentes funciones en la aplicación web y juntos constituyen un marco de desarrollo web completo.
HTML框架和服务端客户端之间的通信对比
Application层
diseño de la capa de aplicación
El diseño de la capa de aplicación es principalmente para establecer varios tipos 接口
para su 路由
uso.
Por ejemplo, en el proyecto grande en la versión avanzada del backend de bytes 注册接口
.
/douyin/user/register/ - interfaz de registro de usuario
Cuando un nuevo usuario se registre, solo proporcione un nombre de usuario, contraseña y apodo, y el nombre de usuario debe ser único. Devuelve la identificación del usuario y el token de permiso después de que la creación sea exitosa.
Tipo de interfaz
CORREO
Definición de interfaz
go
复制代码
syntax = "proto2";
package douyin.core;
message douyin_user_register_request {
required string username = 1; // 注册用户名,最长32个字符
required string password = 2; // 密码,最长32个字符
}
message douyin_user_register_response {
required int32 status_code = 1; // 状态码,0-成功,其他值-失败
optional string status_msg = 2; // 返回状态描述
required int64 user_id = 3; // 用户id
required string token = 4; // 用户鉴权token
}
go
复制代码
func Register(username, password string) (id int64, token int64, err error) {
if len(username) > 32 {
return 0, 0, errors.New("用户名过长,不可超过32位")
}
if len(password) > 32 {
return 0, 0, errors.New("密码过长,不可超过32位")
}
// 先查布隆过滤器,不存在直接返回错误,降低数据库的压力
if userNameFilter.TestString(username) {
return 0, 0, errors.New("用户名已经存在!")
}
//雪花算法生成token
node, err := snowflake.NewNode(1) //这里的userIdInt64就是 User.Id(主键)
if err != nil {
log.Println("雪花算法生成id错误!")
log.Println(err)
}
token1 := node.Generate().Int64()
tokenStr := strconv.FormatInt(token1, 10)
user := domain.User{}
// 再查缓存
data, err := dao.RedisClient.Get(context.Background(), tokenStr).Result()
if err == redis.Nil {
fmt.Println("token does not exist")
} else if err != nil {
fmt.Println("Error:", err)
} else {
num, err := strconv.ParseInt(data, 10, 64)
if err != nil {
fmt.Println("Error:", err)
return num, 0, err
}
return num, token1, nil
}
//在查数据库
user = domain.User{}
dao.DB.Model(&domain.User{}).Where("name = ?", username).Find(&user)
if user.Id != 0 {
return 0, 0, errors.New("用户已存在")
}
user.Name = username
// 加密存储用户密码
user.Salt = randSalt()
buf := bytes.Buffer{}
buf.WriteString(username)
buf.WriteString(password)
buf.WriteString(user.Salt)
pwd, err1 := bcrypt.GenerateFromPassword(buf.Bytes(), bcrypt.MinCost)
if err1 != nil {
return 0, 0, err
}
user.Pwd = string(pwd)
//存在mysql里边
dao.DB.Model(&domain.User{}).Create(&user)
//再把用户id作为键 用户的所有信息作为值存在其中
//用户信息的缓存是 保存在redis中 一个以id为键 user json为值
jsonuser, err1 := MarshalUser(user)
if err1 != nil {
fmt.Println("err1", err1)
return 0, 0, err1
}
err = dao.RedisClient.Set(context.Background(), strconv.FormatInt(user.Id, 10), jsonuser, 0).Err()
if err != nil {
fmt.Println("err", err)
return 0, 0, err
}
// 布隆过滤器中加入新用户
userIdFilter.AddString(strconv.FormatInt(user.Id, 10))
userNameFilter.AddString(username)
return user.Id, token1, nil
}
La función de registro de esta interfaz se realiza: toda la información se almacena en mysql, por supuesto, la información también existe en redis y, por supuesto, el nombre de usuario también se almacena en el filtro Bouillon. Al recibir el nombre de usuario del usuario, primero verificamos si está en el filtro Bouillon Si existe, devolverá directamente err, si no existe, entonces consúltelo en redis, porque redis es más liviano que mysql, por lo que primero debemos verificarlo en redis, y si puede' t se encuentra, luego verifíquelo en mysql, no puedo encontrarlo, lo que indica que no me he registrado, puede registrarse.
命名规范
Siga los principios de las convenciones de nomenclatura.
Middleware层中间件
El middleware en el framework gin se divide en middleware global y middleware local. Entonces, ¿qué es el software intermedio? El middleware es un software que proporciona servicios y funcionalidades comunes a las aplicaciones. La gestión de datos, el servicio de aplicaciones, la mensajería, la autenticación y la gestión de API a menudo pasan por un middleware. En el marco de gin, todas nuestras interfaces API deben pasar a través de nuestro middleware y podemos realizar algún procesamiento de intercepción en el middleware.
Modelos comunes de middleware
software intermedio global
Esto se registra cuando se inicia el servicio y global significa que todas las interfaces API pasarán por aquí. El middleware de Gin se Use
configura a través de un método, que recibe un parámetro variable, por lo que podemos configurar varios middleware al mismo tiempo.
Primero define de la siguiente manera
go
复制代码
// 1.创建路由
r := gin.Default() //默认带Logger(), Recovery()这两个内置中间件
r:= gin.New() //不带任何中间件
// 注册中间件
r.Use(MiddleWare())
r.Use(MiddleWare2())
Por favor, tenga en cuenta
gin.Default()
De forma predeterminada, se utilizan Logger
middleware Recovery
, entre los cuales: El middleware registrador escribe registros gin.DefaultWriter
incluso si está configurado GIN_MODE=release. El middleware de recuperación hará recover
cualquier cosa panic
. Si hay pánico, se escribirá un código de respuesta 500. Si no desea utilizar los dos middleware predeterminados anteriores, puede crear gin.New()
una nueva ruta sin ningún middleware predeterminado.
go
复制代码
// 定义中间
func MiddleWare() gin.HandlerFunc {
return func(c *gin.Context) {
t := time.Now()
fmt.Println("中间件开始执行了")
// 设置变量到Context的key中,可以通过Get()取
c.Set("request", "这是中间件设置的值")
status := c.Writer.Status()
fmt.Println("中间件执行完毕", status)
t2 := time.Since(t)
fmt.Println("time:", t2)
}
}
Luego inicie nuestro servicio y acceda a cualquier interfaz para ver el resultado de la siguiente manera
Esta es la solicitud que primero llega al middleware y luego llega a nuestra interfaz API. En el middleware, puede establecer la variable en la clave del Contexto y luego obtener el valor en nuestra interfaz API.
go
复制代码
r.GET("/", func(c *gin.Context) {
// 取值
req, _ := c.Get("request")
fmt.Println("request:", req)
// 页面接收
c.JSON(200, gin.H{"request": req})
})
En este momento, puede ver que el valor establecido por el middleware es
next
El método se utiliza en el middleware, lo que 后续中间件
significa ejecutar el procesamiento de la solicitud (incluido el middleware no ejecutado y el procesamiento del método GET que definimos, si se registran varios middleware continuamente, se ejecutarán en orden de primero en entrar, último en salir). next就去执行下一个中间件里的next前面方法
.
go
复制代码
// 执行函数
c.Next()
// 中间件执行完后续的一些事情
software intermedio parcial
El middleware parcial significa que algunas interfaces surtirán efecto y solo se usarán localmente. En este momento, visite http:127.0.0.1:8000/ para ver la impresión del registro del middleware y otras interfaces API no aparecerán.
go
复制代码
//局部中间件使用
r.GET("/", MiddleWare(), func(c *gin.Context) {
// 取值
req, _ := c.Get("request")
fmt.Println("request:", req)
// 页面接收
c.JSON(200, gin.H{"request": req})
})
middleware integrado de ginebra
go
复制代码
func BasicAuth(accounts Accounts) HandlerFunc
func BasicAuthForRealm(accounts Accounts, realm string) HandlerFunc
func Bind(val interface{}) HandlerFunc
func ErrorLogger() HandlerFunc
func ErrorLoggerT(typ ErrorType) HandlerFunc
func Logger() HandlerFunc
func LoggerWithConfig(conf LoggerConfig) HandlerFunc
func LoggerWithFormatter(f LogFormatter) HandlerFunc
func LoggerWithWriter(out io.Writer, notlogged ...string) HandlerFunc
func Recovery() HandlerFunc
func RecoveryWithWriter(out io.Writer) HandlerFunc
func WrapF(f http.HandlerFunc) HandlerFunc
func WrapH(h http.Handler) HandlerFunc
Resumir
A través del middleware personalizado, podemos interceptar fácilmente las solicitudes para hacer algunas cosas que necesitamos hacer, como el registro, la verificación de autorización, varios filtros, etc.
Digresión
En este primer año de tecnología de rápido crecimiento, la programación es como un boleto a un mundo de infinitas posibilidades para muchas personas. En la alineación estelar de los lenguajes de programación, Python es como la superestrella líder. Con su sintaxis concisa y fácil de entender y sus potentes funciones, se destaca y se convierte en uno de los lenguajes de programación más populares del mundo.
El rápido ascenso de Python es extremadamente beneficioso para toda la industria , pero " 人红是非多
" ha provocado que agregue muchas críticas, pero aún no puede detener su gran impulso de desarrollo.
¿Python seguirá siendo relevante e intacto durante el resto de la próxima década? Hoy, vamos a analizar los hechos y disipar algunos conceptos erróneos.
Si está interesado en Python y desea obtener un salario más alto aprendiendo Python, ¡entonces el siguiente conjunto de materiales de aprendizaje de Python debe serle útil!
Los materiales incluyen: paquete de instalación de Python + código de activación, desarrollo web de Python, rastreador de Python, análisis de datos de Python, inteligencia artificial, aprendizaje automático y otros tutoriales de aprendizaje. Incluso los principiantes con 0 conceptos básicos pueden entender y comprender. ¡Siga el tutorial y lo llevará a aprender Python sistemáticamente desde cero conceptos básicos!
1. Rutas de aprendizaje en todas las direcciones de Python
La ruta de todas las direcciones en Python es organizar los puntos técnicos comúnmente utilizados de Python para formar un resumen de los puntos de conocimiento en varios campos. Su utilidad radica en que puede encontrar los recursos de aprendizaje correspondientes de acuerdo con los puntos de conocimiento anteriores para asegurarse de que aprende de manera más integral.
2. Software de aprendizaje Python
Si un trabajador quiere hacer un buen trabajo, primero debe afilar sus herramientas. ¡El software de desarrollo comúnmente utilizado para aprender Python está aquí!
3. Video de aprendizaje introductorio de Python
También hay muchos videos de aprendizaje adecuados para comenzar con los conceptos básicos de 0. Con estos videos, puede comenzar fácilmente con Python ~
4. Ejercicios de Python
Después de cada lección de video, hay preguntas de práctica correspondientes, ¡puedes probar los resultados de aprendizaje, jaja!
Cinco, caso de combate real de Python
La teoría óptica es inútil. Tienes que aprender a escribir códigos junto con ella, y luego puedes aplicar lo que has aprendido en la práctica. En este momento, puedes aprender de algunos casos prácticos. Esta información también está incluida~
6. Materiales de entrevista de Python
¡Después de haber aprendido Python, podemos salir y encontrar un trabajo con las habilidades! Las siguientes preguntas de la entrevista son todas de las principales empresas de Internet, como Ali, Tencent, Byte, etc., y algunos jefes de Ali han dado respuestas autorizadas. Después de leer este conjunto de materiales de entrevista, creo que todos pueden encontrar un trabajo satisfactorio.
7. Recopilación de información
El conjunto completo de materiales de aprendizaje para la versión completa de Python mencionada anteriormente se cargó en el sitio web oficial de CSDN. Aquellos que lo necesiten pueden escanear el código QR de la certificación oficial de CSDN a continuación en WeChat para recibirlo de forma gratuita.