【Linux】序列化、守护进程、应用层协议HTTP、Cookie和Session

⭐️个人主页:@小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~

目录

    • 1、序列化和反序列化
    • 2、守护进程
      • [2.1 什么是进程组?](#2.1 什么是进程组?)
      • [2.2 什么是会话?](#2.2 什么是会话?)
    • 3、应用层协议HTTP
      • [3.1 HTTP协议](#3.1 HTTP协议)
      • [3.2 HTTP协议请求和响应格式](#3.2 HTTP协议请求和响应格式)
      • [3.3 HTTP的方法和常见状态码](#3.3 HTTP的方法和常见状态码)
      • [3.4 HTTP常见Header](#3.4 HTTP常见Header)
      • [3.5 怎么理解HTTP是无连接无状态的?](#3.5 怎么理解HTTP是无连接无状态的?)
    • 4、Cookie和Session
      • [4.1 Cookie](#4.1 Cookie)
      • [4.2 Session](#4.2 Session)

1、序列化和反序列化

  • 什么是序列化和反序列化?
    序列化是将对象或数据结构转换为可存储或传输的格式的过程,而反序列化是将这种格式转换回原始对象或数据结构的过程。
  • 为什么要进程序列化和反序列化?
    序列化和反序列化是为了实现对象状态的持久化存储、网络传输以及在不同系统或进程间的数据交换。
  • 关于制定协议
    所谓制定协议,本质其实就是 在定制双方都认识的、符合通信和业务需要的结构化数据。

| read、write、recv、send 和 tcp 为什么支持全双工?

  • 在任意一台主机上,TCP连接既有发送缓冲区,又有接收缓冲区,所以在内核中发消息和收消息可以同时进行,也就是全双工。

2、守护进程

2.1 什么是进程组?

  • 每一个进程除了有一个进程 ID(PID)之外,还属于一个进程组。进程组是一个或者多个进程的集合,一个进程组可以包含多个进程。 每一个进程组也有一个唯一的进程组 ID(PGID), 并且这个 PGID 类似于进程 ID, 同样是一个正整数, 可以存放在 pid_t 数据类型中。
  • 每一个进程组都有一个组长进程。 组长进程的 ID 等于其进程 ID。
  • fg [任务号]:将进程放到前台
  • bg [任务号]:将进程放到后台
  • jobs:查看当前用户启动的任务
  1. 任何登录,只允许任何时刻有一个前台进程(因为标准输入只有一个),多个或0个后台进程
  2. 命令行启动任何进程,bash自动变成后台,直到前台进程结束

2.2 什么是会话?

  • 会话可以看成是一个或多个进程组的集合, 一个会话可以包含多个进程组。每一个会话也有一个会话 ID(SID)。
  • 可以调用 setseid 函数来创建一个会话, 前提是调用进程不能是一个进程组的组长。

守护进程是后台进程的一种,但是后台进程依旧属于当前会话,而守护进程是独立会话。

  • 守护进程要脱离终端------从网络、磁盘文件IO
  • 守护进程是特殊的孤儿进程



cpp 复制代码
#pragma once

#include <iostream>
#include <cstdlib>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>

#define ROOT "/"
#define DEVNULL "/dev/null" // 黑洞文件

void Daemon(bool ischdir, bool isclose)
{
    // 1.守护进程一般要屏蔽掉特定的异常信号
    signal(SIGCHLD, SIG_IGN);
    signal(SIGPIPE, SIG_IGN);

    // 2.成为非组长
    if (fork() > 0) exit(0);

    // 3.建立新会话
    setsid();

    // 4.每一个进程都有自己的CWD,是否将当前进程的CWD更给为根目录
    if (ischdir) chdir(ROOT);

    // 5.已经变成守护进程了,不需要和用户输入输出
    if (isclose)
    {
        close(0);
        close(1);
        close(2);
    }
    else
    {
        int fd = open(DEVNULL, O_WRONLY);
        if (fd > 0)
        {
            dup2(fd, 0);
            dup2(fd, 1);
            dup2(fd, 2);
            close(fd);
        }
    }
}

3、应用层协议HTTP

3.1 HTTP协议

  • HTTP(HyperText Transfer Protocol,超文本传输协议)是一个非常重要的协议,它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本(如 HTML 文档)。
  • 客户端通过 HTTP 协议向服务器发送请求,服务器收到请求后处理并返回响应。
  • HTTP 协议是一个无连接、无状态的协议,即每次请求都需要建立新的连接,且服务器不会保存客户端的状态信息。

3.2 HTTP协议请求和响应格式

| HTTP请求:

shell 复制代码
POST /api/v1/users HTTP/1.1
Host: example.com
User-Agent: Custom-HTTP-Client/1.0
Content-Type: application/json
Content-Length: 135
 
{
    "username": "newuser",
    "password": "securepassword123",
    "email": "newuser@example.com",
    "firstName": "John",
    "lastName": "Doe"
}
  • 首行 :[方法] + [url] + [版本](上面的POST就是请求方法
  • Header :请求的属性+冒号分割的键值对,每组属性之间使用\r\n 分隔,遇到空行表示 Header 部分结束
  • Body :空行后面的内容都是 Body,Body 允许为空字符串,如果 Body 存在, 则在Header 中会有一个 Content-Length 属性来标识 Body 的长度

| HTTP响应:

shell 复制代码
HTTP/1.1 200 OK
Date: Tue, 15 Nov 2023 08:12:31 GMT
Content-Type: application/json
Content-Length: 44
Connection: keep-alive
 
{
    "message": "Hello, this is a sample HTTP response!"
}
  • 首行:[版本号] + [状态码] + [状态码解释]
  • Header :请求的属性,冒号分割的键值对,每组属性之间使用\r\n 分隔,遇到空行表示 Header 部分结束
  • Body :空行后面的内容都是 Body,Body 允许为空字符串,如果 Body 存在,则在Header 中会有一个 Content-Length 属性来标识 Body 的长度,如果服务器返回了一个 html 页面,那么 html 页面内容就是在 body 中

3.3 HTTP的方法和常见状态码

方法 说明 支持的HTTP版本
GET 请求从指定的资源获取数据 HTTP/1.0, HTTP/1.1
HEAD 类似于GET请求,但只返回响应头,不返回响应体 HTTP/1.0, HTTP/1.1
POST 向指定资源提交数据以进行处理 HTTP/1.0, HTTP/1.1
PUT 向指定资源上传其最新内容,通常会替换掉原有内容 HTTP/1.1
DELETE 请求服务器删除指定的资源 HTTP/1.1
CONNECT 将请求连接转换为透明的TCP/IP隧道,通常用于HTTPS代理 HTTP/1.1
OPTIONS 描述目标资源的通信选项 HTTP/1.1
TRACE 沿着到目标资源的路径,回显服务器收到的请求消息 HTTP/1.1
PATCH 对资源进行部分修改 HTTP/1.1

其中最常用的就是 GET 方法和 POST 方法。

  • GET:主要用于从服务器获取资源,GET把提交的参数拼接到URL的后面
  • POST :主要用于向服务器提交数据,通常用于创建、更新或删除资源等操作,POST通过正文传递参数,因此POST传递参数更私密。
状态码 类别 描述
100 信息性状态码 Continue - 客户端应继续其请求
101 信息性状态码 Switching Protocols - 服务器根据客户端的请求切换协议
200 成功状态码 OK - 请求成功
201 成功状态码 Created - 请求成功并创建了新的资源
301 重定向状态码 Moved Permanently - 请求的资源已永久移动到新的URI
302 重定向状态码 Found - 请求的资源临时从不同的URI响应请求
403 客户端错误 Forbidden - 服务器拒绝请求
404 客户端错误 Not Found - 请求的资源未找到
409 客户端错误 Conflict - 请求与当前服务器状态冲突
500 服务器错误 Internal Server Error - 服务器内部错误,无法完成请求
501 服务器错误 Not Implemented - 服务器不支持请求的功能,无法完成请求

关于状态码301(永久重定向)302(临时重定向)

  • 301(永久重定向)
    当服务器返回 HTTP 301 状态码时, 表示请求的资源已经被永久移动到新的位
    置。在这种情况下, 服务器会在响应中添加一个 Location 头部, 用于指定资源的新位置,浏览器会自动重定向到该地址。
cpp 复制代码
HTTP/1.1 301 Moved Permanently\r\n
Location: https://www.new-url.com\r\n
  • 302(临时重定向)
    当服务器返回 HTTP 302 状态码时, 表示请求的资源临时被移动到新的位置。服务器也会在响应中添加一个 Location 头部来指定资源的新位置。 浏览器会暂时使用新的 URL 进行后续的请求, 但不会缓存这个重定向。
cpp 复制代码
HTTP/1.1 302 Found\r\n
Location: https://www.new-url.com\r\n

3.4 HTTP常见Header

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

| 关于 connection 报头

  • HTTP 中的 Connection 字段是 HTTP 报文头的一部分, 它主要用于控制和管理客户端与服务器之间的连接状态

  • 管理持久连接 :持久连接(也称为长连接)允许客户端和服务器在请求或响应完成后不立即关闭 TCP 连接, 以便在同一个连接上发送多个请求和接收多个响应。

  • HTTP/1.1 协议中, 默认使用持久连接。 当客户端和服务器都不明确指定关闭连接时, 连接将保持打开状态, 以便后续的请求和响应可以复用同一个连接。

  • HTTP/1.0 协议中, 默认连接是非持久的。 如果希望在 HTTP/1.0上实现持久连接, 需要在请求头中显式设置 Connection: keep-alive。

  • Connection: keep-alive: 表示希望保持连接以复用 TCP 连接。

  • Connection: close: 表示请求/响应完成后, 应该关闭 TCP 连接。


3.5 怎么理解HTTP是无连接无状态的?

| 无连接:

  • 含义:并不是指不建立连接,而是指每次连接只处理一个请求;当服务器返回本次请求的应答后,连接即被关闭,下次请求再重新建立连接。
  • 优点:节省传输时间,提高服务器执行效率。
  • 缺点 :每次访问都需要建立一次TCP连接效率不高,所以有了Keep-Alive机制,使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,避免了建立或者重新建立连接,但需要正确设置Keep-Alive的timeout时间。

| 无状态:

  • 含义:HTTP协议对于事务处理没有记忆能力,即服务器不会保留任何关于客户端状态的信息。
  • 优点:简化服务器设计,提高可扩展性和容错性。
  • 缺点:HTTP无状态的特性严重阻碍了需要动态交互应用程序的实现,并且导致传输重复内容。
  • 解决方案 :应用CookieSession等技术来保持HTTP连接状态。

4、Cookie和Session

Cookie通过在客户端存储信息 来记住用户的状态,而Session则通过在服务器端存储信息来实现状态管理。

  • 定义:Cookie 是服务器发送到用户浏览器并保存在浏览器上的一小块数据,它会在浏览器之后向同一服务器再次发起请求时被携带并发送到服务器上。通常用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态、记录用户偏好等。
  • 原理:用户第一次访问网站时,服务器在响应的 HTTP 头中设置 Set-Cookie字段,用于发送 Cookie 到用户的浏览器,浏览器在接收到 Cookie 后,会将其保存在本地,在之后的请求中,浏览器会自动在 HTTP 请求头中携带 Cookie 字段,将之前保存的 Cookie 信息发送给服务器。
  • 分类:会话 Cookie(Session Cookie)和持久 Cookie(Persistent Cookie),带有明确的过期日期或持续时间,可以跨多个浏览器会话存在。
  • 安全性:由于 Cookie 是存储在客户端的,因此存在被篡改或窃取的风险。

Cookie基本格式:

cpp 复制代码
Set-Cookie: <name>=<value>
其中 <name> 是 Cookie 的名称,<value> 是 Cookie 的值。

4.2 Session

  • 定义:Session 是服务器用来跟踪用户与服务器交互期间用户状态的机制。由于 HTTP协议是无状态的,因此服务器需要通过 Session 来记住用户的信息。
  • 原理:当用户首次访问网站时,服务器会为用户创建一个唯一的 Session ID,并通过 Cookie 将其发送到客户端。客户端在之后的请求中会携带这个 Session ID,服务器通过 Session ID 来识别用户,从而获取用户的会话信息。
  • 安全性 :与 Cookie 相似,由于 Session ID 是在客户端和服务器之间传递的,因此也存在被窃取的风险 ,但是用户只泄漏了一个 Session ID,私密信息暂时没有被泄露的风险
  • 超时和失效:Session 可以设置超时时间,当超过这个时间后,Session 会自动失效。服务器也可以主动使 Session 失效,例如当用户登出时。

本篇文章的分享就到这里了,如果您觉得在本文有所收获,还请留下您的三连支持哦~

相关推荐
千墨3 分钟前
VMware安装Centos 9虚拟机+设置共享文件夹+远程登录
linux·运维·centos
ChinaRainbowSea1 小时前
1. Linux下 MySQL 的详细安装与使用
linux·数据库·sql·mysql·adb
网络安全(华哥)1 小时前
网络安全服务实施流程管理 网络安全服务体系
运维·服务器·网络
致奋斗的我们1 小时前
Nginx反向代理及负载均衡
linux·运维·mysql·nginx·负载均衡·shell·openeluer
百锦再2 小时前
在Linux上创建一个Docker容器并在其中执行Python脚本
linux·python·docker
Ares-Wang2 小时前
负载均衡 方式
运维·负载均衡
钗头风2 小时前
3.Docker常用命令
运维·docker·容器
忧虑的乌龟蛋2 小时前
嵌入式 Linux:使用设备树驱动GPIO全流程
linux·服务器·嵌入式·imx6ull·gpio·点灯·pinctrl
朝九晚五ฺ2 小时前
【Linux探索学习】第三十弹——线程互斥与同步(上):深入理解线程保证安全的机制
linux·运维·学习
小林熬夜学编程2 小时前
【MySQL】第八弹---全面解析数据库表的增删改查操作:从创建到检索、排序与分页
linux·开发语言·数据库·mysql·算法