【HTTP】HTTP协议
一个Web Server就是个服务器软件(程序),或者是运行这个服务器软件的硬件(计算机),其主要功能是通过HTTP协议与客户端进行通信,来接收,存储,处理来自客户端的HTTP请求,并对其做出HTTP响应,返回给客户端其请求的内容或返回一个error信息。
通常用户使用Web浏览器与相应的服务器进行通信, 在浏览器中输入“域名”或“ip地址:端口号”,浏览器则先将你的域名解析成相应的ip地址或者直接根据你的ip地址向对应的Web服务器发送一个HTTP请求,这个过程首先要通过TCP协议的三次握手建立与目标Web服务器的连接,然后HTTP协议生成针对目标Web服务器的HTTP请求报文,通过TCP,IP等协议发送到目标服务器上。
HTTP协议(应用层协议)
简介
超文本传输协议,是一个简单的请求,响应协议,它通常运行在TCP之上,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应,请求和响应消息的头以ASCII形式给出,而消息内容则具有一个类似MMF的格式,HTTP是万维网的数据通信的基础。
工作原理
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端,HTTP协议采用了请求/响应模型,客户端向服务器发送一个请求报文,请求报文包含请求的方法,URL,协议版本,请求头部和请求数据,服务器以一个状态行作为响应,响应的内容包括协议的版本,成功或错误代码,服务器信息,响应头部和响应数据。
以下是HTTP请求/响应的不步骤:
1.客户端连接到Web服务器
2.发送HTTP请求
3.服务器接收请求并返回HTTP响应
4.释放连接TCP连接
5.客户端浏览器解析HTML内容
例如L在浏览器地址输入URL,按下回车会经历以下步骤:
1.浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址;
2.解析出IP地址后,根据该IP地址和默认端口80,和服务器建立TCP连接;
3.浏览器发出读取文件,(URL中域名后面部分对应的文件)的HTTP请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器;
4.服务器对浏览器请求作出响应,并把对应HTTP文本发生给浏览器;
5.释放TCP连接;
6.浏览器将该HTTP文本显示内容。
客户端的选择有:浏览器,curl命令,Postman。
HTTP是一种无状态的协议。
请求报文格式
响应报文格式
请求报文中,第一行是起始行,下面的是首部字段,然后是两个空行,换行是\r\n,连续的两个\r\n代表首部字段结束了。
HTTP请求方法
HTTP/1.1协议中共定义了八种方法来以不同的方式来操作指定的资源:
1.GET:向指定的资源发出“显示”请求,使用GET方法应该只用在读取数据,而不应该被用于产生”副作用“的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。
2.HEAD:与GET方法一样,都是向服务器发出指定资源额请求,只不过服务器将不传回资源的文本部分,它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中”关于该资源的信息“
3.POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件),数据被包含在请求报文中,这个请求可能会创建新的资源或修改现有资源,或二者皆有。
4.PUT:向指定资源上传最新内容。
5.DELETE:请求服务器删除Request-URL所标识的作用。
6.TRAC:回显服务器收到的请求,主要用于测试或诊断。
7.OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。
8.CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器,通常用于SSL加密服务器的连接。
一般情况下GET,POST方法是最常用的。这里并不完全,要了解更多方法,查看RFC文档或者MDN文档。
boundary用来分割不同键值对。
前面使用的是&作为分隔符,用一长串的数字来分割,如果出现和数据相同,则提示重新请求。
浏览器上怎么发POST请求????
先做一个网页出来,和网页里面的内容进行交互。
1.x-www-form-urlencoded key1=value1&key2=value2 短数据,类似登陆注册
2.form-data 指定一个boundary来分割, 可以用来上传文件
uri的路径和path部分
url的路径总是以/开头的,以?结尾,没写的话,默认是/。
怎么样解析path和query?
path由服务端自己决定,比如www.baidu.com/s?就是百度的搜索服务。一般用来对应资源(1.文件,2.某个函数或者服务)。
HTPP版本
起始行的第三个字段是http的版本,它有/0.9 /1.0 /1.1 /2.0 /3.0
我们要关注的是1.1版本,这是使用最多的版本,它支持持久连接,简而言之就是长连接。心跳,根据最后一次请求数据的时间,来依次断连。http是一次请求一次响应,适合短连接。两端的数据都不变,即客户端的ip和port,服务器的ip和port都不变。
状态码和状态字符串
200 OK 表示成功
301 Moved Permanently 表示永久重定向
302 Found 临时重定向
400 Bad Request 有错误,不告诉客户端错在哪
403 Forbidden 服务器有能力处理该请求,但是拒绝授权访问
404 Not Found 客户端有误,服务器端无法找到所请求的资源
500 Internal Server Error 万能响应代码
502 Bad Gateway 网关错误
#include "linuxHeader.h"
#include <memory>
#include <string>
class HttpServer
{
public:HttpServer(const char *ip, const char *port): _ip(ip), _port(port){}void start(){_socketfd = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr(_ip);addr.sin_port = htons(atoi(_port));int reuse = 1;setsockopt(_socketfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(int));bind(_socketfd, (struct sockaddr *)&addr, sizeof(addr));listen(_socketfd, 10);}void RecvAndShow(){// 连接客户端int netFd = accept(_socketfd, NULL, NULL);// 使用RAII管理缓冲区std::unique_ptr<char[]> buf(new char[4096]);bzero(buf.get(), 4096);// 读取请求的内容,直接显示在stderr中recv(netFd, buf.get(), 4096, 0);fprintf(stderr, "%s\n", buf.get());// http协议头std::string firstLine = "HTTP/1.1 302 Moved Temporarily\r\n";send(netFd, firstLine.c_str(), firstLine.size(), 0);std::string headers = "Content-Type:text/plain\r\n""Location:https:/www.taobao.com\r\n""Content-Length:5\r\n";send(netFd, headers.c_str(), headers.size(), 0);std::string emptyLine = "\r\n";send(netFd, emptyLine.c_str(), emptyLine.size(), 0);// http协议数据std::string body = "hello";send(netFd, body.c_str(), body.size(), 0);close(netFd);fprintf(stderr, "connection closed\n");}private:const char *_ip;const char *_port;int _socketfd;
};
RESTful设计风格
REST全称是表述性状态转移,那究竟指的是什么的表述? 其实指的就是资源。任何事物,只要有被引用到的必要,它就是一个资源。资源可以是实体(例如手机号码),也可以只是一个抽象概念(例如价值) 。下面是一些资源的例子:
-
某用户的手机号码
-
某用户的个人信息
-
最多用户订购的GPRS套餐
-
两个产品之间的依赖关系
-
某用户可以办理的优惠套餐
-
某手机号码的潜在价值
要让一个资源可以被识别,需要有个唯一标识,在Web中这个唯一标识就是URI(Uniform Resource Identifier)。
URI既可以看成是资源的地址,也可以看成是资源的名称。如果某些信息没有使用URI来表示,那它就不能算是一个资源, 只能算是资源的一些信息而已。URI的设计应该遵循可寻址性原则,具有自描述性,需要在形式上给人以直觉上的关联。
如果用户的接口设计符合REST风格,就称作是RESTful的接口设计,REST风格的特点如下:
使用HTTP方法表示行为: GET PUT POST DELETE分别表述查改增删;
所有的对象都抽象成资源,每一个资源都使用URL的路径来标识;
所有传递的参数都放在请求和响应的报文体中;
使用json或者是xml编码数据;
客户端不再得到完整的html,数据的展示效果由客户端完成
怎么样设计一个restful的接口????
1.方法里面放行为:增删查改,2.资源在url的path,3.将参数放在请求体里面,用JSON/XML组织,4.得到的响应体只有关键信息。把视图和关键状态分离。
好处:幂等性
HTTPS的实现原理
http明文传递,风险:信息泄漏,是不安全的。
使用密文传递,传递到服务器之后进行解密。
http+ssl 将传递到网络上的数据进行加密。
对称加密
客户端由原始文档,密钥(只有一份)合成生成一份密文,通过网络传递到服务器,通过密钥和密文解密得到原始文档。同一个密钥可以做加密操作也可以做解密操作,AES/DES。
优点:效率比较高
非对称加密
有一对互补的钥匙,一个公钥,一个私钥,客户端生成了一对公钥和私钥,还有一个原始文档,它把原始文档通过私钥进行加密,得到一份密文,然后把密文和公钥通过网络发给服务器,服务器可以使用公钥和密文进行解密得到密文。
用处:身份验证,客户端有一对公钥和私钥,把公钥给服务器,登录的时候提供私钥,两个是互补的,不需要密码就可以登录。
一般是RSA系列算法。
优点:更加安全
怎么实现HTTPS?
两个阶段:
握手阶段,使用非对称加密将对称加密的密钥传输过去。
传输阶段,使用对称加密进行传输数据。
相关文章:

【HTTP】HTTP协议
一个Web Server就是个服务器软件(程序),或者是运行这个服务器软件的硬件(计算机),其主要功能是通过HTTP协议与客户端进行通信,来接收,存储,处理来自客户端的HTTP请求&…...

大数据新视界 -- Hive 基于 MapReduce 的执行原理(上)(23 / 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

SpringBoot源码解析(六):打印Banner
SpringBoot源码系列文章 SpringBoot源码解析(一):SpringApplication构造方法 SpringBoot源码解析(二):引导上下文DefaultBootstrapContext SpringBoot源码解析(三):启动开始阶段 SpringBoot源码解析(四):解析应用参数args Sp…...

【计算机网络】实验6:IPV4地址的构造超网及IP数据报
实验 6:IPV4地址的构造超网及IP数据报 一、 实验目的 加深对IPV4地址的构造超网(无分类编制)的了解。 加深对IP数据包的发送和转发流程的了解。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、了解IPV4地址的构造超网…...
easy excel 生成excel 文件
导包 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.3</version> </dependency> 内容 List<类> limspjreport 值; String fileName sdf.format(new Date()) "-…...

Ajax:回忆与节点
一点回忆 面对我的Ajax学习,实现前后端交互,最开始我采用的使用网络寻找intellij IDEA Ultimate破解方法,然后最终成功,然后按照相关教程配置java ee项目,然后中间又去配置了Tomcat服务器,然后又去学习了一…...
Python+OpenCV系列:Python和OpenCV的结合和发展
PythonOpenCV系列:Python和OpenCV的结合和发展 **引言****Python语言的发展****1.1 Python的诞生与发展****1.2 Python的核心特性与优势****1.3 Python的应用领域** **OpenCV的发展****2.1 OpenCV的起源与发展****2.2 OpenCV的功能特性****2.3 OpenCV的应用场景** *…...

Ubuntu20.04 由源码编译安装opencv3.2 OpenCV
Ubuntu20.04 由源码编译安装opencv3.2.0 获取 opencv 及opencv_contrib源代码 创建目录以存放opencv及opencv_contrib源代码 mkdir ~/opencv3.2.0 cd ~/opencv3.2.0获取opencv源代码并切换到对应tag git clone https://github.com/opencv/opencv.git cd opencv git checkou…...

A058-基于Spring Boot的餐饮管理系统的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看项目链接获取⬇️,记得注明来意哦~🌹 赠送计算机毕业设计600个选题ex…...

RDIFramework.NET CS敏捷开发框架 SOA服务三种访问(直连、WCF、WebAPI)方式
1、介绍 在软件开发领域,尤其是企业级应用开发中,灵活性、开放性、可扩展性往往是项目成功的关键因素。对于C/S项目,如何高效地与后端数据库进行交互,以及如何提供多样化的服务访问方式,是开发者需要深入考虑的问题。…...

Linux——命名管道及日志
linux——进程间通信及管道的应用场景-CSDN博客 文章目录 目录 文章目录 前言 一、命名管道是什么? 理解: 2、编写代码 makefile 管道封装成类,想用中管道时只需要调用实例化 读端 写端 日志 1、日志是什么? 2、日志有什么&#x…...
Flink 常见面试题
1、Flink 的四大特征(基石) checkpoin基于Chandy-Lamport算法实现了分布式一致性快照提供了一致性的语义 state丰富的StateAPI time实现了Watermark机制,乱序数据处理,迟到数据容忍 window开箱即用的滚动,滑动会话窗口…...

rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable
解决方法: 1、先测量pcf8563电源电压,是否满足要求。 2、pcf8563首次操作。第一次读取pcf8563的时间,未初始化,非法,芯片门槛电压检测配置不合理。使用hwclock命令写入一次,即可解决。 hwclock -f /dev/…...

(简单5步实现)部署本地AI大语言模型聊天系统:Chatbox AI + grok2.0大模型
摘要: 本文将指导您如何部署一个本地AI大语言模型聊天系统,使用Chatbox AI客户端应用和grok-beta大模型,以实现高效、智能的聊天体验。 引言: 由马斯克X-AI发布的Grok 2大模型以其卓越的性能超越了GPT4.0。Grok模型支持超长文本…...

MAUI APP开发蓝牙协议的经验分享:与跳绳设备对接
在开发MAUI应用程序时,蓝牙协议的应用是一个重要的环节,尤其是在需要与外部设备如智能跳绳进行数据交换的场景中。以下是我在开发过程中的一些经验和心得,希望能为你的项目提供帮助。 1. 蓝牙协议基础 蓝牙协议是无线通信的一种标准&#x…...

最新版Node.js下载安装及环境配置教程
目录 初识:Node.js 一、下载:Node.js 二、安装:Node.js 1.下载【node.js】压缩包安装文件 2.解压下载的安装包 3.打开解压的【node-v22.11.0-x64】文件夹 4.双击启动安装程序 5.点击【Next】 6.勾选【I accept the terms in the Lic…...

51c自动驾驶~合集39
我自己的原文哦~ https://blog.51cto.com/whaosoft/12707676 #DiffusionDrive 大幅超越所有SOTA!地平线DiffusionDrive:生成式方案或将重塑端到端格局? 近年来,由于感知模型的性能持续进步,端到端自动驾驶受到了来…...
单链表基础操作
文章目录 abstract定义结点结构初始化链表遍历链表求表长查找结点根据序号查找结点根据值查找结点 插入结点首尾位置插入一般位置插入(通用插入)找到尾元素|尾指针相关操作 删除结点 abstract 单链表是一种简单的动态数据结构,它由一系列结点组成,每个结…...
Asp.net MVC在VSCore中的页面的增删改查(以Blog项目为例),用命令代码
在VSCore中的页面的增删改查(以Blog项目为例) 1.创建项目(无解决方案)复杂项目才需要 dotnet new mvc -o Blog2.控制器 BlogsController.cs 控制器(Controller)名字和视图(View)中的文件名要一模一样 u…...

【Leecode】Leecode刷题之路第66天之加一
题目出处 66-加一-题目出处 题目描述 个人解法 思路: todo代码示例:(Java) todo复杂度分析 todo官方解法 66-加一-官方解法 方法1:找出最长的后缀9 思路: 代码示例:(Java&#…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...