【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?

两个阶段:

握手阶段,使用非对称加密将对称加密的密钥传输过去。

传输阶段,使用对称加密进行传输数据。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式存储方式的地理信息数据仓库建立设计方案

背景介绍 随着地理信息技术的发展,GIS系统中的数据规模越来越庞大,传统集中式存储方式在处理高并发查询和大规模空间分析时面临瓶颈。分布式存储通过数据分片、并行计算等技术,为地理信息数据管理提供了新的解决方案。适用场景: 遥感影像存储与分析 城市交通数据管理(如G…

深度学习案例:ResNet50模型+SE-Net

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 一 回顾ResNet模型 ResNet&#xff0c;即残差网络&#xff0c;是由微软研究院的Kaiming He及其合作者于2015年提出的一种深度卷积神经网络架构。该网络架构的核心创新在于引入了“残差连接”&…

droppath

DropPath 是一种用于正则化深度学习模型的技术&#xff0c;它在训练过程中随机丢弃路径&#xff08;或者说随机让某些部分的输出变为零&#xff09;&#xff0c;从而增强模型的鲁棒性和泛化能力。 代码解释&#xff1a; import torch import torch.nn as nn # 定义 DropPath…

KAN-Transfomer——基于新型神经网络KAN的时间序列预测

1.数据集介绍 ETT(电变压器温度)&#xff1a;由两个小时级数据集&#xff08;ETTh&#xff09;和两个 15 分钟级数据集&#xff08;ETTm&#xff09;组成。它们中的每一个都包含 2016 年 7 月至 2018 年 7 月的七种石油和电力变压器的负载特征。 traffic(交通) &#xff1a;描…

03-12、SpringCloud Alibaba第十二章,升级篇,服务注册与配置中心Nacos

SpringCloud Alibaba第十二章&#xff0c;升级篇&#xff0c;服务注册与配置中心Nacos 一、为什么SpringCloud Alibaba 1、为什么 有了spring cloud这个微服务的框架&#xff0c;为什么又要使用spring cloud alibaba这个框架了&#xff1f;最重要的原因在于spring cloud中的…

算法之旅:LeetCode 拓扑排序由简入繁完全攻略

前言 欢迎来到我的算法探索博客&#xff0c;在这里&#xff0c;我将通过解析精选的LeetCode题目&#xff0c;与您分享深刻的解题思路、多元化的解决方案以及宝贵的实战经验&#xff0c;旨在帮助每一位读者提升编程技能&#xff0c;领略算法之美。 &#x1f449;更多高频有趣Lee…

MATLAB 离散点构建凸包,计算面积周长(88)

MATLAB 离散点构建凸包,计算面积周长(88) 一、算法介绍二、算法实现1.代码2.总结这是缘,亦是命中最美的相见!!! 一、算法介绍 给定一堆离散点云,构建二维凸包,并计算凸包的面积和周长。 凸包是由顺序顶点构成的,因此凸包也可以当作多边形,则例的面积和周长计算方法…

Matlab Simulink HDL Coder开发流程(一)— 创建HDL兼容的Simulink模型

创建HDL兼容的Simulink模型 一、使用Balnk DUT模板二、从HDL Coder库中选择模块三、为DUT开发算法/功能四、为设计创建Testbench五、仿真验证设计功能六、Simulink模型生成HDL代码 这个例子说明了如何创建一个用于生成HDL代码的Simulink模型。要创建兼容HDL代码生成的MATLAB算法…

【智商检测——DP】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e510, M 110; int f[N][M]; int main() {int n, k;cin >> n >> k;for(int i 1; i < n; i){int x;cin >> x;f[i][0] __gcd(f[i-1][0], x);for(int j 1; j < min(i, k)…

神经网络入门实战:(九)分类问题 → 神经网络模型搭建模版和训练四步曲

(一) 神经网络模型搭建官方文档 每一层基本都有权重和偏置&#xff0c;可以仔细看官方文档。 pytorch 官网的库&#xff1a;torch.nn — PyTorch 2.5 documentation Containers库&#xff1a;用来搭建神经网络框架&#xff08;包含所有的神经网络的框架&#xff09;&#xff1b…

不同云计算网络安全等级

导读云计算的本质是服务&#xff0c;如果不能将计算资源规模化/大范围的进行共享&#xff0c;如果不能真正以服务的形式提供&#xff0c;就根本算不上云计算。 等级保护定级流程 定级是开展网络安全等级保护工作的 “基本出发点”&#xff0c;虚拟化技术使得传统的网络边界变…

langchain实现基于sql的问答

1. 数据准备 import requestsurl "https://storage.googleapis.com/benchmarks-artifacts/chinook/Chinook.db"response requests.get(url)if response.status_code 200:# Open a local file in binary write modewith open("Chinook.db", "wb&qu…

flink学习(14)—— 双流join

概述 Join:内连接 CoGroup&#xff1a;内连接&#xff0c;左连接&#xff0c;右连接 Interval Join&#xff1a;点对面 Join 1、Join 将有相同 Key 并且位于同一窗口中的两条流的元素进行关联。 2、Join 可以支持处理时间&#xff08;processing time&#xff09;和事件时…

深入学习指针(5)!!!!!!!!!!!!!!!

文章目录 1.回调函数是什么&#xff1f;2.qsort使用举例2.1使用qsort函数排序整形数据2.2使用sqort排序结构数据 3.qsort函数的模拟实现 1.回调函数是什么&#xff1f; 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递…

CEF127 编译指南 Linux篇 - 构建CEF Client(七)

1. 引言 在完成 CEF127 的编译工作后&#xff0c;我们需要了解如何正确运行编译后的程序。本文将详细介绍如何使用 CMake 构建示例程序&#xff0c;并成功运行 CEF 客户端。通过本文的指导&#xff0c;您将能够在 Linux 环境下顺利运行 CEF 应用程序。 2. 准备工作 2.1 确认…

位图的学习

一&#xff0c;位图介绍 位图&#xff08;Bitmap&#xff09;是一种用于存储图像的方式&#xff0c;它通过二维矩阵&#xff08;由像素组成&#xff09;来表示图像的每一个细节。每个像素通常对应一个特定的颜色值&#xff0c;位图的每个“位”就代表了图像的一个像素。 位图…

电脑与优傲协作机器人(实体)的TCP通讯(操作记录)

目录 一、UR通信端口 二、电脑&#xff08;客户端&#xff09;连接协作机器人&#xff08;服务端&#xff09; 1.设置网络方法 2.检查设置 3.示教器切换远程控制&#xff08;注&#xff09; 4.客户端与协作机器人建立连接 5.连接测试 三、电脑&#xff08;服务端&#…

后端 Java发送邮件 JavaMail 模版 20241128测试可用

配置授权码 依赖 <dependency><groupId>javax.mail</groupId><artifactId>javax.mail-api</artifactId><version>1.5.5</version> </dependency> <dependency><groupId>com.sun.mail</groupId><artifa…

12.2 正则表达式

object test04 {def main(args: Array[String]): Unit {//1.定义规则。写正则表达式val reg "\\d".r // \\d表示找数字//2.在目标字符串中&#xff0c;去按照这个规则去找符合的子字符串val result reg.findFirstIn("我是who&#xff0c;我的电话是&#xff…

MySQL:DDL数据定义语言

DDL(Data Definition Language)&#xff0c;数据定义语言 对数据库的常用操作 查看所有数据库 语法&#xff1a;show databases; 创建数据库 dbname&#xff1a;用户自己定义的数据库名称。 语法&#xff1a;create database [if not exists] dbname [charsetutf8]; 切换…