HTTP概要

文章目录

  • 什么是HTTP?
  • URL的结构
  • 请求报文结构
    • 请求方法
      • GET
      • HEAD
      • POST
      • PUT
      • DELETE
      • TRACE
      • OPTIONS
      • CONNECT
      • PATCH
      • 解释
    • 请求头字段
  • 响应报文结构
    • 响应状态
    • 响应头字段
  • HTTP会话
    • 3次握手
    • 无状态协议

什么是HTTP?

HTTP,即Hypertext Transfer Protocol(超文本传输协议)

它是一个”请求-相应“的协议,用于客户端和服务器间交换信息

URL的结构

HTTP resources 通过URL来定位
URL,即 Uniform Resource Locators(统一资源定位符)

结构如下:
–scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]

  • scheme, 方案
    • 指定用于访问资源的协议或方法
    • 如http, ftp, mailto, file, data, irc
  • 权限, 包括:
    • 身份验证部分(可选)
      • username
      • password
      • user:password@
    • host
      • registered name / IP address
      • 端口号(可选)
  • 路径
    • 资源在服务器上的相对路径
  • query, 可选的查询字符串
    • 包含资源的附加参数或信息
  • fragment(可选,片段标识符)
    • 指向资源的特定部分
    • #引入

例子: http://www.example.com/index.html

请求报文结构

# request line, 请求行
GET / HTTP/1.1# request header fields, 请求头首部
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive# 一个空行# 可选的消息主题

请求方法

HTTP定义了用于指示对特定资源执行的期望操作的方法。

GET

GET方法请求获取指定资源的表示。使用GET的请求应仅用于检索数据,不应产生其他影响。(幂等

HEAD

HEAD方法请求与GET请求相同的响应,但不包含响应体。(幂等

POST

POST方法请求服务器接受包含在请求中的实体作为URI标识的Web资源的新下级。

PUT

PUT方法请求将封装的实体存储在提供的URI下。(幂等

DELETE

DELETE方法删除指定的资源。(幂等

TRACE

TRACE方法回显接收到的请求,以便客户端可以查看中间服务器是否进行了哪些(如果有的话)更改或添加。(幂等

OPTIONS

OPTIONS方法返回服务器支持的指定URL的HTTP方法。这可用于通过请求’*'而不是特定资源来检查Web服务器的功能。(幂等

CONNECT

CONNECT方法将请求连接转换为透明的TCP/IP隧道,通常用于通过未加密的HTTP代理便于SSL加密通信(HTTPS)。

PATCH

PATCH方法对资源应用部分修改。

所有通用的HTTP服务器都要求至少实现GET和HEAD方法,并在可能的情况下也实现OPTIONS方法。

解释

一些方法(例如HEAD、GET、OPTIONS和TRACE)按照惯例被定义为“安全”,这意味着它们仅用于信息检索,不应改变服务器的状态。

PUT和DELETE方法被定义为“幂等”,这意味着多个相同的请求应具有与单个请求相同的效果,或者它返回的响应代码在后续请求中可能不同,但系统状态在每次都将保持相同。

由于HTTP是无状态协议,因此被规定为安全的GET、HEAD、OPTIONS和TRACE方法也应该是幂等的。

image.png

请求头字段

名称描述示例
Accept响应中可接受的媒体类型。Accept: text/html
Accept-Charset可接受的字符集。Accept-Charset: utf-8
Accept-Datetime可接受的时间版本。Accept-Datetime: Thu, 31 May 2007 20:35:00 GMT
Accept-Encoding可接受的编码列表。Accept-Encoding: gzip, deflate
Accept-Language响应中可接受的人类语言列表。Accept-Language: en-US
Cache-Control用于指定在请求-响应链中所有缓存机制都必须遵守的指令。Cache-Control: no-cache
Connection当前连接的控制选项和逐跳请求字段的列表。不得与HTTP/2一起使用。Connection: keep-alive Connection: Upgrade
Content-Encoding数据使用的编码类型。Content-Encoding: gzip
Content-Length请求体的长度(以八位字节为单位)。Content-Length: 348
Content-Type请求体的媒体类型(用于POST和PUT请求)。Content-Type: application/x-www-form-urlencoded
Cookie服务器先前使用Set-Cookie(下文)发送的HTTP cookie。Cookie: $Version=1; Skin=new;

响应报文结构

HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 155
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
ETag: "3f80f-1b6-3e1cb03b"
Accept-Ranges: bytes
Connection: close<html><head><title>An Example Page</title></head><body><p>Hello World, this is a very simple HTML document.</p></body>
</html>

服务器向客户端发送的响应消息包括:

  • 一个状态行,包括协议版本,一个空格,响应状态码,另一个空格,可能为空的原因短语,一个回车符和一个换行符,例如:HTTP/1.1 200 OK

  • 零个或多个响应头字段,每个字段包括不区分大小写的字段名,一个冒号,可选的前导空格,字段值,一个可选的尾随空格,并以回车符和换行符结束,例如:

Content-Type: text/html

  • 一个空行,包括一个回车符和一个换行符;
  • 一个可选的消息主体。`

响应状态

在HTTP/1.0及以后的版本中,
HTTP响应的第一行被称为“状态行”,包括一个数字状态码(例如“404”)和一个文本原因短语(例如“Not Found”)。

状态码的第一个数字定义了它的类别:

  • 1XX(信息性):请求已收到,继续处理。
  • 2XX(成功):请求已成功接收、理解并接受。
  • 3XX(重定向):需要进一步采取措施以完成请求。
  • 4XX(客户端错误):请求包含错误的语法或无法满足。
  • 5XX(服务器错误):服务器未能满足显然有效的请求。

响应头字段

Field nameDescriptionExample
Accept-CH请求HTTP客户端提示Accept-CH: UA, Platform
Access-Control-Allow-Origin, Access-Control-Allow-Credentials, Access-Control-Expose-Headers, Access-Control-Max-Age, Access-Control-Allow-Methods, Access-Control-Allow-Headers指定哪些网站可以参与跨源资源共享Access-Control-Allow-Origin: *
Age对象在代理缓存中存在的时间(以秒为单位)Age: 12
Allow指定资源的有效方法。用于405方法不允许时Allow: GET, HEAD
Content-Encoding数据使用的编码类型。Content-Encoding: gzip
Content-Language所附内容的预期受众的自然语言或语言集合Content-Language: da
Content-Length响应体的长度(以八位字节为单位)Content-Length: 348
Content-Location返回数据的备用位置Content-Location: /index.htm
Content-Type此内容的MIME类型Content-Type: text/html; charset=utf-8

HTTP会话

3次握手

三次握手是TCP(传输控制协议)建立连接的过程。这个过程确保了客户端和服务器之间的可靠通信。三次握手的步骤如下:

三次握手是TCP(传输控制协议)建立连接的过程。这个过程确保了客户端和服务器之间的可靠通信。三次握手的步骤如下:

  1. 第一次握手(SYN)

    • 客户端向服务器发送一个TCP报文,其中设置了SYN(同步)标志位,表明客户端希望建立连接。
    • 客户端选择一个初始序列号(ISN)并包含在这个请求中。
  2. 第二次握手(SYN + ACK)

    • 服务器接收到客户端的SYN请求,并回应一个带有SYN和ACK标志位的TCP报文。
    • 服务器也选择一个初始序列号并包含在这个响应中。
    • 这时,服务器进入半开放状态,表示它已经准备好接受客户端的确认。
  3. 第三次握手(ACK)

    • 客户端接收到服务器的响应后,发送一个带有ACK标志位的TCP报文,表示连接已经建立。
    • 客户端和服务器都确认了对方的序列号,此时连接正式建立,双方可以开始进行数据传输。
      image.png

无状态协议

HTTP协议不存储每次请求的状态.
Q: 那么如何维护用户的信息, 比如账号保持登陆?
A: 使用cookies

Cookies(HTTP Cookies)是一种在客户端和服务器之间传递信息的小型文本文件。它们由服务器在HTTP响应头中的"Set-Cookie"字段创建,并存储在客户端的浏览器中。之后,浏览器每次请求相同的域时都会将这些Cookies信息包含在HTTP请求头中的"Cookie"字段中。

image.png

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

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

相关文章

Linux——简单的Shell程序

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、Shell程序思路二、Shell代码展示 一、Shell程序思路 用下图的时间轴来表示事件的发生次序…

C# CAD备忘录

Document doc Application.DocumentManager.MdiActiveDocument; Database db doc.Database; Editor ed doc.Editor; 1、获取打开cad文件-文件路径 string fileName db.Filename;//文件名 输出结果 fileName “L:\目录\200401.dwg” 2、获取打开cad文件-文件名称 string fi…

XUbuntu22.04之解决:systemd-journald占用cpu过高问题(二百一十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

MongoDB聚合运算符:$binarySize

$binarySize聚合运算符返回给定字符串或二进制数据的字节数。 语法 { $binarySize: <string or binData> }使用 <string or bindData>可以是任何能够被解析为字符串和二进制数据的表达式&#xff1b;如果表达式解析为null&#xff0c;则$binarySize也返回null&a…

Linux运维-Web服务器的配置与管理(PHP)

Web服务器的配置与管理(PHP) 项目场景 某企业在CentOS上搭建Web服务系统&#xff0c;以PHP作为网页开发环境&#xff0c;以MySQL为后台数据库。 基础知识 PHP PHP原始为Personal Home Page的缩写&#xff0c;已经正式更名为 “PHP: Hypertext Preprocessor”&#xff08;超…

Neo4j学习笔记1:增删改查

目录 安装练习节点和关系结构连接数据库添加节点1. Cypher2. Py2neo 添加关系1. Cypher2. Py2neo 批量添加1. Cypher2. Py2neo 查询1. Cypher2. Py2neo 更新1. Cypher2. Py2neo 删除1. Cypher2. Py2neo 安装 这边直接下载了Neo4j Desktop安装py2neo&#xff0c;安装后就可直接…

Sora,“天使”的两副面孔

在科技的天空中&#xff0c;总有一些耀眼的新星&#xff0c;它们的出现让整个世界为之震撼。2月16日&#xff0c;这样的时刻再次到来。谷歌与OpenAI两大科技巨头几乎同时宣布了各自在人工智能领域的最新突破——Gemini 1.5 Pro与Sora大模型的面世。 作为业界翘楚&#xff0c;谷…

iOS面试:4.多线程GCD

一、多线程基础知识 1.1 什么是进程&#xff1f; 进程是指在系统中正在运行的一个应用程序。对于电脑而已&#xff0c;你打开一个软件&#xff0c;就相当于开启了一个进程。对于手机而已&#xff0c;你打开了一个APP&#xff0c;就相当于开启了一个进程。 1.2 什么是线程&am…

算法题目中图和树的存储

邻接表的方式存储图和树 这就是邻接表&#xff0c;就是将每个结点的孩子结点用链表表示出来&#xff0c;再将所有结点以数组形式连起来。 存储树和图我们需要三个数组&#xff0c;h[N], e[N], ne[N],分别表示邻接表&#xff0c;结点值&#xff0c;结点的next值&#xff0c;h[i…

[项目管理-36]:敏捷开发模式与增量开发模式的比较

目录 一、增量开发模式 二、敏捷开发模式 三、比较 相似之处&#xff1a; 区别之处&#xff1a; 不同之处进一步比较 一、增量开发模式 增量开发模式是一种软件开发方法&#xff0c;其中将软件系统划分为若干个相对独立的部分&#xff0c;分别进行开发和测试&#xff0c…

面试经典150题——快乐数

​"Success is not final, failure is not fatal: It is the courage to continue that counts." - Winston Churchill 1. 题目描述 2. 题目分析与解析 2.1 思路一 还是最简单的&#xff0c;模拟最直观的思路&#xff0c;就是进行一个while循环。比如&#xff1a;…

yolov8-seg dnn调用

接上篇一直更换torch、opencv版本都无法解决这个问题&#xff08;seg调用dnn报错&#xff09;。那问题会不会出在yolov8源码本身呢。yolov8的讨论区基本都看过了&#xff0c;我决定尝试在其前身yolov5的讨论区上找找我不信没人遇到这个问题。很快找到下面的讨论第一个帖子&…

20个改善编码的Python异常处理技巧,让你的代码更高效

异常处理是写好代码的一个重要的方面&#xff0c;虽然许多开发人员都熟悉基本的try-except块&#xff0c;但是有很多更深入的知识可以使异常处理更高效、更可读和更python化。所以本文将介绍关于Python异常的20个可以显著改善编码的Python异常处理技巧&#xff0c;这些技巧可以…

软件性能测试和功能测试有何联系和区别?第三方软件检测机构简析

软件性能测试和功能测试是软件开发过程中非常重要的两个环节。从根本上说&#xff0c;它们都是为了保证软件质量和可靠性&#xff0c;但它们的目标和方法却有所不同。 软件性能测试是评估软件在特定负载下的性能表现&#xff0c;包括响应时间、吞吐量、并发能力等指标。它通过…

Jenkins详解

目录 一、Jenkins CI/CD 1、 Jenkins CI/CD 流程图 2、介绍 Jenkins 1、Jenkins概念 2、Jenkins目的 3、特性 4、产品发布流程 3、安装Jenkins 1、安装JDK 2、安装tomcat 3.安装maven 4安装jenkins 5.启动tomcat&#xff0c;并页面访问 5.添加节点 一、Jenkins CI/…

链表的建立,初始化,及输出

初识链表照着书上敲了完整的&#xff0c;大家看看哪里有问题&#xff01;欢迎留言&#xff01; 创建链表节点 单链表初始化 单链表的建立 /*链表的初始化、创建以及输出*/ #include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<string.…

Opencv实战(2)绘图与图像操作

Opencv实战(2)绘图与图像操作 指路前文&#xff1a;Opencv实战(1)读取与像素操作 三、基本绘图 文章目录 Opencv实战(2)绘图与图像操作三、基本绘图(1).line(2).rectangle(3).circle 四、图像处理(1).颜色空间1.意义2.cvtColor()3.inRange()4.适应光线 (2).形态操作1.腐蚀2.膨…

Python语句(一)【条件语句】

条件语句&#xff1a;通过一条或多条语句的执行结果&#xff08;True或者False&#xff09;来决定执行的代码块。 其程序流程图如下&#xff1a; 条件语句包括&#xff1a;if 判断条件&#xff1a;执行语句…… else&#xff1a;执行语句……orif 判断条件1:执行语句1…… el…

如何将一个字符串中的字符提取出来(Python与C/C++)

Python&#xff1a; 1.使用遍历方法&#xff1a; string "Hello World" characters [] for char in string:characters.append(char) print(characters) #输出[H, e, l, l, o, , W, o, r, l, d] 2.使用列表推导式&#xff1a; string "Hello World" …

carl 哈希表

1.有效的字母异位词 class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_map<int, int> mymap;unordered_set<int> result;for (int i 0; i < nums1.size(); i){/* code */if …