【Linux】http 协议

目录

一、http协议

(一)http 协议的概念

(二)URL的组成

(三)urlencode 和 urldecode

二、http 的协议格式

(一)http 请求方法

(二)http 响应状态码

(三)http 常见的响应报头

三、http 协议客户端和服务器通信过程

(一)应用层如何保证将请求或响应完整读取完了?

(二)http如何进行序列化和反序列化

(三)通信全过程

1、启动服务器

2、工具类

2、分析请求报文

3、发送响应报文

四、http 会话保持


一、http协议

(一)http 协议的概念

        上节我们提到可以自定协议,但是面对一些复杂的场景单靠自定协议是很难满足需求的。实际上已经有一些现成且好用的应用层协议,http 超文本传输协议就是其中之一。

(二)URL的组成

        URL即我们平时常称的网址。

        ip会标识一台网络主机,我们通过在浏览器中输入网址就可以访问该服务器,从指定的文件路径下找到用户请求的文件返回给用户。

(三)urlencode 和 urldecode

        对于URL而言,在浏览器中其并不是完全明文显式的,例如:

        我们可以看到当我们搜索 C++ 时, URL中不是显式的C++,而是 C%2B%2B 的形式,这是因为在http协议对于URL中的特殊字符,必须将其进行转义。

转义规则:

        一个字节是八个比特位,从中间划分左右各4位(不足4位直接处理),将左右4位分别转为16进制,将两位组合在一起后前面加上%便编码成%XY格式。

二、http 的协议格式

(一)http 请求方法

        本文只介绍两种常用的请求方法:GET和POST。

方法说明支持的HTTP协议版本
GET获得资源1.0、1.1
POST传输实体主题1.0、1.1

        虽然它们都是客户端向服务器发出的请求方法,但是二则略有不同。

        针对同一份前端表单form,当不同的请求方法时,浏览器会将执行不同的动作:

1、GET方法通过URL传递参数。例如上例中,当我们使用GET方法处理表单时,浏览器会将我们的表单内容拼接为URL发送给服务器,http://ip::port/XXX?key=value。使用URL进行传参注定了参数不能过大,当传输数据过大时使用GET方法请求就不合适了;

2、 POST方法则是通过http请求正文传递参数的,对于正文数据大小没有限制,适合传递一些大型文件。

3、POST方法相较于GET方法更加私密,GET方法通过URL传递参数,所以传递的数据可以被直接看到。虽然POST方法比GET方法更私密,但二者实际都是不安全的,如果需要加密安全的话得使用https协议。

(二)http 响应状态码

        https协议的状态码:

类别原因短语
1XXInformational(信息状态码)

接收的请求正在处理

2XXSuccess(成功状态码)请求正常处理完毕
3XXRedirection(重定向状态码)需要进行附加操作以完成请求
4XXClient Error(客户端错误状态码)服务器无法处理请求
5XXServer Error(服务器错误状态码)服务器处理请求出错

        常见错误码:

2XX:

  • 200 OK:请求成功
  • 201 Created:请求已经被实现,资源已经被创建。
  • 204 No Content:请求成功,但响应报文不含实体的主体部分。

3XX:

  • 301 Moved Permanently:永久性重定向
  • 302 Found:临时性重定向
  • 307 Temporary Redirect:临时性重定向

4XX:

  • 400 Bad Request:请求报文存在语法错误
  • 401 Unauthorized:未经授权,需要身份验证
  • 403 Forbidden:服务器拒绝请求
  • 404 Not Found:服务器无法找到请求的资源

5XX:

  • 500 Internal Server Error:服务器内部错误
  • 502 Bad Gateway:网关错误
  • 503 Service Unavailable:服务器暂时无法处理请求
  • 504 Gateway Timeout:网关超时

(三)http 常见的响应报头

  • Content-Type:指定响应体的MIME类型,例如text/html表示HTML文本,image/jpeg表示JPEG图片等。
  • Content-Length:指定响应体的长度,单位为字节
  • Host:客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上
  • User-Agent:声明用户的操作系统和浏览器版本信息
  • referer:当前页面是从哪个页面跳转过来的
  • location:搭配3xx状态码使用, 告诉客户端接下来要去哪里访问
  • cookie:用于在客户端存储少量信息. 通常用于实现会话的功能

三、http 协议客户端和服务器通信过程

(一)应用层如何保证将请求或响应完整读取完了?

        首先对于请求行、请求报头、状态行和响应报头都是按照 \r\n 为行分隔符,因此可以读取完整的一行。而报头与正文之间也存在着一个分隔符,因此可以区分请求报头是否读取完整。而请求报头中存在着 Content-Length 字段,其记录了正文的长度,因此应用层可以完整地读取请求正文或响应正文,从而保证了应用层可以完整地读取一个完整的请求或响应。

(二)http如何进行序列化和反序列化

        上节我们自定义协议的时候是需要对请求和响应进行序列化和反序列化的,那么 http 协议是如何进行需要序列化和反序列化呢?实际 http 协议本身无需用户关注序列化和反序列化,直接发送即可,而对于正文部分,如果有需要用户可以自定义序列化和反序列化方案。

(三)通信全过程

1、启动服务器

    void httpHandler(int fd, func_t func){// 读取数据char buffer[1024];ssize_t n = recv(fd, buffer, sizeof(buffer) - 1, 0);if (n >= 0){buffer[n] = 0;Request req;Response resp;req.parse(buffer);func(req, resp);send(fd, resp.outbuffer.c_str(), resp.outbuffer.size(), 0);}}void start(func_t func){while (1){signal(SIGCHLD, SIG_IGN);sockaddr_in addr;socklen_t len = sizeof(addr);int socket = accept(_fd, (struct sockaddr *)&addr, &len);if (socket == -1){cerr << "accept failure : " << strerror(errno) << endl;continue;}pid_t pid = fork();if (pid == 0){close(_fd);httpHandler(socket, func);close(socket);exit(0);}close(socket);}}

2、工具类

#include <iostream>
#include <string>
#include <fstream>
using namespace std;
class Util
{
public:static string getLine(string &buffer, const string &sep){auto index = buffer.find(sep);if (index == string::npos)return "";string ret = buffer.substr(0, index);buffer.erase(0, index);return ret;}static bool readFile(const string &text, char *buffer, int size){fstream in(text, ios_base::binary | ios_base::in);if (!in.is_open())return false;in.read(buffer, size);in.close();return true;}
};

2、分析请求报文

class Request
{
public:Request() {}~Request() {}void parse(const string &in){inbuffer = in;string firstLine = Util::getLine(inbuffer, SEP);stringstream s(firstLine);s >> method >> url >> httpversion;path = DEFAULT_PATH;path += url;if (path[path.size() - 1] == '/')path += HOME_PAGE;elsepath += ".html";struct stat st;int ret = stat(path.c_str(), &st);if (ret == 0)size = st.st_size;elsesize = -1;}public:string inbuffer;string method;string url;string path;string httpversion;string suffix;string parm;int size;
};

3、发送响应报文

void Get(const Request &req, Response &resp)
{cout << "----------------------http recv start---------------------------" << endl;cout << req.inbuffer << std::endl;std::cout << "method: " << req.method << std::endl;std::cout << "url: " << req.url << std::endl;std::cout << "httpversion: " << req.httpversion << std::endl;std::cout << "path: " << req.path << std::endl;cout << "----------------------http recv end---------------------------" << endl;cout << "----------------------http send start---------------------------" << endl;resp.outbuffer += "HTTP/1.1 200 OK\r\n";// resp.outbuffer += "HTTP/1.1 302 Found\r\n";resp.outbuffer += "Content-Type: text/html\r\n";// resp.outbuffer += "Location:https://blog.csdn.net/Sweet_0115?spm=1000.2115.3001.5343\r\n";resp.outbuffer += "\r\n";string body;body.resize(req.size + 1);if (!Util::readFile(req.path, (char *)body.c_str(), body.size()))!Util::readFile("./wwwroot/404.html", (char *)body.c_str(), body.size());cout << "test : -----------" << req.path << endl;// cout << body << endl;resp.outbuffer += body;cout << resp.outbuffer << endl;cout << "----------------------http send end---------------------------" << endl;
}

四、http 会话保持

        当我们打开CSDN登录后,即使我们关闭了浏览器,短期内我们再打开CSDN仍然不需要重复登录。同样的,我们在CSDN内进行网页跳转时,也不需要再重复登录。http 协议是无状态的,那么浏览器是怎么做到网页跳转时用户不需要重复登录呢?

        这实际就是会话保持,http请求是无状态的,也就是以上功能并不是 http 提供的,而是session和cookie提供的。

        当用户首次登录时,浏览器会将用户的账号和密码保存在cookie文件里,当用户近期再次访问该网站或在网站内进行跳转时,浏览器会自动将cookie文件里的数据推送给服务器,从而不需要用户再次登录。例如当我们使用软件观看一些会员视频时,利用以上机制可以鉴权进行身份判断。

        但以上方式实际很不安全,例如一些不法分子可以通过劫持 http请求 从而获取到用户的账号和密码,所以以上机制是很危险的。

        实际当用户登录后,服务器会为用户建立会话(session),其会保存用户的信息,同时会返回给浏览器 session id。当用户近期再次访问网站或再网站内进行跳转时,浏览器则向服务器发送 session id,而服务器则通过该 session id 进行身份鉴权判断。

        但实际以上机制仍存在风险,不法分子仍然可以通过劫持 http 请求获取 session id,通过该id仍然可以向服务器伪造请求,但相比于第一种方案,至少用户的账户密码信息没有丢失。上述方案也可以配合别的机制,例如短信验证或人脸识别保障信息安全,例如当账号突然被异地登录(用户信息泄漏),服务器检测后使 session id 失效并令用户重新进行验证登录,一定程度上保护了用户的信息安全。

        http请求并不安全,如果有安全防护需求必须得使用https协议。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30418.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是时序数据库?有哪些时序数据库?常见的运用场景有哪些?

时序数据库 什么是时序数据库&#xff1f; 时序数据库&#xff08;Time Series Database, TSDB&#xff09;是专门针对时间序列数据&#xff08;按时间顺序记录的数据点&#xff09;进行存储和管理的数据库。这类数据通常包含时间戳&#xff08;Timestamp&#xff09;和对应的…

【Linux】冯诺依曼体系与操作系统理解

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;Linux 目录 前言 一、冯诺依曼体系结构 二、操作系统 1. 操作系统的概念 2. 操作系统存在的意义 3. 操作系统的管理方式 4. 补充&#xff1a;理解系统调用…

Unity HDR颜色、基础颜色、强度强度、HDR面板Intensity之间的相互转换

目录 前言&#xff1a; 一、UnityHDR面板的规律 二、HDR与基础颜色转换&#xff0c;HDR强度获取&#xff0c;输入设置强度获取 1.基础色->HDR颜色 2.HDR颜色->基础色 3.获取HDR颜色在面板中的强度 4.获取HDR颜色在面板设置输入时的强度 前言&#xff1a; HDR&#…

c++进阶--map和set的使用

大家好&#xff0c;昨天我们学习了二叉搜索树&#xff0c;今天我们来学习一下map和set容器的使用。 目录 1. map和set的使⽤ 1.1 序列式容器和关联式容器 2. set系列的使⽤ 2.1 参考文档 2.2 set类的介绍 2.3 set的构造和迭代器 2.4 set的增删查 2.5 insert和迭代器…

Kylin麒麟操作系统服务部署 | NFS服务部署

以下所使用的环境为&#xff1a; 虚拟化软件&#xff1a;VMware Workstation 17 Pro 麒麟系统版本&#xff1a;Kylin-Server-V10-SP3-2403-Release-20240426-x86_64 一、 NFS服务概述 NFS&#xff08;Network File System&#xff09;&#xff0c;即网络文件系统。是一种使用于…

FPGA之USB通信实战:基于FX2芯片的Slave FIFO回环测试详解

FPGA之Usb数据传输 Usb 通信 你也许会有疑问&#xff0c;明明有这么多通信方式和数据传输&#xff08;SPI、I2C、UART、以太网&#xff09;为什么偏偏使用USB呢? 原因有很多&#xff0c;如下&#xff1a; 1. 高速数据传输能力 高带宽&#xff1a;USB接口提供了较高的数据传…

生活反思公园散步与小雨遇记

《公园散步与小雨遇记》&#xff08;一&#xff09; 总收录于《生活小事灵感反思》与《生活小美好》 最近又新增一个习惯&#xff1a;每天至少走一小时 那天天气有雨&#xff0c;软件上显示在下雨&#xff0c;但是外面没雨&#xff0c;心想着大不了淋湿回来洗个头&#xff0c;…

夏门大学DeepSeek 手册:从社会大众到高校及企业的全面应用实践研究(附 PDF 下载)

这 3 份手册分别从 DeepSeek 大模型概念、技术与应用实践、DeepSeek 大模型赋能高校教学和科研、DeepSeek 大模型及其企业应用实践-企业人员的大模型宝典几个角度进行全面分析&#xff0c;可以结合着清华、北大系列相互对照着学习。 清华北大推出的 DeepSeek 教程&#xff08;…

微服务保护:Sentinel

home | Sentinelhttps://sentinelguard.io/zh-cn/ 微服务保护的方案有很多&#xff0c;比如&#xff1a; 请求限流 线程隔离 服务熔断 服务故障最重要原因&#xff0c;就是并发太高&#xff01;解决了这个问题&#xff0c;就能避免大部分故障。当然&#xff0c;接口的并发…

工作学习笔记:HarmonyOS 核心术语速查表(v14 实战版)

作为在 HarmonyOS 开发一线摸爬滚打的工程师&#xff0c;笔者在 v14 版本迭代中整理了这份带血的实战术语表。 一、架构基础术语速查 A 系列术语 术语官方定义笔者解读&#xff08;v14 实战版&#xff09;开发陷阱 & 解决方案abc 文件ArkCompiler 生成的字节码文件打包时…

驾校与无人机飞手培训机构合作开展低空业务技术详解

驾校与无人机飞手培训机构合作开展低空业务是一个创新的举措&#xff0c;旨在结合双方的资源和专业优势&#xff0c;为学员提供多元化的技能培训和业务拓展机会。以下是对这种合作模式下低空业务技术的详细解析&#xff1a; 一、合作背景与意义 1. 市场需求增长&#xff1a;随…

黄昏时间户外街拍人像Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍 黄昏时分有着独特而迷人的光线&#xff0c;使此时拍摄的人像自带一种浪漫、朦胧的氛围 。通过 Lr 调色&#xff0c;可以进一步强化这种特质并根据不同的风格需求进行创作。Lr&#xff08;Lightroom&#xff09;作为专业的图像后期处理软件&#xff0c;提供了丰富的调色…

数据结构(队列)

数据结构&#xff08;队列&#xff09; 什么是队列&#xff1f; 队列和栈类似&#xff0c;也是一类特殊的线性表。特殊之处也是在于操作上。队列&#xff1a;只允许在一端进行插入数据操作&#xff08;入队&#xff09;&#xff0c;在另一端进行删除数据操作&#xff08;出队&…

DeepSeek R1-7B 医疗大模型微调实战全流程分析(全码版)

DeepSeek R1-7B 医疗大模型微调实战全流程指南 目录 环境配置与硬件优化医疗数据工程微调策略详解训练监控与评估模型部署与安全持续优化与迭代多模态扩展伦理与合规体系故障排除与调试行业应用案例进阶调优技巧版本管理与迭代法律风险规避成本控制方案文档与知识传承1. 环境配…

[Lc7_分治-快排] 快速选择排序 | 数组中的第K个最大元素 | 库存管理 III

目录 1. 数组中的第K个最大元素 题解 代码 2.库存管理 III 代码 1. 数组中的第K个最大元素 题目链接&#xff1a;215. 数组中的第K个最大元素 题目分析&#xff1a; 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要…

集合论--形式化语言里的汇编码

如果一阶逻辑是数学这门形式化语言里的机器码&#xff0c;那么集合论就是数学这门形式化语言里的汇编码。 基本思想&#xff1a;从集合出发构建所有其它。 构建自然数构建整数构建有理数构建实数构建有序对、笛卡尔积、关系、函数、序列等构建确定有限自动机(DFA) 全景图 常…

RuoYi框架添加自己的模块(学生管理系统CRUD)

RuoYi框架添加自己的模块&#xff08;学生管理系统&#xff09; 框架顺利运行 首先肯定要顺利运行框架了&#xff0c;这个我不多说了 设计数据库表 在ry数据库中添加表tb_student 表字段如图所示 如图所示 注意id字段是自增的 注释部分是后面成功后前端要展示的部分 导入…

MybatisPlus

1.增删改查入门案例&#xff1a; 首先导入依赖&#xff1a; <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency> 然后这些增删改查…

【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 过滤器:实现请求的预处理与后处理

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、过滤器&…

服务器上通过ollama部署deepseek

2025年1月下旬&#xff0c;DeepSeek的R1模型发布后的一周内就火了&#xff0c;性能比肩OpenAI的o1模型&#xff0c;且训练成本仅为560万美元&#xff0c;成本远低于openAI&#xff0c;使得英伟达股票大跌。 下面我们来看下如何个人如何部署deepseek-r1模型。 我是用的仙宫云的…