详解应用层的HTTP协议与HTTPS协议

news2024/10/5 0:17:57

文章目录

  • 前言
  • HTTP协议
    • 1. 理解应用层协议
    • 1. 什么是HTTP协议?
    • 2. HTTP协议工作流程
    • 3. HTTP报文格式
      • 3.1 HTTP请求方法
      • 3.2 HTTP请求报头
      • 3.3 HTTP请求正文
      • 3.4 HTTP响应的状态码
      • 3.4 HTTP响应的报头
      • 3.5 HTTP响应的正文
      • 3.6 HTTP请求的URL
    • 4. POST请求与GET请求
    • 5. HTTP协议实例——登录过程

前言

在前面我们介绍了数据链路层、网络层、传输层的相关协议,本文将继续介绍应用层应用相对来说较广泛的 HTTP协议。
HTTP 往往是基于传输层的 TCP 协议实现(HTTP1.0, HTTP1.1, HTTP2.0 均为TCP, HTTP3 基于 UDP实现)。
目前我们主要使用的还是 HTTP 1.1 和 HTTP2.0 。本文讨论的 HTTP 以 1.1 版本为主。

HTTP协议

1. 理解应用层协议

经过TCP/IP,我们可以知道数据能从客户端进程经过路径选择跨网络传送到服务器端进程 [ IP+Port ]
但是我们实际应用中并不只是将数据传送到另一端,我们还需要根据双方需求对数据进行修改等等,此时我们就需要一层协议,不关心数据传送的细节,只关心业务层面对数据进行处理等等,所以就诞生了应用层协议。

1. 什么是HTTP协议?

我们平时打开一个网站, 就是通过 HTTP 协议来传输数据。
当我们在浏览器中输入百度的 “网址” (URL) 时, 浏览器就给百度的服务器发送了一个 HTTP 请求,百度的服务器就会根据请求返回了一个 HTTP 响应。这个响应结果被浏览器解析之后,就展示成我们看到的页面内容。

注意: 这个过程中浏览器可能会给服务器发送多个 HTTP 请求, 服务器会对应返回多个响应,这些响应里就包含了页面 HTML, CSS, JavaScript,图片,字体等信息。

2. HTTP协议工作流程

当我们在浏览器中输入一个 “网址”,此时浏览器就会给对应的服务器发送一个 HTTP 请求。对方服务器收到这个请求之后,经过计算处理, 就会返回一个 HTTP 响应。

以下是一个简化的流程:实际我们加载页面时可能不仅仅进行一层http请求与响应。
在这里插入图片描述

我们发送的HTTP请求以及返回的HTTP响应都是可以通过Fiddler进行抓包查看具体内容的。在我们进行web开发的时候,抓包工具可以帮助我们更好的调试程序。
关于抓包工具的下载安装使用可以参考我的另一篇博客 Fiddler抓包工具的下载安装使用

3. HTTP报文格式

根据我们抓包的结果可以清晰的查看我们HTTP请求/响应的格式;

HTTP请求格式如下:
在这里插入图片描述
解释说明:HTTP请求格式如下

  1. 首行: [方法] + [url] + [版本]
  2. Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
  3. Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度
  4. 根据图片可以看到方法为Get,所以以上是一个get请求。

HTTP响应格式如下:
在这里插入图片描述
解决说明:

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

3.1 HTTP请求方法

  1. GET: 请求指定的页面信息,并返回实体主体。
  2. HEAD :类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。
  3. POST :向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
  4. PUT:HTTP1.1 从客户端向服务器传送的数据取代指定的文档的内容
  5. DELETE: HTTP1.1 请求服务器删除指定的页面。
  6. CONNECT: HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
  7. OPTIONS:HTTP1.1 允许客户端查看服务器的性能。
  8. TRACE:HTTP1.1 回显服务器收到的请求,主要用于测试或诊断。
  9. PATCH:HTTP1.1 是对 PUT 方法的补充,用来对已知资源进行局部更新 。

HTTP方法中最常用的就算Get方法和Post方法,对于Get请求与Post请求,我们在后面详细讲述。

3.2 HTTP请求报头

header 的整体的格式也是 “键值对” 结构,每个键值对占一行,键和值之间使用分号分割
报头的种类很多,以下介绍几个常见的:

  1. Host :表示服务器主机的地址和端口
  2. Content-Length:表示 body 中的数据长度
  3. Content-Type:表示请求的 body 中的数据格式, 常见的格式有:
    1. application/x-www-form-urlencoded: form 表单提交的数据格式。
    2. multipart/form-data: form 表单提交的数据格式(在 form 标签中加上enctyped=“multipart/form-data” . 通常用于提交图片/文件。
    3. application/json: 数据为 json 格式。
  4. User-Agent (简称 UA):表示浏览器/操作系统的属性。
  5. Referer:表示这个页面是从哪个页面跳转过来的。如果直接在浏览器中输入URL或者通过收藏夹访问页面时是没有 Referer 的。
  6. Cookie:Cookie 中存储了一个字符串, 这个数据可能是客户端(网页)自行通过 JS 写入的, 也可能来自于服务器(服务器在 HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据)。往往可以通过这个字段实现 “身份标识” 的功能。每个不同的域名下都可以有不同的 Cookie,不同网站之间的 Cookie 并不冲突

3.3 HTTP请求正文

正文中的内容格式和 header 中的 Content-Type 密切相关
我们可以通过抓包查看请求正文,如图所示:在post请求中空行后面的就是body的正文,以下抓包的是csdn写博客的请求,正文内容就是json格式的内容数据。

在这里插入图片描述

3.4 HTTP响应的状态码

状态码表示访问一个页面的结果, 是访问成功,还是失败, 还是其他的一些情况…)。

以下为常见的状态码:

  • 200 OK:表示访问成功
  • 404 Not Found:没有找到资源
  • 403 Forbidden:表示访问被拒绝,有的页面通常需要用户具有一定的权限才能访问(登陆后才能访问),如果用户没有登陆直接访问,就容易见到 403
  • 405 Method Not Allowed:前面我们已经学习了 HTTP 中所支持的方法GET, POST, PUT, DELETE 等,但是对方的服务器不一定都支持所有的方法(或者不允许用户使用一些其他的方法)。
  • 500 Internal Server Error:服务器出现内部错误。一般是服务器的代码执行过程中遇到了一些特殊情况(服务器异常崩溃)会产生这个状态码。
  • 504 Gateway Timeout:当服务器负载比较大的时候,服务器处理单条请求的时候消耗的时间就会很长,就可能会导致出现超时的情况
  • 302 Move temporarily:临时重定向,比如我们访问一个网站,他不存在了但是设置了临时重定向,当我们访问时就会帮我们自动跳转到临时的页面。比如我们登录之后自动跳转到主页。响应报文的 header 部分会包含一个 Location 字段,表示要跳转到哪个页面。
  • 301 Moved Permanently:永久重定向,当浏览器收到这种响应时, 后续的请求都会被自动改成新的地址。301 也是通过 Location 字段来表示要重定向到的新地址

3.4 HTTP响应的报头

响应报头的基本格式和请求报头的格式基本一致
类似于 Content-Type,Content-Length 等属性的含义也和请求中的含义一致。响应中的 Content-Type 常见取值有以下几种

  • text/html : body 数据格式是 HTML
  • text/css : body 数据格式是 CSS
  • application/javascript : body 数据格式是 JavaScript
  • application/json : body 数据格式是 JSON

3.5 HTTP响应的正文

HTTP响应的正文的具体格式取决于 Content-Type。

3.6 HTTP请求的URL

URL 唯一资源定位符,标识互联网上的唯一资源的位置。上图我们抓包的的Get请求中首行,除了方法名就是URL(俗称网址)和HTTP的版本号。

对于一个具体的URL,其组成如下:

https://v.bitedu.vip/personInf/student?userId=10000&classId=100

  1. https : 协议方案名。常见的有 http 和 https,也有其他的类型。(例如访问 mysql 时用的jdbc:mysql )
  2. user:pass : 登陆信息。现在的网站进行身份认证一般不再通过 URL 进行, 一般都会省略
  3. v.bitedu.vip : 服务器地址。此处是一个 “域名”,域名会通过 DNS 系统解析成一个具体的 IP 地址。(通过 ping 命令可以看到,v.bitedu.vip 的真实 IP 地址为 118.24.113.28 )
  4. 端口号: 上面的 URL 中端口号被省略了。当端口号省略的时候, 浏览器会根据协议类型自动决定使用哪个端口。例如 http 协议默认使用 80 端口。https 协议默认使用 443 端口
  5. /personInf/student : 带层次的文件路径.
  6. userId=10000&classId=100 : 查询字符串(query string),本质是一个键值对结构,键值对之间使用 & 分隔,键和值之间使用 = 分隔。
  7. 片段标识: 此 URL 中省略了片段标识. 片段标识主要用于页面内跳转。

== 根据URL格式我们会发现,在其中已经表明了访问的服务器是谁,都是在我们请求报文中仍有Host表示地址,此处原因是,当我们开代理进行访问时就不是直接访问服务器了,我们Host访问的往往是最终目标,而我们URL中可能是当前目标,所以Host与URL中的地址也会出现不同的情况。==

4. POST请求与GET请求

  1. 对于GET请求与POST请求来说,本质是没有区别的,都是对HTTP请求的使用,但是我们在使用上形成了一些区别。
  2. 我们POST请求往往用来向服务器发送数据,数据在body中显示(数据是程序员自定义的),所以一般没有query string。GET请求也可以向服务器传送数据,一般通过URL中的query string,比如我们GET请求,请求某一用户名的信息,就可以通过查询字符串,点名用户。
  3. 语义上:我们POST请求往往向服务器发送数据,而GET请求向服务器获取数据。
  4. 幂等:GET请求往往设置成幂等(相同的输入得到的结果相同),POST请求不是。
  5. 根据幂等我们可以得知,GET请求可以被缓存,POST请求一般不能被缓存。
  6. POST请求不会将数据暴露出,GET请求通过query string携带数据,其他用户可以查看得到。
  7. GET请求一般没有body,POST有body所以在header中有content-length表示body长度,content-type表示body类型。

5. HTTP协议实例——登录过程

登录过程:下图是我们登录某网站的过程
在这里插入图片描述

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

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

相关文章

结构型模式 - 装饰者模式

概述 我们先来看一个快餐店的例子。 快餐店有炒面、炒饭这些快餐,可以额外附加鸡蛋、火腿、培根这些配菜,当然加配菜需要额外加钱,每个配菜的价钱通常不太一样,那么计算总价就会显得比较麻烦。 使用继承的方式存在的问题&#x…

5G工业路由器实现AGV远程控制,智联物联无线物联网方案

随着AGV在制造业应用逐渐广泛,在生产车间传统的布线网络下,存在着接口不足、网络不稳定、数据丢失、故障异常的情况,技术人员无法及时观察AGV的数据情况,导致AGV出错率高,维护成本高等问题。 传统的AGV通信方式一般是…

【Python基础函数笔记】获取当前时间并写入日志

1.获取当前时间 import os from datetime import datetime import pytzdef get_cur_time():# 获取当前时间return datetime.strftime(datetime.now(pytz.timezone(Asia/Singapore)), %Y-%m-%d_%H-%M-%S)# 基础目录 basedir a logdir os.path.join(basedir, logs, str(args.n…

S3C2440的串口通信(UART)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、UART二、2440的uart资源2.1.uart配置流程2.2 RS2322.3 RS232接口 三. UART编程实现(无缓存)四. UART编程实现(中断&…

Python多线程 threading 和多进程 multiprocessing

1. 并发 vs 并行 线程是程序执行的最小单位,一个进程可以由一个或多个线程组成,各个线程之间也是交叉执行。 并发,相当于单核CPU,宏观同时执行,微观高速切换 交替执行。多线程、高并发这些词语更多地出现在服务端程序…

机器学习(十七):实操_在Sklearn中的实现CART树的基本流程

全文共8000余字,预计阅读时间约16~27分钟 | 满满干货(附代码),建议收藏! 代码下载点这里 一、介绍 CART(Classification and Regression Trees)即分类回归树,是一种重要的机器学习算法,既可以…

3.8 Bootstrap 面包屑导航(Breadcrumbs)

文章目录 Bootstrap 面包屑导航(Breadcrumbs) Bootstrap 面包屑导航(Breadcrumbs) 面包屑导航(Breadcrumbs)是一种基于网站层次信息的显示方式。以博客为例,面包屑导航可以显示发布日期、类别或…

解决win10系统中ping localhost被解析为 ::1的问题

目录 问题描述 问题分析 解决方案 一、修改host文件 二、修改注册表 三、修改IPv6的优先级 问题描述 本机为win10系统,在命令行窗口ping localhost时,本机IP127.0.0.1被解析为了 ::1的问题 1、在命令行窗口 ping 127.0.0.1 2、在命令行窗口 ping…

Linux常用命令——ed命令

在线Linux命令查询工具 ed 单行纯文本编辑器 补充说明 ed命令是单行纯文本编辑器,它有命令模式(command mode)和输入模式(input mode)两种工作模式。ed命令支持多个内置命令,常见内置命令如下&#xff…

leetcode 59.螺旋矩阵

记录一下&#xff0c;觉得倒水思想来做 总体看起来还是比较清晰的。 class Solution { public:vector<vector<int>> generateMatrix(int n) {int a[4][2] {{0,1}, {1,0}, {0,-1},{-1,0}};int direction0; //方向int num0;int S n*n;int x 0;int y 0;vector<…

解析基因影响:孟德尔随机化的创新思维

一、引言 在当今的遗传学和生物学研究中&#xff0c;我们对基因对个体特征和性状的影响的理解变得更加深入。然而&#xff0c;基因影响的复杂性和多样性给我们带来了巨大的挑战。为了更好地揭示基因影响的本质和机制&#xff0c;我们需要采用创新的研究思维和方法。 本文的目的…

听GPT 讲K8s源代码--pkg(四)

/pkg/controlplane、/pkg/credentialprovider、/pkg/kubeapiserver是Kubernetes中的三个核心包&#xff0c;它们分别实现了不同的功能。 /pkg/controlplane包 /pkg/controlplane是Kubernetes的一个包&#xff0c;它包含了控制平面组件的实现&#xff0c;例如API Server、Contro…

妙记多 Mojidoc 模版投稿活动招募

妙记多 Mojidoc 开始征集模板啦! 快来投稿吧&#xff01;&#x1f389;&#x1f389;&#x1f389; 优秀模板将被选录进官方模板中心&#xff0c;让你的灵感和创意被更多人看见&#xff01;选录后&#xff0c;你可直接解锁「高级体验官」称号&#xff0c;并有机会获得妙记多 M…

IDELAYG/ODELAY/IDELAYCTRL

如下是7系列FPGA HP Bank I/O 资源&#xff1a; 其中ILOGIC是由许多的数据选择器和一个IDDR触发器构成。 在HP BANK中&#xff0c;ILOGIC被称为ILOGICE2&#xff0c;在HR BANK中&#xff0c;ILOGIC被称为ILOGICE3 IDELAY 简单介绍 输入信号延迟模块。每个I/O模块都包含了一…

内存分区,编译链接,ARCMRC,消息传递消息转发,对象的底层

文章目录 前言内存分区栈区堆区全局区文字常量区程序代码区运行之前运行之后 编译&#xff0c;链接编译的过程链接 ARC&#xff0c;MRC在编译期干了什么 对象的底层消息传递&#xff0c;消息转发消息转发消息传递IMP指针IMP与SEL的区别与联系 前言 对第一周学习内容做个概括 提…

no module named paddle pip install paddlepaddle报错

!python -m pip install paddlepaddle2.4.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

Python实战项目——餐厅订单数据分析(一)

项目背景 餐厅经营的好坏需要用数据来说明&#xff0c;如果一个餐厅生意惨淡&#xff0c;那么应该先收集最近的数据&#xff0c;然后进行数据分析&#xff0c;再对应相应出现的问题进行解决和做出对应的商业调整。今天开始我们分析一来家餐厅的数据。 认识数据并预处理 拿到…

GUI-Menu菜单实例

运行代码&#xff1a; //GUI-Menu菜单实例 #include"std_lib_facilities.h" #include"GUI/Simple_window.h" #include"GUI/GUI.h" #include"GUI/Graph.h" #include"GUI/Point.h"struct Lines_window :Window {Lines_window…

Appium+python自动化(十二)- Android UIAutomator终极定位凶器(超详解)

简介 乍眼一看&#xff0c;小伙伴们觉得这部分其实在异性兄弟那里就做过介绍和分享了&#xff0c;其实不然&#xff0c;上次介绍和分享的大哥是uiautomatorviewer&#xff0c;是一款定位工具。今天介绍的是一个java库&#xff0c;提供执行自动化测试的各种API。 Android团队在4…

小程序控制台警告:DevTools failed to load SourceMap(控制台报错DevTools 无法加载来源映射)

在调试项目的时候&#xff0c;控制台报错:**DevTools failed to load SourceMap: Could not load content for http://xxx.js. 这段报错的意思是dev工具未能成功加载source map&#xff08;文件映射&#xff09;。这里的报错实际上和项目本身的代码没有任何关系&#xff0c;而是…