HTTP/HTTPS协议

什么是HTTP协议

HTTP被称为超文本传输协议(里面不仅仅可以是字符串,还可以是图片,特殊字符等),这是一种应用非常广泛的应用层协议. HTTP协议诞生于1991年,现在是最主流使用的一种应用层协议.它从诞生到现在为止迭代了多个版本.

但目前最主流使用的还是HTTP1.1和HTTP2.0. HTTP协议是基于传输层的TCP协议来实现的(1.0, 1.1, 2.0都是基于TCP实现的, 而3.0则是基于UDP来实现的).

想我们平常打开一个网站,就是来通过HTTP协议来传输数据的. 像我们在游览器中输入百度的网址,游览器就会给百度的服务器发送有一个HTTP请求,百度服务器就会返回一个HTTP响应. 这个响应被解析后就会变成我们看到的网页内容.(这个过程中可能有多次HTTP请求)(HTTP协议的交互过程,就是经典的一问一答)

HTTP格式

了解HTTP格式,我们可以使用一个抓包工具,抓包工具本质上就是一个代理程序,可以获取到网络上传输的数据,显示出来,从而给程序猿一些参考.这里我们使用fiddler.打开fiddler,我们可以抓包到很多数据包,因为电脑上有很多程序在默默做很多事情. 

这里我们打开一个网站,其实浏览器和服务器之间HTTP交互不止一次,也是有很多次.第一次交互拿到的是这个页面的html,html需要依赖css和js,图片的等.等html被游览器加载后,又会触发到一些其他的http请求,获取到css,js等.......

这里我们搜索搜狗的网页.观察fiddler窗口.蓝色的表示返回的就是一个html. 

上面的窗口就是请求的明细,下面的窗口就是响应的明细.

点击raw就可以查看到http请求的原始数据:

http响应的原始数据:

这样显示是因为这个响应数据被压缩了.

HTTP请求格式

这里HTTP请求包含4部分:

1.首行

这里也由三个部分组成,由空格来分割.

2. 请求头(header)

从第二行开始到后面都是请求头,这里类似于TCP报头中的重要的属性一样. 是由文本方式来组成的.报头中包含了很多的键值对,每个键值对都占一行,键和值之间用:分割.这里的减值有什么含义都是HTTP协议来规定的.

3. 空行

请求头后面会有一个空行,这个表示结束标志.

4. 正文(body)

这是http的载荷部分,有的http有载荷,有的没有.

HTTP响应格式

1. 首行

2. 响应头

这里也是用减值对来表示的.每个键值对为一行.

3. 空行

4. 正文(body)

这里响应的载荷是html

HTTP请求

认识URL

url是一个很重要的概念. 它是描述一个网络上的资源位置.像搜狗的: https://www.sogou.com/ 就是一个最简单的url.

上述就是有一个完整的url.这里通过ip地址知道服务器在哪里,通过端口号知道程序是哪个,通过路径知道是访问哪个资源.

https: 协议名称.这个可以是有其他类型的

user.pass: 登入信息. 这个现在已经不会使用了,一般都被省略

服务器地址: 这里是域名,也可以是ip地址.

端口号: 端口号表示你要访问服务器哪个端口.如果没有,游览器会自动给一个默认的端口号.这里的端口用啥为默认值,取决于协议.

文件路径: 这里可能是一个真实的硬件文件也可能是一个虚拟文件.

查询字符串: 针对请求的内容进行补充. 它是客户端给服务器传递信息的重要途径.它是键值对结构,用&分割键值对,用 = 来分割键和值,这里的键值对内容都是程序员自定义的.

片段标识符: 主要用于页面内的跳转.

关于URL encode

像一些特殊字符 / ? 等被url当做特殊意义来理解,这些字符在url中就不能随意出现. 如果需要使用某个特殊字符,就需要先对特殊字符进行转义.且中文字符在url中也需要转义,因为中文字符是由utf-8或者GBK的编码方式构成的,它们其中的某个字节可能也会被当做特殊字符.

转义规则就是: 将需要编码的字符转为16进制,从右往左,取4位,每两位为一位,前面加上%,编码成%xy的格式.

认识方法

这里最常用的就是GET和POST方法. GET就是从服务器中拿一个东西过来(读操作),POST就是往服务器中放一个东西过去(写方式). 这些语义虽然是官方文档中的注释,但是在实际开发中,开发者可能不会按这一套来.可能POST可以是读操作,GET是写操作.

一般我们从游览器中输入url,这时游览器就会发送一个GET请求.我们可以通过fiddler来观察.这里我们以https://www.sogou.com为例:

这里我们就可以看到方法是GET.而GET请求有一些特点:

1.url的query string(用于补充信息) 可以为空,也可以不为空

2. header部分有多个键值对

3. body部分为空

而POST方法则多用于登录和上传的场景.这里以我登录一个QQ为例:

一般来说,GET通常是没有body,POST通常有body.GET习惯把需要的补充信息放到query string中(url中),而POST会把这些信息放到body中.

POST的特点:
1. psot在第一行

2. url的query string一般为空

3. header部分有多个键值对

4. body部分一般不为空.

POST和GET的区别(面试题)

这两者在本质上其实都没有区别.因为使用GET的场景可以使用POST.使用POST的场景也可以使用GET.这里区别于代码是怎么使用的. 

但是在使用习惯上是有区别的:

1. GET习惯于把数据放到url中的query string, POST习惯于把数据放到body中.

2. 在标准文档中的语义get是用来获取数据.post是用来给服务器传输数据的.

3. 关于幂等性. 标准文档中,建议GET请求实现为幂等的,POST则无要求.

4.GET请求是可以被收藏夹受藏的.但POST请求不可以.

认识报头(header)

Host

它表示服务器的地址和端口号. 

Content-Length与Content-Type

它,们表示body中的数据长度和body中的数据格式. 这两个键值对和body密切想相关,要是数据包没有body,他们就不会存在.

可以通过Content-Length来处理粘包问题. HTTP底层是基于TCP,也是连续传多个HTTP数据报,在接受方的接收缓冲区中也会积累多个包的数据.应用程序就可以通过这个Content-Length来明确包与包之间的边界.

而body可以传输很多种格式,程序猿都可以自己约定格式.Content-Type就是记录body的数据格式. 一般请求中的格式有:

application/json: body就是json格式

application/x-www-form-urlencoded: 通过html中的form标签构造出来的一种格式. 特点可以认为是把query string放到body里了.

multipart/form-data: 上传文件时使用的.

响应的格式有:

test/plain 纯文本

test/html html

test/css css

application/javascript js

.......

User - Agent(UA)

这里我们可以发现UA是有操作系统信息和游览器信息组成的. 在以前游览器和游览器之间有不能的效果,有的可以显示图片,有的不可以等等差异,服务器就可以通过UA信息来判定,你的设备老就不返回新特性,是新设备就返回新特性. 且它还有一个作用就是判定系统是PC系统还是移动端系统. 根据这个信息来返回不同的页面布局.

Referer

描述当前这个页面从哪里来.也就是它的父路径.

通过它就可以来知道哪些请求是通过谁的广告引流过来的.

Cookie

它的本质就是一个游览器这边本地持久存储数据的机制. 游览器作为电脑的程序可以直接读取本地文件.但是游览器上的网页是不能通过游览器提供的api来读写本地文件,因为游览器没有给网页提供这样的api. 但是游览器给网页提供了一个可以有限度的存储数据,但不能随意访问文件系统的api. 这里最经典的就是Cookie这样的存储机制.

请求中的Cooke字段就是把本地存储的Cookie信息发送到服务器那边.而响应中会有一个set-Cooke字段,就是服务器告诉游览器你要在本地保存哪些信息. 这就像去医院看病. 去到一个新的科室,就是客户端给服务器发送新的请求. 每次刷就诊卡,就是在使用Cooker中的信息,让服务器来对客户端有一个清晰的认识.而就诊卡就是客户端中的持久化存储数据的机制.

cooke的重要结论:

Cooke是服务器返回给浏览器的.通常都是首次访问后.

Cookie会存储到浏览器本地主机硬盘上,后序每次访问服务器都会带上Cooker.不同的客户端,保存的Cookie是不同的.即使使用同一个主机,使用不同的浏览器,Cooker大概率也不同.

Cookie中都是键值对格式的数据,都是程序猿自定义的.

Cookie在硬盘上保存,是按照不同的域名为维度来存储的.游览器访问百度,有一组cookie.访问搜狗,有一组cookie.

Cookie的用途是用来在客户端存储数据.最主要的就是存储用户的身份标识,服务器就可以通过标识来区分用户了.(其他的业务数据一般不会放到cookie中.cookie是可以随时删除的. 把业务数据放到服务器中,通过cookie中的身份标识来找到对应的数据; 且账号密码一般也不会放到cookie中, 游览器有另一个保存机制来保存密码)

状态码

状态码一般是用于响应当中的.表示响应的结果如何?HTTP中的状态码是标准约定好的.

这里我们介绍几个常用的状态码.

1. 200 OK: 表示成功访问

2. 404 Not Found: 表示访问的资源没有找到.

3. 405 Method Not Allowed: 表示服务器只支持GET请求,但是你发送的是POST.

4. 403 Forbidden: 请求的资源没有访问权限.

5. 500 Internal Server Error: 服务器内部错误,也就是服务器挂了

6. 504 Gateway Timeeout: 访问服务器超时,可能是服务器挂了,也可能是网挂了

7. 302 Move temporarily: 重定向(临时重定向). 类似与访问的是A,但是A告诉你,去找B,游览器就会去找B.

8. 301 永久重定向: 这里就是游览器会将重定向的结果记录下来,下次再去访问,就会直接访问重定向的目标地址.不必多跳转一次.

构造HTTP请求

通过PostMan

可以下载PostMan来直接来这个第三方库中生成HTTP请求.

 通过代码构造

public class HttpClient {private Socket socket;private String ip;private int port;public HttpClient(String ip, int port) throws IOException {this.ip = ip;this.port = port;socket = new Socket(ip, port);}public String get(String url) throws IOException {StringBuilder request = new StringBuilder();// 构造⾸⾏request.append("GET " + url + " HTTP/1.1\n");// 构造 headerrequest.append("Host: " + ip + ":" + port + "\n");// 构造 空⾏request.append("\n");// 发送数据OutputStream outputStream = socket.getOutputStream();outputStream.write(request.toString().getBytes());// 读取响应数据InputStream inputStream = socket.getInputStream();byte[] buffer = new byte[1024 * 1024];int n = inputStream.read(buffer);return new String(buffer, 0, n, "utf-8");}public String post(String url, String body) throws IOException {StringBuilder request = new StringBuilder();// 构造⾸⾏request.append("POST " + url + " HTTP/1.1\n");// 构造 headerrequest.append("Host: " + ip + ":" + port + "\n");request.append("Content-Length: " + body.getBytes().length + "\n");request.append("Content-Type: text/plain\n");// 构造 空⾏request.append("\n");// 构造 bodyrequest.append(body);// 发送数据OutputStream outputStream = socket.getOutputStream();outputStream.write(request.toString().getBytes());// 读取响应数据InputStream inputStream = socket.getInputStream();byte[] buffer = new byte[1024 * 1024];int n = inputStream.read(buffer);return new String(buffer, 0, n, "utf-8");}public static void main(String[] args) throws IOException {HttpClient httpClient = new HttpClient("42.192.83.143", 8080);String getResp = httpClient.get("/AjaxMockServer/info");System.out.println(getResp);String postResp = httpClient.post("/AjaxMockServer/info", "this is body"System.out.println(postResp);}
}

什么是HTTPS

HTTPS它就是HTTP的改进版,是在HTTP协议的基础上引入了一个加密层SSL.引入的原因就是运营商的劫持事件.如果是明文传输,它就可以在路由器中修改服务器返回的响应.而HTTPS就是通过加密来进一步的保证用户的信息安全.

HTTPS加密

这里的加密分为两种: 对称加密和非对称加密

对称加密:

它就是通过同一个密钥来把明文变成密文,也可以通过它把密文变成明文.

非对称加密:

它有两个密钥,公钥用来加密,私钥用来解密.

这时,服务端就可以在本地生成对称密钥,通过公钥(在第一次客户端请求,客户端就会叫服务器将公钥发送给它,这个就算给别人获取到了也并无大碍)来加密对称密钥,发送给服务器. 服务器就可以通过私钥来解密得到对称密钥.则接下来客户端和服务器的信息都可以通过对称密钥来加密和解密了.

中间人攻击

上面那种方法看似安全,其实还有很大的安全隐患,也是所谓的中间人攻击.服务器可以创建出一对公钥和私钥,黑客也可以用相同的方式来创建出一对公钥和私钥,冒充自己是服务器.

解决方法

这里的解决方式就是引入一个"证书". 客户端可以要求服务器提供一个证书.

这个证书是一个结构化的数据,里面包含了很多属性,最后用字符串的形式提供.

证书中会有一系列信息:

服务器的域名,公钥,证书有效期........

证书是搭建服务器的人从第三方的公证机构进行申请的.

这样客户端就不是需要拿非对称秘钥中的公钥了,也是要证书.

而对于证书中的公钥,黑客是不能进行修改的.因为客户端拿到证书后会进行检验真伪.证书里会有一个"签名",也就是校验和(这个校验和被公证机构那种自己的私钥进行了加密). 这个校验和就是使用一系列的算法把证书中的其他字段进行计算得到一个较短的字符串. 

而客户端拿到证书后会做两件事:

1. 按照同样的校验和算法,把证书的其他字段都重新计算一边,得到校验和1.

2. 使用系统中内置的公证机构的公钥,进行签名解密,得到校验和2.

要是这两个校验和相同,则就是证书没有被修改,要是不相同就是被修改了.

注意:

1)这里如果黑客直接修改公钥,不修改签名. 算出的校验和肯定不一样.

2)如果修改公钥也重新生成签名,由于黑客不知道公证机构的私钥,就无法重新加密签名.要是它拿自己的私钥加密,客户端那边的公证机构的公钥就会解密失败.

 到这里,安全系数就得到了极大的提高.

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

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

相关文章

Java数据结构---初识集合框架

目录 一、什么是集合框架 二、集合框架的重要性 三、背后涉及的数据结构及算法 1.什么是数据结构 2.容器背后对应的数据结构 3.相关的Java知识 4.什么是算法 一、什么是集合框架 Java 集合框架 Java Collection Framework ,又被称为容器 container &#xff0…

Unity编辑器内工程文件重命名|Project视图文件名修改

Unity编辑器内文件重命名 前言大项内容一使用方法代码展示 总结 前言 本文代码可以一键更改Project视图的文件名字 在当前文件名的状态下增加一段字符区分文件。 大项内容一 功能是因为在给其他人导入项目资源时有重复的资源的时候,资源会产生覆盖的问题。所以直…

家用办公主机需要多少钱?推荐主机选购攻略!!

1.头部部分 本文将长期保持更新,您可以保存并随时查看。 过去推荐的 主持人推荐 以下家庭办公主机均采用性能强劲的12/13代i5配置,可以完美应对日常办公、平面设计、编辑等使用场景。 主机价格在4K左右,自带显示器,并附有三到…

xss靶场实战(xss-labs-master靶场)

xss-labs-master靶场链接&#xff1a;https://pan.baidu.com/s/1X_uZLF3CWw2Cmt3UnZ1bTw?pwdgk9c 提取码&#xff1a;gk9c xss-labs level 1 修改 url 地址中的name<script>alert(1)</script>&#xff0c;便可以通关 level 2 在搜索框中输入的 JS 代码无法执行 …

用户体验设计师如何在 2024抢占先机?

01. 严峻的经济形势和就业市场 我们生活在一个通货膨胀的时代。就从超市抓几个苹果、卷心菜、鸡蛋&#xff0c;看看价格吧&#xff01;我不得不多次检查收据&#xff0c;因为我简直不敢相信。外出就餐费用上涨了 10-20%&#xff0c;现在 Spotify 和 YouTube 要求收取更高的订阅…

STM32通用定时器输入捕获

通用定时器输入捕获部分框图介绍 通用定时器输入捕获脉宽测量原理 要测量脉宽的高电平的时间&#xff1a;t2-t1&#xff08;脉宽下降沿时间点-脉宽上升沿时间点&#xff09; 假设&#xff1a;递增计数模式 ARR&#xff1a;自动重装载寄存器的值 CCRx1&#xff1a;t1时间点CCRx…

Google炸场,推出开“放”可商用的大语言模型Gemma!超级轻量,个人电脑即可运行

与OpenAI的封闭式大型模型不同&#xff0c;谷歌、Meta等科技巨头正致力于开发开源模型&#xff0c;以期实现技术上的快速追赶。 介绍 2月21日&#xff0c;谷歌发布了其最新一代的开源AI模型——Gemma&#xff08;https://ai.google.dev/gemma&#xff09;&#xff0c;这是一个…

2024.2.29 模拟实现 RabbitMQ —— 项目展示

目录 项目介绍 核心功能 核心技术 演示直接交换机 演示扇出交换机 演示主题交换机 项目介绍 此处我们模拟 RabbitMQ 实现了一个消息队列服务器 核心功能 提供了 虚拟主机、交换机、队列、绑定、消息 概念的管理九大核心 API 创建队列、销毁队列、创建交换机、销毁交换机、…

基于JSP的毕业设计选题系统的设计与实现

基于JSP的毕业设计选题系统的设计与实现 (源代码论文) A. 项目简介 毕业设计选题系统就是能够使学生通过互联网完成毕业设计课题的选定&#xff0c;它采用Web方式&#xff0c;同时适用于局域网和Internet&#xff0c;它要实现审核&#xff0c;权限管理&#xff0c;邮件通知…

Python中的atexit模块:优雅地处理程序退出

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站AI学习网站。 目录 前言 atexit模块概述 atexit模块的基本用法 示例代码&#xff1a;文件操作时的应用场景 典型应用场景 1 资源释放…

云里物里轻薄系列电子价签,如何革新零售?

云里物里的DS轻薄系列电子价签&#xff0c;凭借轻巧外观和强劲性能&#xff0c;为零售行业提供了更便捷的商品改价方案。这不仅是对纸质价标的替代&#xff0c;更以其安全性和可持续发展性&#xff0c;实现对零售行业的效率升级&#xff0c;让商家们轻松迎接数字化时代的挑战&a…

【Vue3】学习watch监视:深入了解Vue3响应式系统的核心功能(下)

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

OD(9)之Mermaid序列图(Sequence diagrams)使用详解

OD(8)之Mermaid序列图(Sequence diagrams)使用详解 Author: Once Day Date: 2024年2月21日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Mermiad使用指南_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and charti…

4.4 MySQL存储

目录 1、使用前提 2、使用连接数据库最初步骤 2.1 最初步骤 2.2 connect()方法中参数简单传递 3、创建数据库(创建架构)和创建表 3.1 创建数据库(创建架构) 3.2 创建表 3.2.1 基本创建 3.2.2 创建自增主键 4、Pycharm 可视化连接 MySQL 图形界面 5、插入、更新、查询…

【蓝桥杯】青蛙跳杯子(BFS)

一.题目描述 二.输入描述 输入为 2 行&#xff0c;2 个串&#xff0c;表示初始局面和目标局面。我们约定&#xff0c;输入的串的长度不超过 15。 三.输出描述 输出要求为一个整数&#xff0c;表示至少需要多少步的青蛙跳。 四.问题分析 注意&#xff1a;空杯子只有一个 …

3种SQL语句优化方法,测试人必知必会!

关于SQL语句的优化&#xff0c;本质上就是尽量降低SQL语句的执行时间&#xff0c;对于如何降低SQL语句的执行时间&#xff0c;可以从以下几个方面入手。 一、降低SQL语句执行时的资源消耗 这是我们在数据库性能调优中常用的方法&#xff0c;该方法以分析SQL语句的执行计划为切…

Python实用技巧:处理JSON文件写入换行问题

Python实用技巧&#xff1a;处理JSON文件写入换行问题 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的订阅…

linux中将普通用户添加sudo权限

1.登录root权限账号&#xff0c;编辑/etc/sudoers文件 2.找到"root ALL(ALL) ALL"&#xff0c;并在下面添加普通用户 格式&#xff1a;username ALL(ALL) ALL vim /etc/sudoers ## Next comes the main part: which users can run what software …

CMake和VsCode调试的使用

目录 CMake使用 CMake下载 创建系统文件目录 MakeList编写规范 VsCode启动调试 添加配置文件 添加断点&#xff0c;启动调试 CMake使用 CMake下载 输入指令 sudo apt install cmake 安装cmake&#xff0c;使用 cmake -version可查看cmake的版本信息 创建系统文件目…

土耳其商务团一行莅临优积科技考察交流

7月31日土耳其商务代表Emre Arif Parlak等一行三人莅临优积科技考察交流&#xff0c;公司CEO刘其东携团队成员热情接待并深入交流。 商务团首先参观了我司产品生产基地&#xff0c;详细了解了钢结构模块的生产加工工艺流程和质量控制体系。随后参观了我司模块化学校样板房、模块…