当前位置: 首页 > ds >正文

应用层协议——HTTP

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • HTTP简介
  • 一、URL
    • 1.1 URL的基本结构
    • 1.2 示例解析
    • 1.3 urlencode 和 urldecode
  • 二、HTTP 协议请求与响应格式
    • 2.1HTTP请求
    • 2.2 HTTP响应
    • 2.3 HTTP常见header
      • Cookie 与 Session 特性对比
      • 部分关键HTTP请求和响应头字段的表格内容
  • 三、HTTP请求方法
    • 3.1 GET
    • 3.2 POST
  • 四、HTTP状态码


HTTP简介

HTTP(Hypertext Transfer Protocol,超文本传输协议)
虽然说应用层的协议我们程序员可以自己定制(其过程大概遵守OSI七层协议的上三层,通过业务需求模块(应用层),通信数据结构设计以及序列化和反序列化模块(表示层),服务通信的传输协议的封装模块(会话层)来实现)。但在实际使用中已经有完善和好用的协议供我们使用了。
它是互联网中最核心的应用层的协议之一,用于在客户端(如浏览器)和服务器之间传输超文本(如 HTML 文档、图片、视频等)。它是构建万维网(WWW)的基础,我们日常浏览网页、发送表单、加载资源等操作都依赖于 HTTP。


一、URL

URL(Uniform Resource Locator,统一资源定位符)是互联网上用于标识和定位资源(如网页、图片、文件等)的字符串,通俗来说就是我们常说的 “网址”。通过 URL,客户端(如浏览器)可以准确找到并访问服务器上的资源。

在网络中我们已经有了IP和端口号来标识一个主机上的某个服务器,为什么还要设计出URL这种东西呢?
其实主要目的就是便于使用

1.1 URL的基本结构

一个完整的 URL 通常由以下几个部分组成(部分可选),格式如下:

协议://用户名:密码@主机名:端口号/路径?查询参数#片段标识符
在这里插入图片描述

1.2 示例解析

以常见的网页 URL 为例:

https://www.example.com:8080/blog?category=tech&sort=time#comment5

  • 协议:https(使用 HTTPS 加密协议)
  • 主机名:www.example.com(服务器域名)
  • 端口号:8080(非默认端口,需显式指定)
  • 路径:/blog(服务器上的blog资源路径)
  • 查询参数:category=tech&sort=time(传递分类为 “tech”、排序方式为 “time” 的参数)
  • 片段标识符:comment5(定位到资源内的comment5部分)

1.3 urlencode 和 urldecode

URL 中只能包含部分 ASCII 字符(如字母、数字、-_.~等),若包含特殊字符(如空格、中文、&?#等),需进行URL 编码(也叫百分号编码),将特殊字符转换为%XX的形式(XX 为字符的十六进制 ASCII 码)。

例如:

  • 空格编码为%20(或+,在查询参数中常用)
  • 中文 “测试” 的 UTF-8 编码为%E6%B5%8B%E8%AF%95
  • 问号?编码为%3F(避免被解析为查询参数的开始)

转义的规则如下:
将需要转码的字符转为 16 进制,然后从右到左,取 4 位(不足 4 位直接处理),每 2 位做一位,前面加上%,编码成%XY 格式
例如:
在这里插入图片描述
“+” 被转义成了 “%2B”

这个过程一般发生在客户端(浏览器)中,urldecode 就是 urlencode 的逆过程

二、HTTP 协议请求与响应格式

HTTP的请求和响应就是两者数据的序列化和反序列化的过程,它使用特殊字符“/r/n等”来进行字符串之间的拼接,不需要依赖任何第三方库
而我们要做的就是对数据字符进行处理即可。

2.1HTTP请求

客户端发送的请求由三部分组成:请求行、请求头(header)、请求体 (body) /(可选)。当使用HTTP发送请求时,发送的就是如下字符串
在这里插入图片描述

  • 首行:请求方法与地址:POST http://job.xjtu.edu.cn/companyLogin.do HTTP/1.1
  • 请求报头: 请求的属性, 冒号分割的键值对;每组属性之间使用\r\n 分隔;遇到空行
    表示 Header 部分结束
  • 请求正文: 空行后面的内容都是 Body. Body 允许为空字符串. 如果 Body 存在,则在Header 中会有一个 Content-Length 属性来标识 Body 的长度-

在这里插入图片描述

2.2 HTTP响应

响应通常是我们自己的服务器发送的请求给客户端,因此这一部分的状态行还有各项数据通常需要我们自己做处理,同样也是对字符串的处理:
在这里插入图片描述

  • 首行: [版本号] + [状态码] + [状态码解释]
  • 请求报文: 请求的属性, 冒号分割的键值对;每组属性之间使用\r\n 分隔;遇到空行表示 Header 部分结束
  • 请求正文: 空行后面的内容都是 Body. Body 允许为空字符串. 如果 Body 存在, 则在
    Header 中会有一个 Content-Length 属性来标识 Body 的长度; 如果服务器返回了
    个 html 页面, 那么 html 页面内容就是在 body 中.

以下是响应的格式:
在这里插入图片描述

2.3 HTTP常见header

  • Content-Type: 数据类型(text/html 等)
  • Content-Length: Body 的长度
  • Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
  • User-Agent: 声明用户的操作系统和浏览器版本信息;
  • referer: 当前页面是从哪个页面跳转过来的;
  • Location: 搭配 3xx 状态码使用, 告诉客户端接下来要去哪里访问;
  • Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;
    以下是基于提供的信息生成的对比表格,采用 Markdown 格式:

Cookie 与 Session 特性对比

HTTP是一种无状态无连接的协议,每次建立连接都需要建立新连接,因此服务器不会保存任何客户端信息。
使用cookie面临的最大问题就是隐私数据安全问题,session作为辅助来解决这一问题。

特性CookieSession
存储位置客户端(浏览器本地文件或内存)服务器端(内存、数据库、文件等)
存储内容小型文本数据(键值对,通常 <4KB)任意类型数据(对象、字符串等,容量较大)
安全性较低(存储在客户端,可能被篡改或窃取)较高(存储在服务器,客户端仅获 session_id)
生命周期可设置过期时间(持久 Cookie)或会话结束后失效(会话 Cookie)通常随会话结束(如浏览器关闭)失效,或服务器设置超时时间
网络传输每次请求自动携带在 HTTP 头中仅通过 Cookie 或 URL 携带 session_id(核心标识)
跨域限制受域名、路径限制(同域才能访问)依赖 session_id 的传递,本质同 Cookie 限制
  • 数据存储差异:Cookie 存储容量有限且仅支持文本,Session 可存储复杂对象。
  • 安全机制:Session 通过服务端存储敏感数据,仅传递标识符(session_id),降低泄露风险。
  • 生命周期控制:Cookie 的过期时间由客户端或代码显式设置,Session 通常依赖会话状态或服务端配置。

部分关键HTTP请求和响应头字段的表格内容

字段名含义样例
Accept客户端可接受的响应内容类型Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding客户端支持的数据压缩格式Accept-Encoding: gzip, deflate, br
Accept-Language客户端可接受的语言类型Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Host请求的主机名和端口号Host: www.example.com:8080
User-Agent客户端的软件环境信息User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/91.0.4472.124
Cookie客户端发送的HTTP cookie信息Cookie: session_id=abcdefg12345; user_id=123
Referer请求的来源URLReferer: http://www.example.com/previous_page.html
Content-Type实体主体的媒体类型Content-Type: application/x-www-form-urlencodedapplication/json
Content-Length实体主体的字节大小Content-Length: 150
Authorization认证信息(如用户名和密码)Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==(Base64编码)
Cache-Control缓存控制指令请求:Cache-Control: no-cache;响应:Cache-Control: public, max-age=3600
Connection请求后是否保持连接 ,注意这是tcp的特性Connection: keep-aliveConnection: close
Date请求或响应的日期和时间Date: Wed, 21 Oct 2023 07:28:00 GMT
Location重定向的目标URL(与3xx状态码配合)Location: http://www.example.com/new_location.html
Server服务器类型Server: Apache/2.4.41 (Unix)
Last-Modified资源的最后修改时间Last-Modified: Wed, 21 Oct 2023 07:20:00 GMT
ETag资源的唯一标识符(用于缓存)ETag: "3f80f-1b6-5f4e2512a4100"
Expires响应过期的日期和时间Expires: Wed, 21 Oct 2023 08:28:00 GMT

三、HTTP请求方法

在这里插入图片描述
在HTTP中最常用的就是GET和POST也就是相当于网络上的IO操作。而两者的区别在于一个是提交数据到请求行的uri上而一个是将数据放到正文中。

3.1 GET

  • 作用:从服务器获取资源(如网页、图片、数据等)。
    特点:
  • 请求参数附加在 URL 中(如 https://example.com/user?id=123),有长度限制(取决于浏览器和服务器)。不适合传输敏感信息(参数暴露在 URL 中)。
  • 场景:浏览网页、查询数据(如搜索、获取用户信息)。
    特性:指定资源经服务器端解析后返回响应内容。

3.2 POST

-作用:向服务器提交数据,通常用于创建新资源或修改服务器状态。
特点:

  • 请求参数放在请求体(Body)中,无长度限制,可传输大量数据(如表单、JSON、文件)。
  • 场景:用户注册、提交表单、上传文件、创建数据(如发布文章)。
    特性:可以发送大量的数据给服务器,并且数据包含在请求体中。

四、HTTP状态码

由于当代的浏览器功能已经很强大了,所以对于状态码的解释和设置在前端上大部分都会忽略或者随便写状态码。
在这里插入图片描述
这里主要介绍下重定向的状态码

301 Moved Permanently(永久重定向)
含义:请求的资源已永久移动到新位置,新 URL 会在响应头的 Location 字段中返回。
特点:
浏览器会缓存该重定向关系,后续请求相同 URL 时,会直接跳转到新地址(无需再次向原服务器请求)。
常用于网站域名变更(如 old.com 迁移到 new.com)、页面永久移除并替换为新页面。
示例:访问 https://old-domain.com/page 时,服务器返回 301 并指定 Location: https://new-domain.com/new-page,浏览器自动跳转到新地址。

302 Found(临时重定向,原 302 Moved Temporarily)
含义:请求的资源临时位于新位置,新 URL 在 Location 字段中返回,未来可能再次变更。
特点:
浏览器不会缓存重定向关系,每次请求原 URL 都会先向服务器确认新地址。
历史上存在语义歧义(早期规范要求客户端不能修改请求方法,如 POST 被转为 GET,但现代浏览器通常会保留原方法)。
场景:临时维护页面跳转(如 site.com 临时跳转到 site.com/maintenance)、活动页面临时替换。


http://www.xdnf.cn/news/18031.html

相关文章:

  • 抽奖程序web程序
  • JavaScript 基础实战:DOM 操作、数据类型与常见需求实现
  • 项目管理工具
  • NPM 、 NPX
  • 清除 pnpm 缓存,解决不同源安装依赖包失败的问题
  • electron之win/mac通知免打扰
  • 【R语言】R 语言中 gsub 与正则表达式详解(含 POSIX 与 Perl 风格实例)
  • 汽车电子:现代汽车的智能核心
  • [激光原理与应用-287]:理论 - 波动光学 - 电磁波既能承载能量,又能承载信息?
  • 【软件设计模式】前置知识类图、七大原则(精简笔记版)
  • Spark 运行流程核心组件(二)任务调度
  • EN/IEC 55015 照明设备的电磁兼容标准安全
  • Docker Compose部署Clickhouse最新版
  • 【LINUX网络】HTTP协议基本结构、搭建自己的HTTP简单服务器
  • 为什么游戏会出现“卡顿”:`clock.tick()` v.s. `clock.get_fps()`
  • 【uni-app】根据角色/身份切换显示不同的 自定义 tabbar
  • 线性代数 · 直观理解矩阵 | 空间变换 / 特征值 / 特征向量
  • CERT/CC警告:新型HTTP/2漏洞“MadeYouReset“恐致全球服务器遭DDoS攻击瘫痪
  • 机械加工元件——工业精密制造的璀璨明珠
  • Day14: Flask太空站搭建指南:从零到超光速的Web开发之旅
  • git clone https://gh.llkk.cc/
  • C++从入门到实战(十九)C++ vector容器及其常用接口
  • 电子电路学习日记
  • qt项目中解决关闭弹窗后执行主界面的信号槽时闪退问题
  • MySql——聚簇索引(主键索引)和非聚簇索索引(非主键索引)引区别(即聚集索引和非聚集索引区别)
  • Java 学习笔记(基础篇2)
  • Docker build创建镜像命令入门教程
  • **超融合架构中的发散创新:探索现代编程语言的挑战与机遇**一、引言随着数字化时代的快速发展,超融合架构已成为IT领域的一种重要趋势
  • ts概念讲解
  • Vue 3 + TypeScript:package.json 示例 / 详细注释说明