【HTTP】HTTP协议 && HTTPS 协议

目录

一、HTTP

1、HTTP是什么?

2、HTTP的工作过程

3、 抓包工具Fiddler的使用

4、HTTP的协议格式(重点)

5、HTTP请求

5.1 请求地址URL

5.2 方法method

5.3 认识   请求报头

6、HTTP响应

6.1 状态码

6.2 响应报头

二、HTTPS

1、HTTPS是什么?

2、HTTPS的执行过程(重点)


一、HTTP

1、HTTP是什么?

        HTTP(超文本传输协议)是一种应用非常广泛的应用层协议。HTTPs 是在 HTTP基础之上做了一个加密解密的工作。

        平时我们打开一个网站,就是通过HTTP协议来传输数据的。(所谓 "超文本" 的含义, 就是传输的内容不仅仅是文本(比如 html, css 这个就是文本), 还可以是一些其他的资源, 比如图片, 视频, 音频等二进制的数据)

        一个完整应用是由前端+后端构成的,而前后端之间的通讯是要依靠HTTP来完成的。类似于消费者在网上买东西,商家和买家之间,需要一个快递公司,HTTP就相当于这个快递公司,其中的请求方法GET/POST相当于不同类型的快递类型(比如:标准快递,加急快递)。

        HTTP往往是基于传输层的TCP协议实现的,目前我们主要使用的是HTTP1.1和HTTP2.0。

2、HTTP的工作过程

【HTTP】HTTP协议 && HTTPS 协议_第1张图片

3、 抓包工具Fiddler的使用

        HTTP 是一个文本格式的协议,可以通过 Chrome 开发者工具或者 Fiddler 抓包,分析 HTTP 请求/响应的细节。

        Fiddler相当于一个“代理”:当浏览器访问sogou.com时,就会将HTTP的请求先发送给Fiddler,Fiddler再将请求转发给sogou的服务器,当sogou服务器返回数据的时候,Fiddler拿到返回数据,再将数据交给浏览器。因此,Fiddler对于浏览器和sogou服务器之间交互的数据细节,是非常清楚的。

【HTTP】HTTP协议 && HTTPS 协议_第2张图片

 Fiddler的页面:需要知道

【HTTP】HTTP协议 && HTTPS 协议_第3张图片

4、HTTP的协议格式(重点)

【HTTP】HTTP协议 && HTTPS 协议_第4张图片

1、HTTP协议格式总结

(1)Request对象

  • 请求行【方法  地址  HTTP版本号】
  • 请求报文【很多项,是Key:value的形式】
  • 空行
  • 请求正文【程序员传递的参数】

(2)Respond对象

  • 响应行【HTTP版本号  状态码  状态码描述】
  • 响应报头【很多项,是Key:value的形式】
  • 空行
  • 响应正文【程序员返回给前端的数据】

问题:为什么要有空行存在?

        因为HTTP协议并没有规定报头部分的键值对有多少个,可能正文里也是Key:value的形式存在的,因此通过空行来区分两者,相当于空行是“报头的结束标记”。HTTP在传输层依赖TCP协议,TCP是面向字节流的,如果没有这个空行,就会出现“粘包问题”。


2、使用Fiddler抓包观察上述HTTP协议的格式

        注意观察,与上述图中的格式是一一对应的。

(1)Request

【HTTP】HTTP协议 && HTTPS 协议_第5张图片

(2)Respond 【HTTP】HTTP协议 && HTTPS 协议_第6张图片

5、HTTP请求

5.1 请求地址URL

【HTTP】HTTP协议 && HTTPS 协议_第7张图片

 1、举例:一个具体的 URL
可以看到, 在这个 URL 中有些信息被省略了。
(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 中省略了片段标识。片段标识主要用于页面内不同元素之间的跳转。 

【HTTP】HTTP协议 && HTTPS 协议_第8张图片


2、URL encode

        像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现。比如,某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义。一个中文字符由 UTF-8 或者 GBK 这样的编码方式构成,虽然在 URL 中没有特殊含义, 但是仍然需要进行转义, 否则浏览器可能把 UTF-8/GBK 编码中的某个字节当做 URL 中的特殊符号。

        转义的规则如下: 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。

  

解码的时候:urldecode。urldecode就是urlencode的逆过程。

比如:

【HTTP】HTTP协议 && HTTPS 协议_第9张图片

5.2 方法method

【HTTP】HTTP协议 && HTTPS 协议_第10张图片


面试题:Get与Post方法的区别?

(1)数据传输方式

        Get请求是通过URL传递的,即将数据拼接到URL的后面,以?分隔,参数之间以&分隔。因此,get请求对于传输的数据大小是有限制的,通常在几千个字符以内;Post请求是将数据放在HTTP请求的请求体(正文)中传输,因此没有大小限制,可以传输较大的数据量。

(2)数据传输安全性

        GET传参放在URL里面,请求传输的数据是明文的,因此数据容易被拦截和篡改;而Post请求传输的数据放在请求体中,只有在抓包的时候才能获取信息,因此相对安全一些。

(3)缓存

Get请求是可以被缓存的,当浏览器再次请求同一个URL时,可以从缓存中直接获取数据,加快访问速度;而Post请求是不可以被缓存的,因为每次提交数据都有可能导致服务器状态的改变。

(4)历史记录的安全性问题

        Get请求的数据会被浏览器保存在历史记录和服务器日志中,容易被恶意程序利用;Post请求不会被保存在历史记录和服务器日志中,相对更加安全。

5.3 认识   请求报头

报头的种类有很多,我们主要认识下面几种常见的。

(1)Host:表示服务器主机的地址和端口。

(2)Content-Length:表示请求体body中的数据长度。

(3)Content-Type:表示请求的 body 中的数据格式。(重要)

常见的:

  • application/x-www-form-urlencoded: form 表单提交的数据格式;
  • multipart/form-data: form 表单提交的数据格式(在 form 标签中加上enctyped="multipart/form-data" . 通常用于提交图片/文件;
  • application/json: 数据为 json 格式。            

(4)User-Agent (简称 UA):表示浏览器/操作系统的属性。
(5)Referer:表示这个页面是从哪个页面跳转过来的。
(6)Cookie(重要)

解决的问题:

        HTTP是基于TCP交互的,在交互的时候存在一个问题,就是HTTP本身是一个无状态的。比如说,现在登录学生系统,然后访问里面的A页面,当要再去访问B页面的时候,由于没有记录当前的登录状态,因此又要再登录一次,所以只要你去访问新的页面,就要不断的进行登录,非常麻烦。因此在登录一次之后,就要将这个登录状态记录下来,但是HTTP不支持。因此通过Cookie加Session解决HTTP无状态的情况。

        Cookie:Cookie中存储了一个字符串,这个数据可能是客户端(网页)通过js写入的,也可能来源于服务器(服务器在HTTP响应的header中通过set-Cookie字段给浏览器返回数据),可以通过这个字段实现“身份标识”的功能。

例子:

        输入csdn网站,此时默认是登录状态。是因为cookie中存储了这个登录的用户标识信息。

 现在F12,我们将cookie中的信息手动清除掉。在“应用”下的cookie。

【HTTP】HTTP协议 && HTTPS 协议_第11张图片

 此时再打开csdn网页,发现登录状态已经失效。

【HTTP】HTTP协议 && HTTPS 协议_第12张图片 cookie的过程

        当服务器给客户端写了一个cookie标识之后,服务器告诉浏览器将cookie标识存起来,并且每一次再去访问这个域名的时候,浏览器会将该域名(csdn)下的所有的cookie全部放在请求头里传给服务器,此时服务器就从请求头里面获取cookie信息,获取到cookie信息之后就知道是否登录了。

【HTTP】HTTP协议 && HTTPS 协议_第13张图片

        session默认在服务器的内存中,根据sessionid,在服务器中的session映射表中查找是否存在。

6、HTTP响应

6.1 状态码

【HTTP】HTTP协议 && HTTPS 协议_第14张图片 1、理解重定向:

        比如去十字街吃饭,但是发现店面搬迁,告诉你搬迁到哪里了,你就按照新地址走就行。也就是你去原来的地方,但是发现原来的地方没有人了,但是它告诉你往哪里走,这就是重定向。

        或者相当于手机号码中的 "呼叫转移" 功能。
比如我本来的手机号是 186-1234-5678, 后来换了个新号码 135-1234-5678, 那么不需要让我的朋友知道新号码,只要我去办理一个呼叫转移业务, 其他人拨打 186-1234-5678 , 就会自动转移到 135-1234-5678上。

2、知道常见的状态码

(1)200:表示访问成功;

(2)404:未知的错误:客户端将网址输错了;

(3)403:没有权限访问;

(4)500:服务器内部出错;

(5)504:网关出问题了。当服务器负载比较大的时候, 服务器处理单条请求的时候消耗的时间就会很长, 就可能会导致出现超时的情况。这种情况在双十一等 "秒杀" 场景中容易出现, 平时不太容易见到。

(6)302与301的区别

302是临时重定向:在登陆页面中经常会见到 302,用于实现登陆成功后自动跳转到主页。
301是永久重定向:当浏览器收到这种响应之后,后续的请求都会被改成新的地址;

301对于搜索引擎来说,权重比较高。

比如:去吃饭,301就相当于是临时搬迁,只是说着一段时间搬迁到新地址了,那么用户在去的时候要考虑是去新地址还是已经搬回来了,在原来的地址;而302是永久搬迁,以后去的都是新地址。

6.2 响应报头

响应报头的基本格式和请求报头的格式基本一致。
类似于 Content-Type , Content-Length 等属性的含义也和请求中的含义一致。

【HTTP】HTTP协议 && HTTPS 协议_第15张图片


二、HTTPS

1、HTTPS是什么?

        HTTPS(Hyper Text Transfer Protocol Secure) 也是一个应用层协议, 是在 HTTP 协议的基础上引入了一个加密层HTTP的默认端口号为80;HTTPS的默认端口号为443。

        HTTPS = HTTP+加密+认证+完整性保护

原因:

        HTTP 协议内容都是按照文本的方式明文传输的,这就导致在传输过程中出现一些被篡改的情况。这就是“运营商劫持”问题。

举例:

(1)下载一个天天动听,正常情况应该是:点击下载按钮,弹出其下载链接。

【HTTP】HTTP协议 && HTTPS 协议_第16张图片

(2)被劫持的情况:点击下载按钮,弹出其他app(比如:qq浏览器的下载链接)。

【HTTP】HTTP协议 && HTTPS 协议_第17张图片 上述现象分析:

        由于我们通过网络传输的任何数据包都会经过运营商的网络设备(路由器,交换机等),那么运营商的网络设备就可以解析出你传输的数据内容并进行篡改。在点击“下载按钮”之后,其实是给服务器发送了一个HTTP请求,获取到的HTTP响应就包含了该app的下载链接,当运营商劫持之后,发现这个链接是要下载“天天动听”,就自动的把交给用户的响应篡改为“qq浏览器”的下载地址。

【HTTP】HTTP协议 && HTTPS 协议_第18张图片

2、HTTPS的执行过程(重点)

需要知道几个基本概念:常见的加密形式

【HTTP】HTTP协议 && HTTPS 协议_第19张图片


HTTPS 执行流程如下:

(1)客户端使用HTTPS来访问服务器端;

(2)服务器端返回数字证书,以及使用非对称加密的公钥给客户端,私钥服务器端自己保留;

(3)客户端验证传过来的数字证书是否有效:如果是无效证书,则说明不是服务器端,直接终止访问;如果是有效的,则进行以下几个步骤:

  • 客户端使用对称加密来生成一个共享秘钥;
  • 使用对称加密的共享秘钥来加密一些初始数据;
  • 使用非对称加密的公钥来加密(对称加密生成的)共享秘钥;
  • 发送加密后的秘钥和数据给服务器端。

(4)服务器端可以使用私钥来解密出客户端(使用对称秘钥生成的)共享秘钥,再使用共享秘钥解密出数据的具体内容;

(5)之后客户端与服务器端就可以使用共享秘钥加密的内容进行交互了。


【HTTP】HTTP协议 && HTTPS 协议_第20张图片

你可能感兴趣的:(JavaEE初阶,http,网络协议,网络)