目录
一、HTTP协议
HTTP这个协议在传输层主要是基于TCP来实现的,应用层协议是给传输层的字节流赋予一定的含义。HTTP是超文本的传输协议,其实就是指的是“HTML”(超文本里面包含一些特殊的东西,图片,链接,音频,视频)HTTP最早就是为了下载HTML。
优势:扩展性好,方便传输自定义的数据
二、HTTP协议传输模型
一发一收,请求和响应式一一对应的(web开发中最常见的一种模型)。
可以借助一些工具来观察到HTTP的请求和响应。
1.Chrome
信息看不全,看不到请求和响应的完整格式
2.wireshark(抓包工具)
直接从网卡上拿到数据(以太网数据帧都能拿到),用起来比较麻烦
3.fiddler(抓包工具)
专门去抓HTTP协议的工具,和浏览器在同一个主机上
正向代理:站在服务器角度上观察,把客户端隐藏起来了
反向代理:站在客户端的角度观察,把真正的服务器给藏起来了
三、HTTP协议的详细格式
1.HTTP请求
(1)首行
分为三个部分
www.sogou.com:域名
GET https://www.sogou.com/HTTP/1.1
GET: HTTP method(方法)
请求的URL:https://www.sogou.com 地址后可加 :端口号
版本号:HTTP/1.1
(2)首部(请求头)header
一堆键值对,键值对和键值对之间使用换行来分割,键和值之间,使用冒号和空格来分割,header中具体有多少行是不固定的,具体是使用一个“空行”来作为结束标记。
(3)空行
表示header部分结束了
(4)正文body
请求可以有也可以没有正文
2.HTTP响应格式
(1)首行
HTTP/1.1 200 OK
协议版本号 状态码 状态码的描述
(2)协议头 header
也是一系列的键值对,键值对和键值对之间使用换行来分割,键和值之间,使用冒号和空格来分割,header中具体有多少行是不固定的,具体是使用一个“空行”来作为结束标记。
(3)空行
表示header部分结束了
(4)正文body
正文这里的内容可以有,也可以没有。
3.URL
资源唯一标识符(具体可以查看RFC系列文档)现在大多数形式都是从登录界面中去写用户名和密码(input),以表单/ajax的形式进行提交。
https://11.22.33/path?query=%E4%BD%A0%E5%A5%BD
(1) 格式
(1)协议名称:URL支持很多协议
(2)用户名密码:现在已经废弃了,不再使用
(3)服务器地址:可以是域名,也可以是IP地址。
(4)端口号:如果不写端口号,就会有一个默认值(浏览器自动加的)HTTP默认80,HTTPS默认443
(5)路径:表示服务器上面具体的哪个资源,/表示服务器的根路径
(6)查询字符串:浏览器给服务器传递的一些参数,程序员自定义的。
query string 作为起始标志,把内容中的特殊符号进行转义(按照16进制来表示,每个字节在前面放上一个%),汉字要编码。有些需要手动转义。
键值对和键值对之间&分割
键和值之间=分割
(7)片段标识:定位到网页具体位置
(2)URL如何区分资源
(1)先通过服务器地址,定位到一个具体的服务器
(2)再通过端口号,定位到一个具体的应用程序
(3)再通过路径,定位到这个应用程序管理的一个具体的资源
(4)再通过查询字符串,对这个具体的资源要求做进一步的解释
(5)最后通过片段标识,来确定定位到这个资源的哪个部分
4.请求中的“方法”
(1)方法
(2)触发HTTP GET请求的方式
1)直接在浏览器中输入URL,就会触发一个HTTP请求
2)HTML页面中的一些特殊标签,link(引入CSS),img(图片),script(引入JS)前面都是页面加载时触发,a(超链接)用户点击时触发HTTP GET请求。
3)from表单
4)ajax
5)使用java代码/其他库
6)通过linux下的wget/curl
7)通过第三方工具,postman这类工具
(3)触发HTTP POST请求的方式
1)from表单
2)ajax
3)第三方工具
POST请求的特点:
首行第一部分为POST
URL的query string一般为空,但也完全可以加上query string
header部分有若干个键值对
body一般不为空,其中的数据格式支持很多格式;格式的类型由请求头中的Content-Type字段来表示;body的长度由请求头中的Content-length字段来表示。(单位是字节)
(4)GET和POST区别
实际上无本质差别
1)数据位置:GET把自定义的数据放到query string,POST把自定义的数据放到body
2)语义区别:GET一般用于“获取数据”,POST一般用于提交数据
3)幂等性:GET一般会设计成幂等的,POST请求一般不要求设计成幂等
如:查看操作是幂等的,转账就不是幂等的
4)可缓存:GET一般会被缓存,GET一般不能被缓存
(5)用代码构造HTTP请求的方法
1)直接在浏览器中输入URL(构造了一个GET)
2)使用form表单(可以构造GET和POST)
3)使用ajax(可以构造各种请求)
4)通过Java代码,基于其中的Socket来构造一个HTTP请求
5.报头里面的键值对
1)Host描述了主机的地址/端口号,地址可以是域名,也可以是IP,Host和URL中表示的信息是重叠的(一般来讲)
Host:v.souhu.vip
2)Content-length表示body的长度,单位字节,如果没有body,就可以没有这个
3)Content-Type 表示body中的数据格式的类型
不能直接传输二进制数据,要进行编码
multlpart/form-data主要是用来上传文件的
boundary 表示边界,要上传的数据从哪里开始,到哪里结束
application/json 非常常用的数据组织格式
4)User-Agent描述了浏览器+系统的版本信息
5)Referer表示当前这个页面是从哪个页面跳转过来的,在浏览器中输入URL/点击收藏夹打开的界面是没有Referer的
6)Cookie 的值是一个字符串(自己定义的),相当于浏览器这边进行本地存储的一种机制(可以存一些信息),比如用户的身份信息,解决了浏览器存储不访问磁盘的问题,提高了安全性。还有一个特点是能够在后续请求服务的时候,自动的把之前保存的值给带上。比如,用户成功登录了以后(登录请求中未带Cookie),服务器把身份信息通过Cookie返回到浏览器这边了,进行其他操作时请求中就自动带着Cookie,服务器接收到信息后就知道是哪个用户了。
现在不完全依赖Cookie了
LocalStorage . HTML5
开始引入的一个机制,浏览器支持一种"键值对”方式来进行存储,通过JS提供了一组API.来操作数据,这里保存的数据就会持久的存储下去。
IndexDB
比较新的浏览器才支持的机制,浏览器内部集成了一个"数据库”支持类似于SQL的方式来进行操作数据。
6.状态码
表示了这次请求的“结果”
(1)
2xx 请求成功
3xx 重定向
4xx 客户端错误
5xx 服务器错误
(2)具体特殊状态码
200 请求成功
302 重定向,访问的页面自动跳转到新页面
403 访问被拒绝,密码错误之类的,因为要校验
404 请求的资源服务器没有
500 服务器挂了
7.ajax
这种方式是当下比较主流的服务器提交数据的方式,异步机制可以在渲染界面的同时进行网络请求。在浏览器中可以发起多个ajax请求的。
四、HTTP和HTTPS关系
1.HTTP端口号:80 HTTPS端口号:443
2.HTTP是明文传输的,HTTPS是HTTP基础上引入了一个加密层(SST/TLS)
五、HTTPS
HTTPS(开头带了锁形状)传输过程(其实描述的是SST/TSL握手的过程)
1.客户端先从服务器获取到证书,证书中包含了公钥
2.客户端对证书进行校验
3.客户端生成一个对称密钥,使用公钥对对称密钥加密,发送给服务器
4.服务器得到这个请求之后用私钥解密,得到对称密钥。
5.客户端发出后续的请求,后续请求都是使用这个对称密钥加密的。
6.收到的数据也都是使用这个对称密钥解密的
说明:对称密钥加密解密使用同一个密钥(成本低)
非对称加密 加密解密使用不同的密钥(成本高)
用的是两者结合的操作