【Red informática】HTTP/HTTPS

Protocolo de red HTTP

Aunque decimos que el protocolo de la capa de aplicación está determinado por nuestros programadores, de hecho, algunos grandes han definido algunos protocolos de capa de aplicación listos para usar y muy útiles para nuestra referencia directa. HTTP (acuerdo de transferencia de hipertexto) es uno de ellos

Comprender los protocolos de red

El protocolo es una especie de "acuerdo". La interfaz de socket api, al leer y escribir datos, se envía y recibe en forma de "cadena". ¿Qué pasa si queremos transmitir algunos "datos estructurados"?

En primer lugar, podemos almacenar estos datos estructurados en una estructura. Ambas partes en la comunicación conocen esta estructura. Al recibir y enviar solicitudes o respuestas, podemos usar la estructura para recibir, y así lograr el propósito de transmitir datos estructurados. ¿Y cómo se define la estructura y cuáles son los miembros internos de la estructura? Este es un acuerdo entre el cliente y el servidor antes de la comunicación.La premisa de la comunicación es que ambas partes conocen y están dispuestas a cumplir con este acuerdo.

Calculadora sencilla en línea

Consulte la nube de código para conocer todos los detalles del código

El uso de estas dos estructuras es un contrato (protocolo) definido por nosotros mismos, ¡tanto el cliente como el servidor que creamos deben cumplirlo! Esto se llama un protocolo personalizado.

La calculadora de versión en línea en modo cs que escribimos es esencialmente un servicio de red de capa de aplicación. El código de comunicación básico lo escribimos nosotros. La serialización y la deserialización (que se discutirá más adelante) se completan a través de componentes, solicitudes. Lo hicimos nosotros mismos cuando acordamos el formato del resultado, y también escribimos la lógica empresarial nosotros mismos.

A través de esta versión simple de la calculadora, podemos establecer una comprensión preliminar de las tres capas superiores del modelo OSI de siete capas.

[Error en la transferencia de imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-WTyDpKFQ-1674359312023) (C:\Users\Lenovo\AppData\Roaming\Typora \typora-user-images\ image-20230117092635849.png)]

//请求结构体
typedef struct request{
    
     //请求结构体
    int x; 				//数字1	
    int y;				//数字2
    char op;			//运算符
}request_t;

//响应结构体
// response format 相应格式
typedef struct response{
    
    
    int sign;			//标志位,反应结果是否可靠
    int result; 		//结果
}response_t;

Parte del código de comunicación del servidor

// 服务器 
// 1.Read request
  request_t req;							  //创建请求结构体接收请求
  memset(&req, 0, sizeof(req));		
  ssize_t s = read(sock, &req, sizeof(req));  //将网络数据传输给请求结构体对象
  std::cout << "get a request, request size = " << sizeof(req) << std::endl;
  std::cout << s << " " << req.x << req.op << req.y << std::endl; 
  if (s == sizeof(req)){
    
    			
    // Read full request success 			 //若获取的请求完整
    // 2.prase request 						 //解析请求信息,构建响应结构体
    std::cout << "prase request" << std::endl;
    response_t resp{
    
    0 , 0};					 
    switch (req.op){
    
    						 //通过请求信息来构建响应
      case '+':
        resp.result = req.x + req.y;
        break;
      case '/':
        if (req.y == 0) resp.sign = 1;
        else resp.result = req.x / req.y;
        break;
      default:
        resp.sign = 3; // request method errno
        break;
    }
    // send response
    std::cout << "return response" << std::endl;
    write(sock, &resp, sizeof(resp));	 	 //将构建的响应发送给客户端
  }

Parte del código de comunicación del cliente

  // 客户端
  request_t req;						//从标准输入(客户)得到数据保存到结构体中
  cout << "Please Enter Date One# ";
  cin >> req.x;
  cout << "Please Enter Date Two# ";
  cin >> req.y;
  cout << "Please Enter Operator";
  cin >> req.op;

  write(sock, &req, sizeof(req));	 	//将结构体发送给服务器
  response_t resp;						//创建响应结构体接收服务器响应
  ssize_t s = read(sock, &resp, sizeof(resp)); //读取响应内容打印结果
  if (s == sizeof(resp)){
    
    
    if (resp.sign == 1){
    
    
      std::cout << "除零错误" << std::endl;
    }
    else if (resp.sign == 3){
    
    
      std::cout << "非法运算符" << std::endl;
    }
    else {
    
    
      std::cout << "result = " << resp.result << std::endl;
    }
  }

A través del código anterior, hemos completado la transmisión de datos estructurados de red a través del protocolo definido por nosotros mismos utilizando la estructura, pero este método tiene desventajas muy obvias. En primer lugar, debemos asegurarnos de que la alineación de memoria del cliente y del servidor debe ser la misma . En segundo lugar, una vez que se actualice el servidor y se modifique la estructura transmitida, todos los clientes anteriores no podrán utilizarlo , porque los formatos de las dos estructuras son diferentes Entonces no hay esperanza de que los datos transmitidos se puedan sacar como están. Además, el tamaño de algunos datos en muchos escenarios no es fijo , como el chat de WeChat, ¿cómo saber el tamaño de un mensaje enviado por una persona y cuánto espacio debemos abrir para la estructura del mensaje? ? Si se configura demasiado grande, se desperdiciarán los recursos de la red, si se configura demasiado pequeño, puede ser un poco más largo y se producirán problemas como truncamiento o caracteres ilegibles.

Para resolver los problemas anteriores, los programadores anteriores propusieron serialización y deserialización.

Serialización y deserialización

Cuando un host quiere cargar datos a la red, serializa los datos y luego los transmite a la red. Después de que un host quiera leer datos de la red, necesita deserializar los datos en la red

JSON es una herramienta de serialización y deserialización comúnmente utilizada en nuestro desarrollo diario.

sudo yum install -y jsoncpp-devel //安装json

Transferencia de datos JSON

Serialización JSON
#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>

typedef struct request{
    
    
    int x;
    int y;
    char op;
}request_t;

int main(){
    
    
    request_t req{
    
    10, 20, '*'};
    //序列化过程
    Json::Value root; //可以承装任何对象,json是一种kv式的序列化方案
    root["datax"] = req.x;
    root["datay"] = req.y;
    root["operator"] = req.op;

    // Json::StyledWriter writer;
    Json::FastWriter writer;
    writer.write(root);
    std::string json_string = writer.write(root);
    std::cout << json_string << std::cout;
    return 0;
}

Json::StyledWriter类型对象构建的json_string 
    
{
    
    "datax":10,"datay":20,"operator":42}

Json::FastWriter 类型对象构建的json_string
    
{
    
    
   "datax" : 10,
   "datay" : 20,
   "operator" : 42
}
[clx@VM-20-6-centos JsonTest]$ ldd a.out
        linux-vdso.so.1 =>  (0x00007fffddfee000)
        /$LIB/libonion.so => /lib64/libonion.so (0x00007f80236f2000)
        libjsoncpp.so.0 => /lib64/libjsoncpp.so.0 (0x00007f80233a2000) // 这就是第三方组件,也就是一个动态库
        libstdc++.so.6 => /home/clx/.VimForCpp/vim/bundle/YCM.so/el7.x86_64/libstdc++.so.6 (0x00007f8023021000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f8022d1f000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f8022b09000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f802273b000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f8022537000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f80235d9000)
Deserialización de JSON
int main(){
    
    
    // 反序列化
    std::string json_string = R"({"datax":10, "datay":20, "operator":42})";//R()可以防止内部字符部分字符被转义
    Json::Reader reader; //使用Json::Reader类型对象反序列化 序列化数据,放入万能对象root中
    
    Json::Value root;
    reader.parse(json_string, root);
    request_t req;
    req.x = root["datax"].asInt();//root使用key来查找value数据,并使用asInt()函数转化成对应类型
    req.y = root["datay"].asInt();
    req.op = root["operator"].asUInt();
    std::cout << req.x << " " << req.op << " "<< req.y << std::endl;
    return 0; 
}

Optimizar Calculadora con JSON

1. Use JSON para serializar y deserializar las estructuras de solicitud y respuesta respectivamente

std::string SerializeRequest(const request_t &req){
    
    
    Json::Value root;
    root["datax"] = req.x;
    root["datay"] = req.y;
    root["operator"] = req.op;

    Json::FastWriter writer;
    std::string json_string = writer.write(root);
    return json_string;
}

void DeserializeRequest(const std::string &json_string, request_t &out){
    
    
    Json::Reader reader;
    
    Json::Value root;
    reader.parse(json_string, root);
    out.x = root["datax"].asInt();
    out.y = root["datay"].asInt();
    out.op = root["operator"].asUInt();
}

std::string SerializeResponse(const response_t &resp){
    
    
    Json::Value root;
    root["sign"] = resp.sign;
    root["result"] = resp.result;

    Json::FastWriter writer;
    std::string json_string = writer.write(root);
    return json_string;
}

void DeserializeResponse(const std::string &json_string, response_t &out){
    
    
    Json::Reader reader;
    
    Json::Value root;
    reader.parse(json_string, root);
    out.sign = root["sign"].asInt();
    out.result = root["result"].asInt();
}

2. Use cadenas JSON para transmitir datos dentro de la red

  //1.Method2 ReadRequest 从网络中读取Json字符串
  char buffer[1024] = {
    
    0};
  ssize_t s = read(sock, buffer, sizeof(buffer) - 1);
  buffer[s] = 0;
  if (s > 0){
    
    
    request_t req;
    DeserializeRequest(buffer, req);
      
  // send response 将结构化数据进行序列化后再发送
    std::string json_string = SerializeResponse(resp);
    write(sock, json_string.c_str(), json_string.size());
    std::cout << "return response successs" << std::endl;

Comprender formalmente el protocolo HTTP

Aunque decimos que el protocolo de la capa de aplicación está determinado por nuestros programadores, de hecho, algunos grandes han definido algunos protocolos de capa de aplicación listos para usar y muy fáciles de usar para nuestra referencia directa.**HTTP (protocolo de transferencia de supertexto) ** es uno de

El protocolo HTTP es esencialmente el mismo que la calculadora de red que acabamos de escribir. Es un protocolo de capa de aplicación. También implementa tres pasos en nuestra calculadora de red: 1. Comunicación de red 2. Serialización y deserialización 3. Detalle del protocolo

Comprensión básica de URL

Por lo general, lo que llamamos un sitio web es en realidad una URL

Las imágenes y videos que solicitamos se denominan recursos, y estos recursos se almacenan en una máquina Linux en la red. IP + Puerto identifica de forma única un proceso, pero no puede identificar de forma única un recurso. Sin embargo, los sistemas operativos tradicionales almacenan recursos en archivos.Para un solo sistema Linux, la forma de identificar recursos únicos es a través de rutas.

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-4cJ4B5LL-1674359312024) (C:\Users\Lenovo\AppData\Roaming\Typora\ typora-user-images\ image-20230117095522126.png)]

IP + PortIdentificar de forma única un proceso (la IP generalmente se presenta como un nombre de dominio)

IP+Linux路径Un recurso de red se puede identificar de forma única (la ruta se puede confirmar con el nombre del directorio + /)

Los protocolos de red comunes, como HTTP, tienen sus propios números de puerto de servidor especificados , que es como llamar a la policía 110. Todos los chinos saben que 110 es el número de llamada de la policía. Y todos aquellos que han estudiado programadores de redes también saben que HTTP corresponde al número de puerto 80, por lo que este número de puerto se puede omitir en muchos casos.

urlencode y urldecode

Caracteres como /?: han sido entendidos por url como significados especiales. Por lo tanto, estos caracteres no pueden aparecer aleatoriamente. Por ejemplo, si un parámetro necesita contener estos caracteres especiales, los caracteres especiales deben escaparse primero.

Las reglas de escape son las siguientes: Convierta los caracteres a transcodificar en hexadecimales y luego, de derecha a izquierda, tome 4 dígitos (menos de 4 dígitos y procéselos directamente), haga un dígito por cada 2 dígitos, agregue % al frente y codificarlo como formato % XY

Por ejemplo, buscamos traducción y C++ en Baidu respectivamente
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Observando la URL anterior, podemos encontrar que hay un campo wd para transmitir nuestras palabras clave de búsqueda, la traducción no ha cambiado en la URL, y los dos signos más en C++ se escapan debido a caracteres como + Se entiende por url como un significado especial, y se escapará antes de la transmisión

Podemos usar esta herramienta de escape para escapar de nuestra propia cadena y ver su forma en la URL

formato de protocolo HTTP

Ya sea una solicitud o una respuesta, http construye la solicitud o la respuesta en unidades de líneas (\n). Ya sea una solicitud o una respuesta, se compone casi de 3 o 4 partes

Cómo comprender el comportamiento en línea de los usuarios comunes 1. Obtenga los recursos que desea del servidor de destino 2. Cargue sus datos en el servidor de destino

Solicitud HTTP

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-jbw4HkaW-1674359312025) (C:\Users\Lenovo\AppData\Roaming\Typora\ typora-user-images\ image-20230117103231286.png)]

La primera parte de la línea de solicitud (la primera línea) consta del método de solicitud + url (el contenido después de eliminar el nombre de dominio) + versión del protocolo http + \n

La segunda parte es el encabezado de la solicitud (Header), un par clave-valor separados por dos puntos; cada grupo de atributos está separado por \n; una línea en blanco indica el final de la parte Header

La tercera parte está en blanco\n

La cuarta parte del cuerpo de la solicitud (Cuerpo) (si corresponde) son los datos enviados por el usuario. El cuerpo de la solicitud puede ser una cadena vacía. Si el cuerpo existe, habrá un atributo de longitud de contenido en el encabezado para identificar la longitud del cuerpo

Las tres primeras partes se denominan encabezados de solicitud HTTP y la cuarta parte se convierte en la carga útil HTTP.

Respuesta HTTP

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-PsDLkPxb-1674359312026) (C:\Users\Lenovo\AppData\Roaming\Typora\ typora-user-images\ image-20230117104512531.png)]

La primera parte de la línea de estado (la primera línea) se describe mediante la versión del protocolo http + código de estado + código de estado

La segunda parte es el encabezado de la solicitud (Header), un par clave-valor separados por dos puntos; cada grupo de atributos está separado por \n; una línea en blanco indica el final de la parte Header

La tercera parte está en blanco\n

La cuarta parte es el cuerpo de la respuesta (Cuerpo) (si corresponde) Los datos enviados por el usuario, el cuerpo de la respuesta puede ser una cadena vacía. Si el cuerpo existe, habrá un atributo de longitud de contenido en el encabezado para identificarlo. la longitud del cuerpo de respuesta

Las tres primeras partes se denominan encabezados de respuesta HTTP y la cuarta parte se convierte en la carga útil HTTP.

pensar:

1. Cómo descomprimir respuestas o solicitudes HTTP y cómo compartirlas

2. ¿Cómo se lee la solicitud o respuesta HTTP? enviar como cadena

3. ¿Cómo se envía la solicitud HTTP? leer como cadena

4. ¿Cómo se tratan la solicitud http y la respuesta http? cuerda

Cómo desempaquetar: tratamos la solicitud y la respuesta como una cadena grande, y la línea en blanco es un carácter especial en el protocolo HTTP. Use una línea en blanco para distinguir el encabezado HTTP de la carga útil. Cuando leemos los datos línea por línea, cuando no hay datos en esta línea y solo \n, sabemos que se ha leído el encabezado HTTP y la siguiente parte es la carga útil

Cómo compartir: Esto no lo resuelve http, sino códigos de aplicación específicos. HTTP necesita una interfaz para ayudar a la capa superior a obtener parámetros

método HTTP

[Error en la transferencia de imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-LW0qNJhh-1674359312026) (C:\Users\Lenovo\AppData\Roaming\Typora \typora-user-images\ image-20230118101413117.png)]

La compatibilidad con el protocolo no significa que el servidor admita este método, el servidor admitirá varios métodos según su propia situación.

Códigos de estado HTTP comunes

[Error en la transferencia de imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-kz8V9iYA-1674359312026) (C:\Users\Lenovo\AppData\Roaming\Typora \typora-user-images\ image-20230118100201726.png)]

Los códigos de estado más comunes, como 200 (OK), 404 (No encontrado), 403 (El permiso prohibido es demasiado bajo para acceder), 301 (redireccionamiento permanente), 302 o 307 (Redireccionamiento, redireccionamiento temporal), 504 (Puerta de enlace incorrecta).

Redirección permanente: por ejemplo, si un sitio web se actualiza y la URL también se actualiza, establece una redirección permanente en la URL original, para que pueda saltar a la nueva página cuando visite la URL anterior.

Redirección temporal: por ejemplo, al realizar un pedido en Meituan, saltará a la interfaz de pedidos desde Meituan y volverá automáticamente a la interfaz original después de realizar el pedido.

La capa de aplicación requiere que las personas participen, y el nivel de las personas es desigual. Muchas personas no saben cómo usar el código de estado http en absoluto, y debido a que hay tantos navegadores, el soporte de todos para el código de estado no es particularmente bueno. A veces escribes un error El código de estado todavía se puede mostrar. Entonces, ahora el código de estado 404 no tiene un significado de guía para el navegador, y el navegador simplemente muestra su página web normalmente.

Encabezado común HTTP

Content-Type: 数据类型(text/html等)
Content-Length: Body的长度
Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
User-Agent: 声明用户的操作系统和浏览器版本信息;
referer: 当前页面是从哪个页面跳转过来的;
location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;
Conection: 1.0只有短链接,HTTP1.1版本之后支持长链接

Conection: keep-aliveenlace largo

Todos los experimentos que hicimos antes fueron para solicitar y responder a enlaces de desconexión, pero hay muchos recursos en un servidor, y una página web grande se compone de muchos recursos, y cada recurso debe iniciar una solicitud http. Sin embargo, http/1.1 lanzó una versión de enlace largo, y el enlace entre las dos partes solo se establece una vez, y el enlace se cierra después de que se completan todas las interacciones de recursos. Para lograr el propósito de mejorar la eficiencia al reducir el establecimiento frecuente de la hermana TCP Lina

Cree un servidor HTTP simple

Diseño de página frontal simple

Este sitio web contiene un front-end simple y un tutorial de escritura Mina HTML w3cschool , hice una interfaz HTML de página de inicio simple a través del formulario de este sitio web

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <h3>hello net</h3> 
        <h5>hello 我是表单</h5>
        <from action="/a" method = "POST">
            姓名:<input type="text" name="name"><br/>
            密码:<input type="password" name="passwd"><br/>
            <input type="submit" value="登录"> <br/>
        </from>
    </body>
</html>

Construcción del servidor HTTP

//这里使用了专门的网络写入读取接口
ssize_t recv(int sockfd, void *buf, size_t len, int flags);  
ssize_t send(int sockfd, const void *buf, size_t len, int flags);

Este grupo de interfaces es exactamente igual a nuestras interfaces de lectura y escritura, falgsbasta con configurar el último parámetro a 0. Para otros usos, puede usar el man recvcomando para ver el documento.

#include "Sock.hpp"
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fstream>

#define WWWROOT "./wwwroot/"    //根目录
#define HOME_PAGE "index.html"	//首页

void Usage(std::string proc){
    
    
    std::cout << "Usage " << proc << " port " << std::endl; 
}

void* HandlerHttpRequest(void* args){
    
    
    int sock = *(int*)args;
    delete (int*)args;
    
    pthread_detach(pthread_self());
#define SIZE 1024 * 10
    char buffer[SIZE];
    memset(buffer, 0, SIZE);
    ssize_t s = recv(sock, buffer, sizeof(buffer) - 1, 0);
    if (s > 0){
    
    
        buffer[s] = 0;
        std::cout << buffer << std::endl;                 //查看浏览器发来的HTTP请求
        //构建HTTP响应
        // std::string http_response = "http/1.0 200 OK\n";  //构建响应状态行
        // http_response += "Content-Type: text/plain\n";    //正文的属性
        // http_response += "\n";                            //空行
        // http_response += "hello net!";                    //正文  

        std::string html_file = WWWROOT;
        html_file += HOME_PAGE;
        // 返回的时候不仅仅是返回正文网页信息,而是要包括http请求
        std::string http_response = "http/1.0 200 OK\n";
        // 正文部分的数据类型
        http_response += "Content-Type: text/html; charset=utf8\n";
        struct stat st;
        stat(html_file.c_str(), &st);
        http_response += "Content-Length: ";
        http_response += std::to_string(st.st_size);
        http_response += "\n";
        http_response += "\n";
        //std::cout << http_response << std::endl;
        //响应正文
        std::ifstream in(html_file);
        if (!in.is_open()){
    
    
            std::cerr << "open html error!" << std::endl;
        }
        else {
    
    
            std::cout << "open success" << std::endl;
            std::string content;
            std::string line;
            while (std::getline(in, line)){
    
    
                content += line;
            }
            //std::cout << content << std::endl;
            http_response += content;
            //std::cout << http_response << std::endl;
        }
        send(sock, http_response.c_str(), http_response.size(), 0);
    }
    close(sock);
    return nullptr;
}
int main(int argc, char* argv[]){
    
    
    if (argc != 2) {
    
     Usage(argv[0]); return 1;}
    uint16_t port = atoi(argv[1]);
    int listen_sock = Sock::Socket();
    Sock::Bind(listen_sock, port);
    Sock::Listen(listen_sock);

    for ( ; ; ){
    
    
        int sock = Sock::Accept(listen_sock);
        if (sock > 0){
    
    
            pthread_t tid;
            int *psock = new int(sock);
            pthread_create(&tid, nullptr, HandlerHttpRequest, (void*)psock);
        }
    }
}

Aquí comenzamos el servidor HTTP con el número de puerto 9090. Aunque el servidor HTTP generalmente usa el puerto 80, esto es solo un hábito común, no significa que el servidor HTTP no pueda usar otros números de puerto.

Ejecute nuestro programa para recibir solicitudes HTTP de la red. Podemos usar el navegador para enviar solicitudes a nuestro programa. Solo necesitamos ingresar nuestro en el navegador, y podemos 公网IP:端口号ver que el navegador nos envía. La solicitud HTTP entrante es la siguiente

GET / HTTP/1.1                //请求行
Host: 101.43.252.201:8888	  //请求报头
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
							 //空行 到此HTTP请求报头结束,这个请求没有正文
GET / HTTP/1.1                //请求行

Puede ver que el método de solicitud es seguido por un /directorio raíz web. Generalmente iniciamos una solicitud para obtener un recurso específico en un servidor. Podemos identificar de forma única un recurso por IP + ruta. Si la ruta solicitada /es Queremos solicitar el página de inicio del sitio web

Los tipos comunes de Content-Type se pueden ver en el blog de este blogger, que es muy completo

¿Cómo juzgar que hemos terminado de leer la parte del encabezado? ? leer línea en blanco

Después de leer la parte del encabezado, podemos extraer correctamente varios atributos de la parte del encabezado, incluido Content-Length

Determine si hay algún texto después de la línea en blanco, está relacionado con el método de solicitud

Si es el texto, ¿cómo asegurar que se lea todo el texto y no se lean los datos del próximo HTTP? ?
Si hay un cuerpo, la parte del encabezado consta de un atributo: Content-Length: len, que indica de cuántos bytes consta el cuerpo

Métodos GET y POST

Método GET: también conocido como método de adquisición, es el método más utilizado. De forma predeterminada, todas las páginas web se obtienen mediante el método GET, pero si desea utilizar el método GET para enviar parámetros, los parámetros se empalmarán. a través de la URL y enviado al servidor.

Método POST: también conocido como método push, es un método común para enviar parámetros, pero si envía parámetros, generalmente se envía a través de la parte del cuerpo, pero no olvide que Content-Length: XXX indica la longitud del cuerpo

POST frente a OBTENER

La ubicación del envío de parámetros es diferente, y el método POST es más privado (¡privado! = seguro, seguro = encriptado), ¡y no se repetirá en el cuadro de URL del navegador! El método get no es privado y reflejará información importante en el cuadro de entrada de URL, lo que aumenta el riesgo de robo

¡GET se pasa a través de la URL y la URL tiene un límite de tamaño! Específicamente relacionado con el navegador. La parte del cuerpo pasa el método POST y el tamaño general no está limitado

Si los parámetros enviados no son confidenciales y el número es muy pequeño, puede usar el método GET; de lo contrario, use el método POST

Cookies y Sesiones

En la vida diaria, encontramos que cuando saltan varias páginas, la esencia es que el sitio web aún me conoce después de realizar varias solicitudes http. Por ejemplo, soy un gran miembro de la estación B, no importa cómo busque videos en la estación B, no me permitirá volver a iniciar sesión, pero el protocolo HTTP es un protocolo sin estado, solo le importa si esta solicitud es exitosa, y las solicitudes anteriores no guarda ningún registro

Permitir que el sitio web me conozca no es un problema que deba resolver el propio protocolo HTTP. HTTP puede proporcionar cierto soporte técnico para garantizar que el sitio web tenga una función de retención de sesión. Una cookie es una herramienta de gestión de sesión.

  1. Navegador: una cookie es en realidad un archivo que almacena información privada de nuestro usuario
  2. Protocolo http: una vez que el sitio web corresponde a una cookie, cuando se inicia cualquier solicitud, la información de la cookie se llevará automáticamente en la solicitud
//Set-Cookie: 服务器向浏览器设置一个cookie
http_response += "Set-Cookie: id=1111111111\n"; 
http_response += "Set-Cookie: password=2222\n"; 

Agregamos dos líneas a la respuesta HTTP, usamos el navegador para enviar una solicitud al servidor y agregamos el atributo Set-Cookie al encabezado de respuesta del servidor para configurar el archivo de cookies del navegador.

[Error en la transferencia de imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-Psmt84o1-1674359312027) (C:\Users\Lenovo\AppData\Roaming\Typora \typora-user-images\ image-20230118193436875.png)]

Use el navegador para enviar la solicitud nuevamente, y podrá ver que la solicitud contiene información de cookies

GET / HTTP/1.1
Host: 101.43.252.201:8889
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: id=1111111111; password=2222 //Cookie信息

Formato de almacenamiento del archivo de cookies del navegador: 1. versión del archivo 2. versión de la memoria

La diferencia es que después de iniciar sesión en un sitio web, cerrar el navegador y luego abrir el sitio web, si la página web iniciada aún lo reconoce, si aún lo sabe, se guarda en la versión del archivo y si no lo hace. No lo sé, se guarda en la versión de memoria.

Entonces, si alguien más roba nuestro archivo de cookies, otros pueden acceder a recursos específicos con mi autenticación de identidad. Si se guardan nuestro nombre de usuario y contraseña, será muy malo . Entonces, simplemente usar cookies tiene ciertos riesgos de seguridad, por lo que aparece Session, pero usar Session no significa que no usemos cookies.

La idea central de Session: guardar la información privada del usuario en el lado del servidor

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-uEErO39O-1674359312028) (C:\Users\Lenovo\AppData\Roaming\Typora\ typora-user-images\ image-20230118200516017.png)]

El navegador envía la información privada al servidor, y el servidor autentica la información privada, crea un archivo de sesión y lo guarda en el servidor, luego genera un session_id único a través del archivo de sesión y establece el session_id en el archivo de cookies en el navegador. . Cuando volvamos a iniciar sesión, el navegador llevará automáticamente la información de la cookie (session_id) para enviar la solicitud, y el Servidor subsiguiente aún podrá reconocer al Cliente.

El navegador del usuario ya no guarda información privada, por lo que incluso si se filtra la información de la cookie del usuario, otros no obtendrán el nombre de usuario y la contraseña (información privada), pero el riesgo de filtración del archivo de la cookie aún existe y otros aún pueden usar la cookie. archivo para visitarnos Los sitios web visitados , porque el archivo de cookies está en la computadora del usuario, y el usuario carece de conciencia de protección.

** Para estos riesgos, las empresas de Internet también han realizado algunas medidas de defensa derivadas, como iniciar sesión desde otro lugar y volver a ingresar la contraseña de la cuenta. **Por ejemplo, hay algunos grupos ilegales de fraude de telecomunicaciones en Myanmar. Robaron la cuenta QQ de un beijinés e iniciaron sesión en Myanmar. La IP de inicio de sesión de esta cuenta QQ todavía estaba en Beijing hace un minuto, pero ahora la IP de inicio de sesión es se muestra como Myanmar El sistema detecta Si hay una excepción, las medidas de defensa se activarán y se le pedirá que vuelva a ingresar la contraseña de la cuenta. En este caso, el sistema determinará automáticamente que la cuenta ha sido robada y descartará el archivo de sesión original. Si vuelve a ingresar la contraseña de la cuenta, el sistema generará un nuevo archivo de sesión y session_id para usted.

HTTPS

capa de cifrado y descifrado

Todos los sitios web que podemos nombrar utilizan el protocolo HTTPS ¿Cuál es la diferencia entre el protocolo **HTTP y HTTPS? ? encriptación**

HTTPS = HTTP + TLS/SSL (capa de cifrado y descifrado de datos)

La capa de cifrado y descifrado se encuentra en la parte inferior de la capa de protocolo HTTP. HTTP primero accede a las interfaces de la capa de seguridad TLS y SSL, y luego la interfaz de la capa de seguridad llama a la interfaz de llamada del sistema, la interfaz de socket y los datos se cifrarán/descifrarán después. siendo leído por la interfaz de llamada del sistema. Entonces, HTTPS es el protocolo HTTP más una capa de cifrado y descifrado, y estas dos capas se denominan colectivamente HTTPS . Y, en la mayoría de los casos, solo se cifrarán los datos del usuario (carga útil), otros datos no son necesarios

dos métodos de cifrado

1. Cifrado simétrico, clave (solo una) X

Use la clave X para cifrar y también use la clave X para descifrar, por ejemplo:

data ^ X = result; // 加密
result ^ X = data; // 解密

2. El cifrado asimétrico tiene un par de claves: clave pública y clave privada

Puede cifrarse con la clave pública pero solo descifrarse con la clave privada o cifrarse con la clave privada y descifrarse solo con la clave pública. El clásico algoritmo de cifrado asimétrico RSA en términos generales, la clave pública está abierta al mundo y la clave privada debe mantenerse en privado.

Cómo confirmar que el texto permanece intacto después de ser transmitido por la red y detectar si ha sido manipulado

Podemos usar el algoritmo Hash hash para procesar el texto y formar una secuencia de cadena única de longitud fija llamada resumen de datos o huella digital de datos. (Algoritmo hash hash, siempre que solo haya una diferencia de puntuación en el texto, también generará un resultado hash muy diferente) , y luego realice el procesamiento del algoritmo de cifrado en el resumen de datos para generar una firma de datos. Envíe la firma de datos junto con el texto a otro host a través de la red. Después de recibir los datos, el otro extremo descifra la firma de datos para obtener la huella digital de datos 1 y luego procesa el texto con el algoritmo Hash hash para generar la huella digital de datos 2. Si las dos huellas digitales de datos son iguales, el texto no se ha manipulado.

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-nVrWi6b1-1674359312028) (C:\Users\Lenovo\AppData\Roaming\Typora\ typora-user-images\ image-20230118215816713.png)]

Aplicaciones prácticas del cifrado

Entonces, en nuestra vida diaria, ¿utilizamos cifrado simétrico o cifrado asimétrico? ?

Si usamos cifrado simétrico, ¿cómo debemos implementar la clave en ambos servidores? ? Podemos solucionar esto preinstalando todas las claves simétricas en la máquina por adelantado, pero el costo de la preinstalación es muy alto.Si cada servidor requiere que instalemos manualmente la clave, ¿es demasiado problemático? ¿Puedo usar Internet para descargar? La descarga es igual a la comunicación de red, por lo tanto, ¿debe cifrarse la clave de descarga? ? Incluso si ambas partes tienen una clave, ¿cómo deben negociar qué clave utilizar? ? Negociar la clave por primera vez no tiene absolutamente ningún cifrado . Entonces, usar directamente el cifrado simétrico es realmente inseguro

[Error en la transferencia de imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-NGsbpN6t-1674359312029) (C:\Users\Lenovo\AppData\Roaming\Typora\ typora-user-images\ image-20230122095057153.png)]

Si se utiliza el cifrado asimétrico, normalmente se utilizan dos pares de claves asimétricas para garantizar la seguridad de la comunicación. Tanto el cliente como el servidor tienen su propia clave pública y clave privada.Durante la fase de negociación de la clave pública, el servidor y el cliente se envían la clave pública entre sí (los datos no se cifran). Luego ingrese a la etapa de comunicación, los datos del cliente se cifran con la clave pública S de S y se envían al servidor, y luego el servidor usa su propia clave privada S` para descifrar y obtener los datos. De manera similar, el servidor cifra la respuesta utilizando la clave pública C del cliente, y luego transmite los datos cifrados al cliente, y el cliente los descifra con su propia clave privada para obtener los datos de respuesta . Un par de claves garantiza la seguridad de la comunicación en una dirección , pero cualquier método de cifrado asimétrico Sin embargo, existe el riesgo de robo ilegal, y el algoritmo de cifrado asimétrico es particularmente lento e ineficiente

Esquemas asimétricos + simétricos utilizados en la vida real

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-UGyZLgUB-1674359312029) (C:\Users\Lenovo\AppData\Roaming\Typora\ typora-user-images\ image-20230122100427830.png)]

Etapa clave de negociación: el servidor envía su propia clave pública S (sin cifrar) directamente al cliente, el cliente genera automáticamente una clave cifrada simétricamente X, la cifra con la clave pública S y la envía al servidor, y el servidor utiliza su propia clave privada S` para descifrar , se obtiene la clave simétrica X
Fase de comunicación: Tanto el Servidor como el Cliente conocen la clave simétrica X, y las dos partes se comunican a través de la clave simétrica X

ataque de hombre en el medio

En el enlace de la red, puede haber un man-in-the-middle para espiar y modificar nuestros datos en cualquier momento.Cuando el servidor y el cliente están negociando claves, pueden recibir ataques de man-in-the-middle.

[Error en la transferencia de imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-AqjTDN20-1674359312029) (C:\Users\Lenovo\AppData\Roaming\Typora \typora-user-images\ image-20230122102008467.png)]

El intermediario intercepta la clave pública S sin cifrar enviada por el servidor al cliente, la modifica en su propia clave pública M y luego la envía al cliente. El cliente genera automáticamente una clave simétrica X y luego cifra X con la clave pública M. clave y la envía al servidor. En este momento, incluso si el servidor obtiene los datos X cifrados, no puede completar el descifrado, porque el servidor no tiene M` . Si la información cifrada X es interceptada o espiada nuevamente por el intermediario, puede usar la clave privada para descifrar y obtener la clave simétrica X. De esta forma, el intermediario establece una comunicación con el cliente basada en la clave simétrica X, y la respuesta que recibe el usuario pasa de ser construida por el servidor a ser construida por el intermediario, y los datos del usuario se filtran por completo.

Problema esencial: el cliente no puede determinar si el mensaje de negociación de claves es enviado por un servidor legítimo

Autoridad de certificación de CA

[Error en la transferencia de imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-2V877F6T-1674359312030) (C:\Users\Lenovo\AppData\Roaming\Typora\ typora-user-images\ image-20230122114734557.png)]

Siempre que un proveedor de servicios esté certificado por una organización autorizada, la organización es legal. La organización CA es la autoridad de certificación autorizada en la red (también tiene su propia clave pública y clave privada)

El proveedor de servicios debe proporcionar su propia información básica (como: nombre de dominio, clave pública, etc.) para solicitar un certificado de CA, y la institución de CA creará un certificado basado en esta información. La información básica de la empresa es un fragmento de texto, y la organización de la CA utilizará los datos hash de Hash para generar huellas dactilares de datos y, a continuación, **cifrará con la clave privada de la organización de la CA (¡importante! ¡Importante! ¡Importante!)** para generar la firma digital de la empresa, luego construir el certificado y emitirlo al proveedor de servicios legítimo

[Error en la transferencia de imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-yYKZj5xz-1674359312030) (C:\Users\Lenovo\AppData\Roaming\Typora\ typora-user-images\ image-20230122112048895.png)]

Certificado: La firma digital generada por la organización de CA para la empresa + la empresa proporciona la información básica utilizada para solicitar el certificado

Por lo tanto, durante la etapa de negociación de claves entre el servidor y el cliente, el servidor solo necesita enviar el certificado CA al cliente, ya que la información básica de la empresa en el certificado contiene la clave pública del servidor S. Después de recibir el certificado, el cliente utiliza la clave pública de la organización de la CA para descifrar la firma de datos y, a continuación, procesa la información básica de la empresa para comparar si las dos huellas dactilares de datos son iguales. Si son iguales, significa que la fuente de datos es legal y continúe con el siguiente paso operar.

Nota: El cliente utiliza la clave pública de la organización CA para descifrar la firma de datos ¿Cómo conoce el cliente la clave pública de la organización CA? ?

Generalmente, está integrado, cuando descargamos el navegador, automáticamente nos ayudará a construir la clave pública de la organización de CA. Además, no solo hay una institución de CA. Si la empresa C proporciona un certificado de CA al servidor de una empresa, y la empresa A confía en la empresa B, y la empresa B confía en la empresa C, significa que tanto ABC como ABC confían en esta empresa. .

Una pequeña parte es que al acceder a la URL, el navegador puede solicitar al usuario que instale

Entonces, ¿puede el intermediario interceptar la información de su certificado? ? por supuesto que puede.

Pero, ¿puede un hombre en el medio modificar la clave pública en el certificado? ? Absolutamente no, porque si se modifica la información básica de la empresa, la huella digital de datos generada será diferente de la original. Siempre que el cliente descifre la firma de datos y haga un hash de la información modificada, se puede encontrar que la huella digital es diferente y los datos han sido modificados.

¿Puede reemplazar la información de clave pública empresarial y reemplazar la firma de datos? ? No, porque la firma de datos está encriptada por la clave privada de la organización de la CA, y el intermediario nunca conocerá la información de la clave privada de la organización de la CA. Si usa su propia clave privada para encriptar y generar una firma de datos, no puede usar la clave pública de la organización CA para descifrarla.

¿Qué sucede si el intermediario también es un servidor legal y tiene su propio certificado de CA? ? El certificado de CA no solo contiene la clave pública de la empresa, sino que también contiene información como el nombre de dominio. El cliente envía claramente una solicitud a www.baidu.com, pero la respuesta es en realidad www.qq.com, lo que le hace muy incómodo Razonablemente, el almacenamiento del certificado evita que el intermediario modifique los datos enviados por el servidor al cliente, y una vez modificado, será detectado.

La agencia de CA utiliza la clave privada para generar firmas de datos, lo que evita que el intermediario modifique los datos de información del servidor y se haga pasar por el servidor para comunicarse con el cliente. Sin embargo, el intermediario también conoce la clave pública de la organización de CA y también conoce la clave pública del servidor.La clave simétrica X datos a descifrar. Por lo que aún conoce el contenido de nuestra comunicación web, pero no puede modificarlo

Descifrado, ¿cómo conoce el cliente la clave pública de la organización CA? ?

Generalmente, está integrado, cuando descargamos el navegador, automáticamente nos ayudará a construir la clave pública de la organización de CA. Además, no solo hay una institución de CA. Si la empresa C proporciona un certificado de CA al servidor de una empresa, y la empresa A confía en la empresa B, y la empresa B confía en la empresa C, significa que tanto ABC como ABC confían en esta empresa. .

Una pequeña parte es que al acceder a la URL, el navegador puede solicitar al usuario que instale

Entonces, ¿puede el intermediario interceptar la información de su certificado? ? por supuesto que puede.

Pero, ¿puede un hombre en el medio modificar la clave pública en el certificado? ? Absolutamente no, porque si se modifica la información básica de la empresa, la huella digital de datos generada será diferente de la original. Siempre que el cliente descifre la firma de datos y haga un hash de la información modificada, se puede encontrar que la huella digital es diferente y los datos han sido modificados.

¿Puede reemplazar la información de clave pública empresarial y reemplazar la firma de datos? ? No, porque la firma de datos está encriptada por la clave privada de la organización de la CA, y el intermediario nunca conocerá la información de la clave privada de la organización de la CA. Si usa su propia clave privada para encriptar y generar una firma de datos, no puede usar la clave pública de la organización CA para descifrarla.

¿Qué sucede si el intermediario también es un servidor legal y tiene su propio certificado de CA? ? El certificado de CA no solo contiene la clave pública de la empresa, sino que también contiene información como el nombre de dominio. El cliente envía claramente una solicitud a www.baidu.com, pero la respuesta es en realidad www.qq.com, lo que le hace muy incómodo Razonablemente, el almacenamiento del certificado evita que el intermediario modifique los datos enviados por el servidor al cliente, y una vez modificado, será detectado.

La agencia de CA utiliza la clave privada para generar firmas de datos, lo que evita que el intermediario modifique los datos de información del servidor y se haga pasar por el servidor para comunicarse con el cliente. Sin embargo, el intermediario también conoce la clave pública de la organización de CA y también conoce la clave pública del servidor.La clave simétrica X datos a descifrar. Por lo que aún conoce el contenido de nuestra comunicación web, pero no puede modificarlo

Supongo que te gusta

Origin blog.csdn.net/m0_69442905/article/details/128748624
Recomendado
Clasificación