> 文档中心 > HTTP和HTTPS协议

HTTP和HTTPS协议

目录

HTTP协议是什么

HTTP协议格式

【1】抓包工具的使用

【2】抓包工具的原理

【3】HTTP协议的格式

HTTP请求

【1】URL

【2】请求行“Method”

(1)get方法

(2)post方法

(3)get和post的区别

(4)其他方法

【3】认识请求报头

Host

Content-Length

Content-Type

User-Argent

Referer

HTTP响应

【1】状态码

200 OK

302 Move temporarily

301 Moved Permanently

401 Unauthorized

403  Forbidden

404 Not  Found

405 Method Not Allowed

500 Internal Server Error

504 Gateway Timeout

【2】响应报头

【3】常用的客户端发送请求的方式

通过ajax构造http请求

HTTPS协议

对称加密和非对称加密

证书

HTTPS的工作流程

(1)握手阶段

(2)数据传输阶段


HTTP协议是什么

HTTP(超文本传输协议)是一种应用广泛的应用层协议。HTTP协议是基于传输层的TCP协议来实现的(HTTP1.0、HTTP1.1、NTTP2.0基于TCP协议来实现;HTTP3.0基于UDP协议来实现)。

HTTP协议格式

【1】抓包工具的使用

以fiddler为例:

  •  左侧窗口显示所有的请求,可以选中某个请求查看详情;
  • 右侧上方是请求的报文内容(切换到raw标签可以看到详细的数据格式);
  • 右侧下方是相应的报文内容(切换到raw标签可以看到详细的数据格式);

【2】抓包工具的原理

抓包工具默认提供了一个进程,打开抓包工具,默认系统设置就会打开代理服务器。

【3】HTTP协议的格式

 请求和响应的协议格式只有第一部分不相同。协议分为以下四部分:

  • 行信息(请求=>请求行,响应=>状态行);
  • 头信息;
  • 空行;
  • body(正文)。

HTTP报文中为什么要存在空行?

HTTP协议并没有规定报头部分的键值对有多少个,空行就相当于报头的结束标志,或者是报头和正文之间的分隔符。HTTP协议在传输层依赖于TCP协议,TCP是面向字节流的。如果没有这个空行,可能会出现粘包问题。

HTTP请求

【1】URL

URL(统一资源定位符):标识网络中的资源(网络中资源都是唯一的)(网页、css、js、视频、图片等)。

进行一次网络请求:

  • 从客户端的角度:客户端通过一个url访问到某个资源,浏览器返回一个网页给客户端,网页中包含的外部资源,浏览器会自动的发送后续的http请求;
  • 从服务端的角度:首先会访问本地硬盘上的文件资源,还会访问虚拟的资源,通过程序写代码提供。

URL格式:

  • http:协议方案名。常见的有http、https。
  • user:pass:登录信息。一般会省略。
  • 服务器地址: 此处是IP地址,也可以是域名,域名会通过DNS系统解析成一个具体的IP地址。
  • 端口号:端口号被省略时,浏览器会根据协议类型决定使用哪个端口。(http协议默认80端口,https协议默认443端口)
  • 带层次的文件路径。
  • 查询字符串(quary string):本质是一个键值对结构。键值对之间使用&分隔,键和值之间使用=分隔。
  • 片段标识符:只要用于页面内的跳转。

地址栏没有输入带层次的资源路径发送请求时,默认会带/。默认服务端是找该路径的目录中index.html文件。

 

URL encode:url中,包含中文、特殊字符、空格等,在发送请求时,会自动进行编码。同时对端在对url进行处理时,需要进行解码。

【2】请求行“Method”

http请求报文,请求行的第一个部分。服务端提供某个服务方法,请求端需要按照对应的方法来发送请求。

方法 说明 支持的http协议版本
get 获取资源 1.0、1.1
post 传输实体主体 1.0、1.1
put 传输文件 1.0、1.1
head 获取报文首部 1.0、1.1
delete 删除文件 1.0、1.1
trace 追踪路径 1.1
options 询问支持的方法 1.1
connect 要求用隧道协议连接代理 1.1
link 建立与资源之间的连接 1.0
unlink 断开连接 1.0

(1)get方法

GET是HTTP最常用的方法。用来获取服务器上的某个资源。在浏览器中输入一个URL,此时浏览器会默认发送GET请求。另外,HTML中的img,link,script等标签,也会触发个体请求。

使用fidder观察get请求

 get方法的特点:

  • 首行的第一部分为get
  • URL的quarystring可以为空,也可以不为空
  • header部分由若干个键值对
  • body部分为空

(2)post方法

常用于提交资源(数据)。可以通过HTML中from标签构造post请求。特点:

  • URL的quarystring一般为空(也可以不为空)
  • header部分由若干键值对结构
  • body部分一般不为空。body内的数据通过header中的Content-type指定。长度有header中的Content-Length指定。

(3)get和post的区别

  • get是获取资源,post是提交资源;
  • get方法的body一般为空,通过quarystring传输数据;post的quarystring一般为空,通过body传输数据;
  • 幂等性:get请求一般是幂等的,post请求一般不是幂等的。(如果多次请求的结果相同,则视为请求幂等)
  • gte可以被缓存,post不能被缓存。

(4)其他方法

  • put和post相似,只是具有幂等性,一般用于更新
  • delete删除服务器指定资源
  • options返回服务器支持的请求的方法
  • head类似于get,只不过不返回响应体,只返回响应头

【3】认识请求报头

Host

表示服务器主机的地址和端口

Content-Length

表示body中的数据长度。有body就必须有Content-length(body是可变长度,需要告诉对端,body以该长度来解析)

Content-Type

标识body中的数据格式。(告诉对端,body的数据格式,这样对端才能以相同的格式来解析=>网页需要渲染,图片、音频、视频等才能正常使用)

请求提交的资源:

  • 上传文件:图片、视频、音频
  • 上传数据:json、表单格式、form-data

相应返回的资源:除了表单格式和form-data

User-Argent

表示浏览器、操作系统的属性。

Referer

表示当前页面是从哪个页面跳转过来的。(如果直接在浏览器中输入url,或者直接通过收藏夹访问页面,是没有Referer的。

Cookie技术:客户端保存数据的一种技术。每个请求都会携带这个数据(通过请求头Cookie字段)。实现方式:

  1. 先进行保存(js、服务端返回响应头的Set-Cookie字段)
  2. 再使用(客户端请求Cookie头)

如何保存?

(1)使用js代码

(2)服务端返回的响应头Set-Cookie字段,它的值,就是让客户端保存在本地Cookie中

HTTP响应

【1】状态码

类别 原因
1XX Informational(信息性状态码) 接受的请求正在处理
2XX Success(成功状态码) 请求正常处理完毕
3XX Redirection(重定向状态码) 需要进行附加操作以完成请求
4XX Client Error(客户端错误状态码) 服务器无法处理请求
5XX Server Error(服务端错误状态码) 服务端处理请求出错)

200 OK

表示访问成功。

302 Move temporarily

临时重定向。登陆页面经常会看到302.用于实现登录成功后自动跳转到主页。响应报文的header部分会包含一个Location字段,表示要跳转到那个页面。

重定向:

相当于手机号码的呼叫转移功能。

301 Moved Permanently

永久重定向。当浏览器收到这种响应后,后续的响应都会被自动改成新的地址。

401 Unauthorized

没有登陆不允许访问。

403  Forbidden

一般是登录了,但是没有访问权限。

404 Not  Found

没有找到资源。url中对应的资源,服务端找不到。

405 Method Not Allowed

服务方法列表中不包含请求方法。

500 Internal Server Error

服务器内部出现错误。一般是服务器的代码在执行过程中抛出异常导致服务器崩溃。

504 Gateway Timeout

当服务器负载比较大时,无法那是处理请求,出现超时的情况。

【2】响应报头

响应报头和请求报头的格式基本一致。

响应报头Content-Type常见取值:

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

【3】常用的客户端发送请求的方式

通过ajax构造http请求

ajax:在不刷新网页的情况下,在js中以异步回调的方式发送http请求的技术。

  1. 用户体验更好(不刷新页面体验更好)
  2. 效率更高(只需要传输数据即可,而以刷新页面的方式实现动态网页,需要传输整个网页,数据传输量会更大)

ajax代码的使用:

  • 写在js中,页面加载就发送ajax请求=>页面初始化就获取数据,构建网页内容;
  • 写在用户交互的标签事件中,如
    标签中创建一个sendAjax()函数,在函数中写ajax代码。

ajax发送get请求

 // 1. 创建 XMLHttpRequest 对象 let httpRequest = new XMLHttpRequest(); // 2. 默认异步处理响应. 需要挂在处理响应的回调函数. httpRequest.onreadystatechange = function () {     // readState 表示当前的状态.      // 0: 请求未初始化     // 1: 服务器连接已建立     // 2: 请求已接收     // 3: 请求处理中     // 4: 请求已完成,且响应已就绪     if (httpRequest.readyState == 4) {  // status 属性获取 HTTP 响应状态码  console.log(httpRequest.status);  // responseText 属性获取 HTTP 响应 body  console.log(httpRequest.responseText);     } } // 3. 调用 open 方法设置要访问的 url httpRequest.open('GET', 'http://42.192.83.143:8080/AjaxMockServer/info'); // 4. 调用 send 方法发送 http 请求 httpRequest.send();    

ajax发送post请求(通过点击事件)

对于post请求,需要设置body内容:

  • 先使用setRequestHeader设置Content-Type;
  • 再通过send的参数设置body内容。
                Document             function search(){     // 1. 创建 XMLHttpRequest 对象     let httpRequest = new XMLHttpRequest();     // 2. 默认异步处理响应. 需要挂在处理响应的回调函数.     httpRequest.onreadystatechange = function () {     // readState 表示当前的状态.     // 0: 请求未初始化     // 1: 服务器连接已建立     // 2: 请求已接收     // 3: 请求处理中     // 4: 请求已完成,且响应已就绪  if (httpRequest.readyState == 4) {      // status 属性获取 HTTP 响应状态码      console.log(httpRequest.status);      // responseText 属性获取 HTTP 响应 body      console.log(httpRequest.responseText);  }     }     // 3. 调用 open 方法设置要访问的 url     httpRequest.open('POST', 'http://www.baidu.com');     // 4. 调用 setRequestHeader 设置请求头     httpRequest.setRequestHeader('Content-Type', 'application/x-www-formurlencoded');     // 5. 调用 send 方法发送 http 请求     httpRequest.send('name=zhangsan&age=18'); }    

HTTPS协议

HTTPS也是应用层的一个协议,是在HTTP协议的基础上引入了一个加密层(TSL/SSL协议)。

HTTp是明文传输数据,在网络数据传输流程中任意一个节点,都可能被获取并篡改。是不安全的。

  • 加密:将明文进行一系列的变换,生成密文;
  • 解密:将密文再进行一系列的变换,还原成明文。

在加密和解密的过程中,往往需要一个或者多个中间数据来辅助进行这个过程,这些数据称为密钥。

对称加密和非对称加密

  • 对称加密就是通过同一把密钥进行加密解密;
    但是服务器在同一时刻需要给很多客户端提供服务,每个客户端的密钥必须不同,因此服务器需要维护每个客户端和每个密钥之间的关联关系,需要耗费大量的资源。
  • 非对称加密算法:加密和解密使用两个不同的密钥。一个叫做“公钥”,一个叫做“私钥”。公钥和私钥是配对的。因此运算速度非常慢。

证书

在客户端和服务端刚建立连接的时候,服务端给客户端返回一个证书。证书包含公钥,也包含网站的身份信息。包含以下信息:

  • 证书发布机构
  • 证书有效期
  • 公钥
  • 证书所有者
  • 签名

客户端获取到证书后,会对证书进行校验。

HTTPS的工作流程

简单分为以下两步:

(1)握手阶段

基于非对称加密算法,生成密钥(作为第二步数据传输阶段使用的密钥)

握手阶段的详细流程:

  1. 客户端给出协议版本号、一个客户端生成的随机数(第一个随机数)以及客户端支持的加密方法;
  2. 服务端确认双方使用的加密方法。同时给出数字证书、一个服务端生成的随机数(第二个随机数);
  3. 客户端确认数字证书有效(通过CA证书来验证),然后生成一个新的随机数(第三个随机数),兵书用数字证书中的公钥加密这个数字,发送给服务端;
  4. 服务端使用自己的私钥,获取客户端发送的随机数;
  5. 服务端和客户端根据约定的加密方法,使用前面的三个随机数,生成“对话密钥”,用来加密接下来的整个对话过程。

(2)数据传输阶段

基于对称加密算法,使用第一步生成的同一把密钥来进行加密解密。