应用层协议:HTTP

目录

HTTP:超文本传输协议

1.1 HTTP报文

1.1.1 请求报文

1.1.2 响应报文

1.2 HTTP请求过程和原理

1.2.1 请求过程

1、域名(DNS)解析

2、建立TCP连接(三次握手)

3、发送HTTP请求

4、服务器处理请求

5、返回HTTP响应

6、浏览器渲染(客户端侧)

7、断开TCP连接(四次挥手)

1.2.2 核心原理

1.3 HTTP的不同版本

1.3.1 HTTP1.0

1.3.2 HTTP1.1(常用)

1.3.3 HTTP2.0(常用)

1.3.4 HTTP3.0


应用层协议是网络模型中最高层的协议,直接为用户应用程序提供服务,定义了应用程序之间如何进行通信和数据交换的规则。

HTTP:超文本传输协议

  • 功能: HTTP 是用于在 HTTP 应用程序(Web 浏览器和 Web 服务器)之间传输超文本文档(如 HTML 文件)的基础协议。它定义了客户端(浏览器)如何请求资源(如网页、图片)以及服务器如何响应这些请求。它是一种无状态协议(服务器默认不记住之前的请求)。

无状态:HTTP 协议本身不保留之前请求或响应的任何信息。

  • 端口: HTTP - 80

1.1 HTTP报文

  • HTTP 请求 (HTTP Request): 客户端向服务器发送一个格式化的消息,说明它想要什么(例如,“给我 index.html 页面” 或 “把这个表单数据提交到服务器”)。

  • HTTP 响应 (HTTP Response): 服务器处理请求后,向客户端返回一个格式化的消息,包含请求的结果(例如,返回 index.html 文件的内容,或告知表单提交成功/失败)。

1.1.1 请求报文

请求行 (Request Line):

  • 方法 (Method):定义要对资源执行的操作(如 GETPOSTPUTDELETEHEADOPTIONS 等)。

  • 请求目标 (Request Target):通常是资源的 URL 路径(有时包含查询参数),例如 /index.html 或 /search?q=term

  • HTTP 版本:如 HTTP/1.1

  • 示例: GET /index.html HTTP/1.1

请求头 (Request Headers):

  • 一系列键值对 (Header-Name: Header-Value),提供关于请求的额外信息。

  • 常见头:

    • Host: 目标服务器的主机名和端口(必需,尤其在虚拟主机环境下)。

    • User-Agent: 客户端标识(浏览器类型、版本、操作系统等)。

    • Accept: 客户端可接受的响应内容类型(MIME 类型),如 text/html, application/json

    • Accept-Language: 客户端接受的自然语言(如 en-US, zh-CN)。

    • Accept-Encoding: 客户端接受的内容编码(压缩方式),如 gzip, deflate, br

    • Connection: 控制连接选项(如 keep-alive 表示希望保持连接)。

    • Cookie: 将之前服务器设置的 Cookie 发送回服务器。解决HTTP无状态的问题。

    • sec-fetch-dest :期望获得什么类型的资源
    • sec-fetch-mode navigate,表示这是一个浏览器的页面切换请求 
    • sec-fetch-site:表示一个请求发起的来源和目标资源来源之间的关系,cross
      site :跨域请求, same-origin :同源请求。
    • sec-fetch-user :? 1 表示的true。
    • upgrade-insecure-requests :1,表示当前浏览器告诉服务器,浏览器是可以处理https 请求的,即使访问的 https 请求中又包含了其他的http请求。
    • user-agent:描述浏览器的信息

    • Content-Type (用于 POST/PUT 等):请求体(Body)的数据类型(如 application/x-www-form-urlencodedmultipart/form-dataapplication/json)。

    • Content-Length (用于有 Body 的请求):请求体的大小(字节数)。

    • Authorization: 包含用于访问受保护资源的凭证(如 Basic <credentials>Bearer <token>)。

空行 (Empty Line):

  • 分隔头部和请求体。

请求体 (Request Body - 可选):

  • 包含发送给服务器的数据。主要用于 POSTPUTPATCH 等方法提交表单数据、上传文件或发送 JSON/XML 等结构化数据。

  • GETHEADDELETEOPTIONS 等方法通常没有请求体。

1.1.2 响应报文

状态行 (Status Line):

  • HTTP 版本:如 HTTP/1.1

  • 状态码 (Status Code):一个三位数字代码,表示请求处理结果(如 200 OK404 Not Found500 Internal Server Error)。

1xx (信息性响应): 表示请求已被接收,需要继续处理。

  • 100 Continue: 客户端应继续发送请求体。

  • 101 Switching Protocols: 服务器应客户端要求切换协议(如升级到 WebSocket)。

2xx (成功): 表示请求已成功被服务器接收、理解、并接受。

  • 200 OK请求成功。GET 请求返回资源,POST/PUT 请求返回操作结果。

  • 201 Created: 请求成功并创建了新资源(通常在 POST 或 PUT 后)。

  • 202 Accepted: 请求已接受处理,但处理尚未完成(异步操作)。

  • 204 No Content: 请求成功,但响应没有内容(如 DELETE 成功)。

3xx (重定向): 表示需要客户端采取进一步的操作才能完成请求。

  • 301 Moved Permanently: 请求的资源已永久移动到新 URL(Location 头中)。客户端应更新书签。

  • 302 Found (曾用名 Moved Temporarily): 请求的资源临时移动到另一个 URL(Location 头中)。客户端本次应访问新 URL,但以后仍可用旧 URL。

  • 304 Not Modified: 资源未被修改(用于缓存)。客户端可直接使用缓存的版本。

  • 307 Temporary Redirect: 类似于 302,但要求客户端必须保持原请求方法不变(如 POST 重定向后必须还是 POST)。

  • 308 Permanent Redirect: 类似于 301,但要求客户端必须保持原请求方法不变

4xx (客户端错误): 表示请求包含语法错误或无法完成。

  • 400 Bad Request: 请求语法错误或参数无效,服务器无法理解。

  • 401 Unauthorized: 请求需要用户认证(登录)。通常伴随 WWW-Authenticate 头。

  • 403 Forbidden: 服务器理解请求,但拒绝执行(权限不足)。

  • 404 Not Found: 服务器找不到请求的资源(URL 错误或资源已被删除)。

  • 405 Method Not Allowed: 请求中使用的 HTTP 方法不被目标资源支持(如对只读资源用 POST)。

  • 408 Request Timeout: 服务器在等待请求发送时超时

  • 429 Too Many Requests: 客户端在规定时间内发送了过多请求(限流)。

5xx (服务器错误): 表示服务器在处理请求时发生错误。

  • 500 Internal Server Error服务器内部错误,无法完成请求(代码崩溃、配置错误等)。

  • 501 Not Implemented: 服务器不支持完成请求所需的某个功能(如请求了一个未实现的方法)。

  • 502 Bad Gateway: 作为网关或代理的服务器,从上游服务器收到无效响应

  • 503 Service Unavailable: 服务器暂时过载或停机维护,无法处理请求(稍后重试)。

  • 504 Gateway Timeout: 作为网关或代理的服务器,未能及时从上游服务器获得响应。

  • 状态文本 (Reason Phrase):对状态码的简短文字描述(如 OKNot Found)。

  • 示例: HTTP/1.1 200 OK 或 HTTP/1.1 404 Not Found

响应头 (Response Headers):

  • 一系列键值对,提供关于响应的额外信息。

  • 常见头:

    • Server: 服务器软件信息(如 Apache/2.4.41nginx/1.18.0)。

    • Date: 响应生成的日期和时间。

    • Content-Type: 响应体的数据类型(MIME 类型),如 text/html; charset=UTF-8image/jpegapplication/json

    • Content-Length: 响应体的大小(字节数)。

    • Content-Encoding: 响应体使用的压缩编码(如 gzip),指示客户端需要解压。

    • Connection: 连接选项(如 keep-alive)。

    • Cache-Control: 指示客户端和中间代理如何缓存此响应。

    • Set-Cookie: 服务器要求客户端存储一个或多个 Cookie。

    • Location: 在重定向响应(3xx)中,指定客户端应跳转的新 URL。

    • WWW-Authenticate: 在 401 Unauthorized 响应中,指定服务器要求的认证方式。

空行 (Empty Line):

  • 分隔头部和响应体。

响应体 (Response Body - 可选):

  • 包含服务器返回给客户端的实际数据内容。最常见的是 HTML 文档,但也可能是图片、视频、CSS、JavaScript、JSON、XML 等。

  • 状态码为 204 No Content 或 304 Not Modified 的响应通常没有响应体。

1.2 HTTP请求过程和原理

1.2.1 请求过程

1、域名(DNS)解析
  • 浏览器解析URL中的域名(如 www.example.com

  • 查询本地DNS缓存 → 系统Hosts文件 → 递归查询DNS服务器 → 获取目标服务器的IP地址(如 93.184.216.34)。

2、建立TCP连接(三次握手)

  • 目的:确保双方具备可靠数据传输能力。

  • 端口:HTTP默认 80

3、发送HTTP请求

浏览器构建 HTTP 请求,包括请求行、请求头和请求体;然后将请求发送到服务器。

请求报文结构:

GET /index.html HTTP/1.1          // 请求行(方法+路径+协议版本)
Host: www.example.com             // 必需头部
User-Agent: Mozilla/5.0           // 客户端标识
Accept: text/html                 // 可接受的响应类型
Connection: keep-alive            // 保持连接
(空行)                             // 头部结束标记
(可选请求体,如POST提交的数据)       // GET请求无请求体
4、服务器处理请求
  • Web服务器(如Nginx/Apache)接收请求

  • 路由解析(匹配URL到具体处理程序)

  • 应用逻辑执行(如查询数据库)

  • 生成响应内容(HTML/JSON等)。

5、返回HTTP响应

响应报文结构:

HTTP/1.1 200 OK                     // 状态行(协议版本+状态码)
Content-Type: text/html; charset=utf-8  // 响应数据类型
Content-Length: 1024                // 数据长度
Set-Cookie: session_id=abc123       // 会话管理
(空行)                               // 头部结束标记
<!DOCTYPE html>                      // 响应体(实际数据)
<html>...</html>
6、浏览器渲染(客户端侧)
  • 解析HTML → 构建DOM树

  • 加载CSS/JS → 渲染页面

  • 执行JavaScript逻辑。

7、断开TCP连接(四次挥手)
  • HTTP/1.1 默认 keep-alive(复用连接)

  • 超时或显式关闭时触发 TCP四次挥手

1.2.2 核心原理

1、无状态协议

  • 每次请求独立,服务器不保存客户端状态

  • 解决方案:Cookies/Session/JWT Token 维持会话状态。

  • Cookies:服务器通过 Set-Cookie 响应头将状态信息存储在客户端,客户端在后续请求中发送该 Cookie 以维持状态。
  • Session:服务器生成一个唯一的会话 ID,存储在 Cookie 中,并在服务器端维护与该会话 ID 关联的状态信息。
  • Token:使用 JWT(JSON Web Token)等机制在客户端存储状态信息,客户端在每次请求中发送该 Token。

2、持久连接(HTTP/1.1 Keep-Alive)

  • 单TCP连接处理多个请求/响应,减少握手开销

  • 对比HTTP/1.0(每个请求新建连接)。

3、管道化技术(Pipelining)

  • 客户端连续发送多个请求而不等响应

  • 实际因队头阻塞问题被弃用(必须按照请求相同的顺序回送HTTP响应) → HTTP/2 多路复用解决。

1.3 HTTP的不同版本

1.3.1 HTTP1.0

非持久连接:默认情况下,每个 HTTP 请求/响应对之后,连接会被关闭,属于短连接。这意味着对于同一个网站的每个资源请求,如 HTML 页面上的图片和脚本,都需要建立一个新的 TCP 连接。可以设置Connection: keep-alive 强制开启长连接。

1.3.2 HTTP1.1(常用)

持久连接:HTTP 1.1 引入了持久连接(也称为 HTTP keep-alive),默认情况下不会立即关闭连接,可以在一个连接上发送多个请求和响应。极大减轻了 TCP 连接的开销。

持久连接的超时时间:

  • HTTP/1.1 规范本身没有定义默认的 keep-alive 超时时间。

  • 实际的默认超时时间取决于使用的具体 Web 服务器软件和 HTTP 客户端库/应用程序的配置。

  • 常见 Web 服务器的典型默认值范围在 5 秒到 120 秒之间(例如 Nginx 默认为 75 秒)。

  • 客户端(如浏览器)通常也有自己的默认值(可能几分钟)。

  • 服务器和客户端可以通过 Keep-Alive: timeout= 头部进行协商,最终超时通常由服务器决定或配置。

管道化处理:HTTP 1.1 支持客户端在前一个请求的响应到达之前发送下一个请求,以提高传输效率。有队头阻塞问题(必须按照请求相同的顺序回送HTTP响应)

1.3.3 HTTP2.0(常用)

二进制分帧将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 ,其中HTTP1.x的首部信息会被封装到Headers帧,而我们的request body则封装到Data帧里面。帧是数据传输的最小单位, 以二进制传输代替原本的明文传输。这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装。

多路复用:一个 TCP 连接上可以同时进行多个 HTTP 请求/响应,解决了 HTTP 1.x 的队头阻塞问题。尽管从逻辑上来说,不同的流之间相互独立,不会相互影响,但在实际传输的过程中,数据还是要一帧一帧的发送和接收,一旦某一个流的数据有丢包,仍然会阻塞在它之后传输的流数据。

头部压缩:HTTP 协议不带状态,所以每次请求都必须附上所有信息。HTTP 2.0 引入了头部压缩机制,可以使用 gzip 或 compress 压缩后再发送,减少了冗余头部信息的带宽消耗。

服务端推送:服务器可以主动向客户端推送资源,而不需要客户端明确请求。

1.3.4 HTTP3.0

基于QUIC协议(UDP):HTTP/2.0 基于 TCP 协议,而 HTTP/3.0 则基于 QUIC 协议,Quick UDP Connections,直译为快速 UDP 网络连接。基于 UDP 的 QUIC 协议,让不同的流之间真正的实现相互独立传输,互不干扰。

版本核心改进解决的问题
HTTP/1.0支持Header、多种请求方法基础标准化
HTTP/1.1持久连接、分块传输TCP连接复用
HTTP/2二进制分帧、多路复用、头部压缩队头阻塞、性能优化
HTTP/3基于QUIC协议(UDP)、0-RTT握手TCP队头阻塞、延迟更低

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

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

相关文章

商务合同范本智能审核系统 AI 大模型处理方案

1. 项目概述与目标 目标: 构建一个基于AI大模型的智能合同审核系统,能够自动解析商务合同范本,识别其中的法律风险点(如权责不对等、违约金比例异常、条款模糊、缺失必要条款等),并结合企业内部合规数据库进行实时比对,提供专业的修改建议,大幅提升合同审查的效率和合…

Kafka 消息队列

一、 消息队列 1. 什么是消息队列 消息(Message)是指在应用间传送的数据。消息可以非常简单&#xff0c;比如只包含文本字符串&#xff0c;也可以更复杂&#xff0c;可能包含嵌入对象。消息队列(Message Queue)是一种应用间的通信方式&#xff0c;消息发送后可以立即返回&…

NodeJS全栈WEB3面试题——P3Web3.js / Ethers.js 使用

3.1 Ethers.js 和 Web3.js 的主要区别是什么&#xff1f; 比较点Ethers.jsWeb3.js体积更轻量&#xff0c;适合前端较大&#xff0c;加载慢&#xff0c;适合 Node文档文档简洁、现代化&#xff0c;支持 TypeScript文档丰富&#xff0c;但不够现代化模块化设计高度模块化&#x…

Ubuntu 桌面版忘记账户密码的重置方法

如果你忘记了 Ubuntu 桌面版的用户密码&#xff0c;可以通过进入恢复模式&#xff08;Recovery Mode&#xff09;来重置密码。以下是详细步骤&#xff1a; 一、进入 GRUB 引导菜单 重启计算机&#xff1a;点击关机按钮&#xff0c;选择重启。在启动时按住 Shift 键&#xff1…

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…

【五子棋在线对战】二.项目结构设计 实用工具类模板的实现

项目结构设计 1.项目模块划分2.业务处理模块子模块的划分3.实用工具类模板的实现3.1 日志宏的实现3.2 mysql工具3.3 JsonCpp工具3.4 string-Split工具 && file_util工具 1.项目模块划分 ● 数据管理模块&#xff1a;依托 MySQL 数据库&#xff0c;负责用户数据的存储与…

53 python akshare(获取金融数据)

在金融数据获取与分析领域,AkShare是一个强大且灵活的开源库,它提供了丰富的金融数据接口,覆盖股票、期货、期权、基金、债券、外汇等多个金融市场。AkShare更专注于中国金融市场数据,并且支持从多个数据源获取数据,具有更高的稳定性和更全面的数据覆盖。 一、安装akshar…

蓝桥杯17114 残缺的数字

问题描述 七段码显示器是一种常见的显示数字的电子元件&#xff0c;它由七个发光管组成: 图依次展示了数字 0∼9 用七段码来显示的状态&#xff0c;其中灯管为黄色表示点亮&#xff0c;灰色表示熄灭。根据灯管的亮暗状态&#xff0c;我们可以用一个状态码(状态码是一个 7 位的…

Java观察者模式深度解析:构建松耦合事件驱动系统的艺术

目录 观察者模式基础解析核心结构与实现原理Java内置观察者实现Spring框架中的高级应用典型应用场景与实战案例观察者模式变体与优化常见问题与最佳实践总结与未来展望1. 观察者模式基础解析 1.1 模式定义与核心思想 观察者模式(Observer Pattern)是一种行为型设计模式,它…

NocoBase v1.7.0 正式版发布

原文链接&#xff1a;https://www.nocobase.com/cn/blog/nocobase-1-7-0。 新特性 用户角色并集 角色并集是一种权限管理模式&#xff0c;根据系统设置&#xff0c;系统开发者可以选择使用独立角色、允许角色并集&#xff0c;或者仅使用角色并集&#xff0c;以满足不同的权限…

破解通信难题,modbus转profibus网关在高炉水冲渣系统中稳定好用

基于在高炉水冲渣传动监控系统的工艺背景下,稳联技术Profibus-Modbus网关在控制系统中使支持Profibus协议的设备与支持Modbus RTU协议的设备之间进行通讯协议转换的作用,使得支持不同通讯协议的设备之间能够进行数据传递,并且给出了设计方法.应用Profibus-Modbus总线桥WL-ABD30…

开源是什么?我们为什么要开源?

本片为故事类文章推荐听音频哦 软件自由运动的背景 梦开始的地方 20世纪70年代&#xff0c;软件行业处于早期发展阶段&#xff0c;软件通常与硬件捆绑销售&#xff0c;用户对软件的使用、修改和分发权利非常有限。随着计算机技术的发展和互联网的普及&#xff0c;越来越多的开…

Educational Codeforces Round 179 (Rated for Div. 2)(A-E)

题目链接&#xff1a;Dashboard - Educational Codeforces Round 179 (Rated for Div. 2) - Codeforces A. Energy Crystals 思路 贪心地模拟一下过程很容易就看出来了&#xff0c;每次变成尽可能大的数 1 1 0 -> 1 1 3 -> 3 3 5 -> 5 5 11....我们只需要关注最大…

React Native开发鸿蒙运动健康类应用的项目实践记录

​​项目名称​​&#xff1a;HarmonyFitness - 基于React Native的鸿蒙运动健康应用 ​​技术栈​​&#xff1a;React Native 0.72.5 TypeScript HarmonyOS API ArkTS原生模块 一、环境搭建与项目初始化 ​​双环境配置​​ ​​React Native环境​​&#xff1a; npx re…

Linux --UDP套接字实现简单的网络聊天室

一、Server端的实现 1.1、服务端的初始化 ①、创建套接字&#xff1a; 创建套接字接口&#xff1a; #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int socket(int domain, int type, int protocol); //1. 这是一个创建套接字的接…

Eureka 高可用集群搭建实战:服务注册与发现的底层原理与避坑指南

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…

Spring Boot应用开发实战

Spring Boot应用开发实战&#xff1a;从零到生产级项目的深度指南 在当今Java生态中&#xff0c;Spring Boot已占据绝对主导地位——据统计&#xff0c;超过75%的新Java项目选择Spring Boot作为开发框架。本文将带您从零开始&#xff0c;深入探索Spring Boot的核心精髓&#xf…

yum更换阿里云的镜像源

步骤 1&#xff1a;备份原有源配置&#xff08;重要&#xff01;&#xff09; sudo mkdir /etc/yum.repos.d/backup sudo mv /etc/yum.repos.d/CentOS-* /etc/yum.repos.d/backup/步骤 2&#xff1a;下载阿里云源配置 sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https:…

【算法训练营Day06】哈希表part2

文章目录 四数相加赎金信三数之和四数之和 四数相加 题目链接&#xff1a;454. 四数相加 II 这个题注意它只需要给出次数&#xff0c;而不是元组。所以我们可以分治。将前两个数组的加和情况使用map存储起来&#xff0c;再将后两个数组的加和情况使用map存储起来&#xff0c;ke…

JS手写代码篇---手写apply方法

11、手写apply方法 apply方法的作用&#xff1a; apply 是一个函数的方法&#xff0c;它允许你调用一个函数&#xff0c;同时将函数的 this 值设置为指定的值&#xff0c;并将函数的参数作为数组&#xff08;或类数组对象&#xff09;传递给该函数。 与call的区别&#xff1…